Les migrations ORM. On s’y fie tous à fond, hein ? Prisma, Drizzle — ils promettent un trajet sans heurts du code à la base, sans prise de tête SQL. Mais la semaine dernière, un dev a claqué quatre heures sur une API qui patine, pour finir par débusquer le coupable : une clé étrangère sans index. Coup de théâtre.
On attendait de la magie. Vous branchez vos relations TypeScript, vous lancez migrate, et hop. Le lien Users-Orders ? Géré. Les perfs ? Leur avis, pas le vôtre. Sauf que ça devient le problème de tout le monde quand les tables dépassent le million de lignes et que les requêtes rampent comme à l’époque du modem 56k.
Rien de neuf sous le soleil. Dès 2005, les utilisateurs de Hibernate tombaient dans le même panneau. Les ORM abstrayent la douleur, OK, mais au prix de goulots d’étranglement invisibles. L’histoire se répète : les éditeurs misent sur la productivité des devs au détriment de la réalité des bases. Et qui profite ? Les boîtes ORM, avec leurs docs impeccables et leurs offres enterprise, pendant que votre facture cloud explose.
J’ai passé 4 heures la semaine dernière à déboguer un endpoint API lent. Le coupable ? Un index manquant sur une clé étrangère que mon ORM avait « obligeamment » masqué lors d’une migration de schéma.
Bien vu. Cette citation tape dans le mille. Les ORM ajoutent la contrainte de clé étrangère — ALTER TABLE “orders” ADD CONSTRAINT “fk_user” FOREIGN KEY (“user_id”) REFERENCES “users”(“id”); — mais zappent le CREATE INDEX “idx_orders_user_id” ON “orders”(“user_id”);. Pourquoi ? Parce que l’index, c’est un « détail d’implémentation », qu’ils disent. Balivernes. Sans ça, Postgres fait un scan séquentiel de toute la table Orders à chaque requête utilisateur. Ça passe à 1 000 lignes. Catastrophe à 10 millions.
Les devs scrutent leur schema.ts, pas la vraie base. Les relations ? Enterrées dans le code. Pas de vue d’ensemble. Pas d’alertes. Boîte noire au carré.
Pourquoi les migrations ORM zappent-elles les index à chaque fois ?
Par paresse des defaults, voilà pourquoi. Le moteur de migration de Prisma parie que vous optimiserez plus tard — ou jamais. Drizzle ? Même topo. Ils génèrent la contrainte pour l’intégrité des données, mais les index, c’est votre boulot. C’est comme construire une autoroute sans bandes d’arrêt d’urgence : ça roule jusqu’à ce que le trafic sature.
Et le bla du marketing ? « Gestion déclarative du schéma ! » Mignon. Mais ça occulte la vérité relationnelle. L’épine dorsale de votre app — tables, jointures, scans — disparaît dans des fichiers JS. J’ai vu des équipes déployer en prod, pavoiser sur les déploiements rapides, puis voir la latence bondir de 100 fois. Qui est surpris ?
Mon avis perso : ça rappelle le crash du hype NoSQL en 2012. Tout le monde a largué les relations pour « scaler d’abord », perdu l’ACID, regretté amèrement. Les ORM, c’est la version relationnelle : scaler après, prier plus fort.
Tiger SQL entre en scène. Visualiseur Postgres open source, en navigateur. Collez votre schéma ou connectez la base, et bim : ERD avec relations tracées. L’IA signale les index manquants, les requêtes lentes. Pas de chichi, pas de paywall. Forkez sur GitHub.
Ça change la donne ? Un peu. C’est un pansement sur la flemme des ORM. Mais bon sang, ça rend l’audit des schémas indolore. Lancez-le en local, repérez les failles avant que la prod implose.
Tiger SQL va-t-il sauver votre équipe de l’enfer ORM ?
Peut-être. Gratuit, léger — tourne dans le navigateur. ERD visuels ? Instantanés. Optimisation IA ? Alerte sur les index B-Tree manquants, colonnes inutiles, plans de requêtes. Zéro vendor lock.
Soyons sérieux. Des outils comme ça surgissent tous les ans. DbSchema, extensions pgAdmin — même promesse. Le truc de Tiger ? IA futée sans la facture OpenAI, et pureté open source. Personne ne s’en met plein les poches ; c’est un gratte-démangeaison de dev.
Testé en live. Schéma Prisma balancé : ERD qui illumine user_id sans index. Suggestions de fix en secondes. Vo