Supponiamo che stia costruendo un blog in cui voglio avere post e commenti. Quindi creo due tabelle, una tabella "post" con una colonna "id" integer autoincrementante e una tabella "commenti" con una chiave esterna "post_id".
Quindi voglio eseguire quella che sarà probabilmente la mia query più comune, che è quella di recuperare un post e tutti i suoi commenti. Essendo piuttosto nuovo nei database relazionali, l'approccio che mi sembra più ovvio è quello di scrivere una query che assomiglierebbe a:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Il che mi darebbe l'id e il contenuto del post che desidero, insieme a tutte le righe di commento pertinenti impacchettate ordinatamente in un array (una rappresentazione nidificata come quella che useresti in JSON). Naturalmente, i database SQL e relazionali non funzionano in questo modo, e il più vicino che possono ottenere è unire tra "post" e "commenti" che restituiranno molti inutili duplicati di dati (con le stesse informazioni sui post ripetute in ogni riga), il che significa che il tempo di elaborazione viene speso sia nel database per mettere tutto insieme sia nel mio ORM per analizzare e annullare tutto.
Anche se chiedo al mio ORM di caricare con entusiasmo i commenti del post, il meglio che farà è inviare una query per il post, quindi una seconda query per recuperare tutti i commenti e quindi metterli insieme sul lato client, che è anche inefficiente.
Capisco che i database relazionali sono una tecnologia collaudata (l'inferno, sono più vecchi di me) e che ci sono state molte ricerche condotte nel corso dei decenni e sono sicuro che ci sia davvero una buona ragione per cui loro (e il SQL standard) sono progettati per funzionare nel modo in cui funzionano, ma non sono sicuro del perché l'approccio che ho descritto sopra non sia possibile. Mi sembra il modo più semplice ed ovvio per implementare una delle relazioni più elementari tra i record. Perché i database relazionali non offrono qualcosa del genere?
(Dichiarazione di non responsabilità: scrivo principalmente webapps usando Rails e NoSQL datastore, ma recentemente ho provato Postgres e in realtà mi piace molto. Non intendo attaccare i database relazionali, sono solo perplesso.)
Non sto chiedendo come ottimizzare un'app Rails o come aggirare il problema in un determinato database. Mi chiedo perché lo standard SQL funzioni in questo modo quando mi sembra controintuitivo e dispendioso. Ci deve essere una ragione storica per cui i progettisti originali di SQL volevano che i loro risultati fossero così.