Supponiamo che sto costruendo un blog che voglio avere post e commenti. Creo quindi due tabelle, una tabella "post" con una colonna "id" intero con incremento automatico e una tabella "commenti" con una chiave esterna "post_id".
Quindi voglio eseguire quella che probabilmente sarà la mia query più comune, ovvero recuperare un post e tutti i suoi commenti. Essendo piuttosto nuovo nei database relazionali, l'approccio che mi sembra più ovvio è scrivere una query che assomiglierebbe a qualcosa:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Quale 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 annidata come si userebbe in JSON). Naturalmente, i database SQL e relazionali non funzionano in questo modo, e il più vicino possibile è quello di fare un join tra "post" e "commenti" che restituirà un sacco di inutili duplicazioni di dati (con le stesse informazioni postate ripetute in ogni riga), il che significa che il tempo di elaborazione viene speso sia sul database per mettere tutto insieme che sul mio ORM per analizzare e annullare tutto.
Anche se istruisco il mio ORM a caricare avidamente i commenti del post, il meglio che faremo è di inviare una query per il post, e poi una seconda query per recuperare tutti i commenti, e poi metterli insieme client- lato, che è anche inefficiente.
Capisco che i database relazionali sono una tecnologia collaudata (diavolo, sono più vecchi di me) e che c'è stata una grande quantità di ricerche nel corso dei decenni, e sono sicuro che ci sia davvero una buona ragione per cui (e lo standard SQL) sono progettati per funzionare come fanno, ma non sono sicuro del motivo per cui l'approccio che ho delineato sopra non è possibile. Mi sembra il modo più semplice e ovvio per implementare una delle relazioni più basilari tra i record. Perché i database relazionali non offrono qualcosa di simile?
(Disclaimer: per lo più scrivo webapp usando i datastore di Rails e NoSQL, ma recentemente ho provato Postgres e mi piace molto, non intendo attaccare i database relazionali, sono solo perplesso. )
Non sto chiedendo come ottimizzare un'app Rails o come risolvere il problema in un determinato database. Sto chiedendo perché lo standard SQL funziona in questo modo quando sembra controintuitivo e dispendioso per me. Ci deve essere una ragione storica per cui i designer originali di SQL volevano che i loro risultati assomigliassero a questo.