Припустимо, я будую блог, який хочу мати публікації та коментарі. Таким чином я створюю дві таблиці: таблицю 'posts' зі стовпцем 'id', що автоматично збільшується, та таблицю «коментарів», що має зовнішній ключ «post_id».
Тоді я хочу запустити те, що, мабуть, буде моїм найпоширенішим запитом, а саме - отримання публікації та всіх її коментарів. Будучи досить новим у реляційних базах даних, підхід, який видається мені найбільш очевидним, - це написати запит, який би виглядав приблизно так:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Що дасть мені ідентифікатор та зміст публікації, яку я хочу, разом із усіма відповідними рядками коментарів, акуратно упакованими у масив (вкладене представлення, як ви б використовували в JSON). Звичайно, SQL і реляційні бази даних не працюють так, і найближче, що вони можуть отримати, - це з'єднання між "повідомленнями" і "коментарями", які повернуть багато непотрібного дублювання даних (при повторенні тієї ж інформації публікації у кожному рядку), що означає, що час обробки витрачається як на базу даних, щоб зібрати все це разом, так і на моєму ORM, щоб проаналізувати та скасувати все.
Навіть якщо я доручу своєму ORM нетерпляче завантажувати коментарі допису, найкраще це зробити - це відправити один запит на публікацію, а потім другий запит, щоб отримати всі коментарі, а потім скласти їх разом із клієнтом, який також є неефективним.
Я розумію, що реляційні бази даних - це перевірена технологія (пекло, вони старші за мене), і що за ці десятиліття було проведено багато досліджень, і я впевнений, що існує справді вагома причина, чому вони (і Стандарт SQL) призначені для того, щоб функціонувати так, як вони роблять, але я не впевнений, чому підхід, який я окреслював вище, не можливий. Мені здається, це найпростіший і очевидний спосіб втілити один з найосновніших зв’язків між записами. Чому реляційні бази даних не пропонують щось подібне?
(Відмова: Я в основному пишу веб-сторінки за допомогою Rails і NoSQL сховищ даних, але останнім часом я випробовував Postgres, і мені це дуже подобається. Я не хочу атакувати реляційні бази даних, я просто здивований.)
Я не запитую, як оптимізувати додаток Rails чи як зламати цю проблему в певній базі даних. Я запитую, чому стандарт SQL працює таким чином, коли він здається мені протизаконним та марнотратним. Має бути якась історична причина, чому оригінальні розробники SQL хотіли, щоб їх результати виглядали так.