Giả sử tôi đang xây dựng một blog mà tôi muốn có bài viết và bình luận. Vì vậy, tôi tạo hai bảng, bảng 'bài đăng' với cột 'id' số nguyên tự động và bảng 'nhận xét' có khóa ngoại 'post_id'.
Sau đó, tôi muốn chạy cái có lẽ sẽ là truy vấn phổ biến nhất của tôi, đó là lấy một bài đăng và tất cả các bình luận của nó. Là khá mới đối với cơ sở dữ liệu quan hệ, cách tiếp cận có vẻ rõ ràng nhất đối với tôi là viết một truy vấn trông giống như:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Điều này sẽ cung cấp cho tôi id và nội dung của bài đăng mà tôi muốn, cùng với tất cả các hàng nhận xét có liên quan được đóng gói gọn gàng trong một mảng (một đại diện lồng nhau như bạn sử dụng trong JSON). Tất nhiên, SQL và cơ sở dữ liệu quan hệ không hoạt động như thế này và gần nhất họ có thể nhận được là tham gia giữa 'bài đăng' và 'nhận xét' sẽ trả lại nhiều dữ liệu trùng lặp không cần thiết (với cùng một thông tin bài đăng được lặp lại trong mỗi hàng), có nghĩa là thời gian xử lý được dành cả trên cơ sở dữ liệu để kết hợp tất cả lại với nhau và trên ORM của tôi để phân tích và hoàn tác tất cả.
Ngay cả khi tôi hướng dẫn ORM của mình háo hức tải các bình luận của bài đăng, thì cách tốt nhất là gửi một truy vấn cho bài đăng, sau đó truy vấn thứ hai để lấy tất cả các bình luận, sau đó đặt chúng ở phía khách hàng cũng không hiệu quả.
Tôi hiểu rằng cơ sở dữ liệu quan hệ là công nghệ đã được chứng minh (địa ngục, chúng lớn hơn tôi) và rằng đã có rất nhiều nghiên cứu được đưa vào chúng trong nhiều thập kỷ và tôi chắc chắn có lý do thực sự tốt tại sao chúng (và Tiêu chuẩn SQL) được thiết kế để hoạt động theo cách họ làm, nhưng tôi không chắc tại sao cách tiếp cận tôi nêu ở trên là không thể. Nó dường như là cách đơn giản và rõ ràng nhất để thực hiện một trong những mối quan hệ cơ bản nhất giữa các hồ sơ. Tại sao cơ sở dữ liệu quan hệ không cung cấp một cái gì đó như thế này?
(Tuyên bố miễn trừ trách nhiệm: Tôi chủ yếu viết các ứng dụng web bằng cách sử dụng kho dữ liệu Rails và NoQuery, nhưng gần đây tôi đã dùng thử Postgres và tôi thực sự thích nó rất nhiều.
Tôi không hỏi làm thế nào để tối ưu hóa ứng dụng Rails, hay cách khắc phục vấn đề này trong một cơ sở dữ liệu cụ thể. Tôi đang hỏi tại sao tiêu chuẩn SQL hoạt động theo cách này khi nó có vẻ trái ngược và lãng phí đối với tôi. Phải có một số lý do lịch sử tại sao các nhà thiết kế ban đầu của SQL muốn kết quả của họ trông như thế này.