Angenommen, ich erstelle ein Blog, in dem ich Beiträge und Kommentare veröffentlichen möchte. Also erstelle ich zwei Tabellen, eine 'posts'-Tabelle mit einer automatisch inkrementierenden Integer-ID-Spalte und eine' comments'-Tabelle mit dem Fremdschlüssel 'post_id'.
Dann möchte ich ausführen, was wahrscheinlich meine häufigste Abfrage ist, nämlich das Abrufen eines Posts und aller seiner Kommentare. Da relationale Datenbanken noch relativ neu sind, erscheint es mir am offensichtlichsten, eine Abfrage zu schreiben, die ungefähr so aussieht:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Das würde mir die ID und den Inhalt des Posts geben, den ich möchte, zusammen mit allen relevanten Kommentarzeilen, die ordentlich in ein Array gepackt sind (eine verschachtelte Darstellung, wie Sie sie in JSON verwenden würden). Natürlich funktionieren SQL-Datenbanken und relationale Datenbanken nicht so, und das Beste, was sie erreichen können, ist eine Verknüpfung zwischen "Posts" und "Kommentaren", die eine Menge unnötiger Duplikate von Daten zurückgibt (wobei dieselben Post-Informationen wiederholt werden in jeder Zeile), was bedeutet, dass die Verarbeitungszeit sowohl für die Datenbank aufgewendet wird, um alles zusammenzusetzen, als auch für meinen ORM, um alles zu analysieren und rückgängig zu machen.
Selbst wenn ich meinen ORM anweise, die Kommentare des Posts eifrig zu laden, ist es am besten, eine Abfrage für den Post und dann eine zweite Abfrage zum Abrufen aller Kommentare zu senden und sie dann clientseitig zusammenzustellen ist auch ineffizient.
Ich verstehe, dass relationale Datenbanken bewährte Technologie sind (zum Teufel, sie sind älter als ich), und dass im Laufe der Jahrzehnte eine Menge Forschung in sie gesteckt wurde, und ich bin mir sicher, dass es einen wirklich guten Grund gibt, warum sie (und die) SQL-Standard) funktionieren so, wie sie es tun, aber ich bin mir nicht sicher, warum der oben beschriebene Ansatz nicht möglich ist. Es scheint mir die einfachste und naheliegendste Möglichkeit zu sein, eine der grundlegendsten Beziehungen zwischen Datensätzen zu implementieren. Warum bieten relationale Datenbanken so etwas nicht an?
(Haftungsausschluss: Ich schreibe hauptsächlich Webapps mit Rails und NoSQL-Datenspeichern, aber kürzlich habe ich Postgres ausprobiert und es gefällt mir sehr gut. Ich will keine relationalen Datenbanken angreifen, ich bin nur ratlos.)
Ich frage nicht, wie ich eine Rails-App optimieren oder mich in einer bestimmten Datenbank um dieses Problem kümmern soll. Ich frage mich, warum der SQL-Standard so funktioniert, wenn er mir nicht intuitiv und verschwenderisch erscheint. Es muss einen historischen Grund geben, warum die ursprünglichen Designer von SQL wollten, dass ihre Ergebnisse so aussehen.