Załóżmy, że tworzę bloga, w którym chcę mieć posty i komentarze. Tworzę więc dwie tabele, tabelę „posty” z kolumną „id” z automatyczną inkrementacją liczb całkowitych i tabelę „komentarzy” z kluczem obcym „post_id”.
Następnie chcę uruchomić to, co prawdopodobnie będzie moim najczęstszym zapytaniem, czyli pobrać post i wszystkie jego komentarze. Będąc dość nowym w relacyjnych bazach danych, podejście, które wydaje mi się najbardziej oczywiste, polega na napisaniu zapytania, które wyglądałoby mniej więcej tak:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Który dałby mi identyfikator i treść posta, który chcę, wraz ze wszystkimi odpowiednimi wierszami komentarzy spakowanymi starannie w tablicy (zagnieżdżona reprezentacja, taka jak w JSON). Oczywiście SQL i relacyjne bazy danych nie działają w ten sposób, a najbliższe, co mogą uzyskać, to połączenie między „postami” i „komentarzami”, które zwrócą wiele niepotrzebnego powielania danych (z powtarzaniem tych samych informacji o postach w każdym wierszu), co oznacza, że czas przetwarzania jest spędzany zarówno w bazie danych, aby zebrać wszystko razem, jak i na mojej ORM, aby przeanalizować i cofnąć wszystko.
Nawet jeśli poinstruuję mój ORM, aby chętnie ładował komentarze do posta, najlepiej będzie wysłać jedno zapytanie do posta, a następnie drugie zapytanie, aby pobrać wszystkie komentarze, a następnie połączyć je po stronie klienta, co jest również nieefektywny.
Rozumiem, że relacyjne bazy danych są sprawdzoną technologią (do diabła, są starsze ode mnie) i że przez dziesięciolecia przeprowadzono w nich mnóstwo badań i jestem pewien, że istnieje naprawdę dobry powód, dla którego oni (i Standard SQL) są zaprojektowane tak, aby działały tak, jak działają, ale nie jestem pewien, dlaczego opisane powyżej podejście nie jest możliwe. Wydaje mi się, że jest to najprostszy i najbardziej oczywisty sposób na wdrożenie jednej z najbardziej podstawowych relacji między rekordami. Dlaczego relacyjne bazy danych nie oferują czegoś takiego?
(Uwaga: głównie piszę aplikacje internetowe przy użyciu magazynów danych Rails i NoSQL, ale ostatnio wypróbowałem Postgres i bardzo mi się podoba. Nie chcę atakować relacyjnych baz danych, po prostu jestem zakłopotany.)
Nie pytam, jak zoptymalizować aplikację Rails ani jak zhakować ten problem w konkretnej bazie danych. Pytam, dlaczego standard SQL działa w ten sposób, gdy wydaje mi się sprzeczny z intuicją i marnotrawstwem. Musi być jakiś historyczny powód, dla którego oryginalni projektanci SQL chcieli, aby ich wyniki wyglądały tak.