Supposons que je construise un blog pour lequel je souhaite avoir des posts et des commentaires. Je crée donc deux tables, une table 'posts' avec une colonne 'id' entier auto-incrémentée et une table 'commentaires' avec une clé étrangère 'post_id'.
Ensuite, je veux exécuter ce qui sera probablement ma requête la plus courante, qui consiste à récupérer un message et tous ses commentaires. Étant assez nouveau dans les bases de données relationnelles, l’approche qui me semble la plus évidente consiste à écrire une requête qui ressemblerait à quelque chose comme:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Ce qui me donnerait l'identifiant et le contenu de la publication que je veux, ainsi que toutes les lignes de commentaires pertinentes, parfaitement regroupées dans un tableau (une représentation imbriquée comme celle que vous utiliseriez dans JSON). Bien sûr, SQL et les bases de données relationnelles ne fonctionnent pas ainsi, et le plus proche possible est de faire une jointure entre 'posts' et 'comments' qui renverra beaucoup de duplications inutiles de données (avec les mêmes informations postées répétées). dans chaque ligne), ce qui signifie que le temps de traitement est consacré à la fois à la base de données pour tout rassembler et à mon ORM pour analyser et annuler le tout.
Même si j'ordonne à mon ORM de charger avec empressement les commentaires de l'article, le mieux consiste à envoyer une requête pour l'article, puis une seconde requête pour extraire tous les commentaires, puis de les assembler côté client, qui est également inefficace.
Je comprends que les bases de données relationnelles sont une technologie éprouvée (diable, elles sont plus vieilles que moi), et qu’elles ont fait l’objet de nombreuses recherches au cours des décennies, et je suis sûr qu’il ya une très bonne raison pour laquelle elles (et le SQL) sont conçus pour fonctionner comme ils le font, mais je ne sais pas pourquoi la démarche que je viens de décrire est impossible. Cela me semble être le moyen le plus simple et le plus évident d'implémenter l'une des relations les plus fondamentales entre les enregistrements. Pourquoi les bases de données relationnelles n'offrent-elles pas quelque chose comme ça?
(Avertissement: j'écris principalement des applications Web à l'aide de bases de données Rails et NoSQL, mais j'ai récemment essayé Postgres et je l'aime beaucoup. Je ne veux pas attaquer les bases de données relationnelles, je suis perplexe.)
Je ne vous demande pas comment optimiser une application Rails ou comment résoudre ce problème dans une base de données particulière. Je demande pourquoi le standard SQL fonctionne de cette façon quand il me semble contre-intuitif et inutile. Il doit exister une raison historique pour laquelle les concepteurs originaux de SQL voulaient que leurs résultats ressemblent à ceci.