สมมติว่าฉันกำลังสร้างบล็อกที่ฉันต้องการโพสต์และแสดงความคิดเห็น ดังนั้นฉันจึงสร้างสองตารางตาราง 'โพสต์' ที่มีคอลัมน์ 'id' จำนวนเต็มโดยอัตโนมัติและตาราง 'ความคิดเห็น' ที่มีคีย์ต่างประเทศ 'post_id'
จากนั้นฉันต้องการเรียกใช้สิ่งที่อาจเป็นคิวรีที่พบบ่อยที่สุดของฉันซึ่งก็คือเรียกโพสต์และความคิดเห็นทั้งหมด ค่อนข้างใหม่สำหรับฐานข้อมูลเชิงสัมพันธ์วิธีที่ปรากฏชัดเจนที่สุดสำหรับฉันคือการเขียนแบบสอบถามที่มีลักษณะดังนี้:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
ซึ่งจะให้ ID และเนื้อหาของโพสต์ที่ฉันต้องการพร้อมกับแถวความคิดเห็นที่เกี่ยวข้องทั้งหมดที่บรรจุอย่างเป็นระเบียบในอาร์เรย์ (การแสดงแบบซ้อนที่คุณต้องการใช้ใน JSON) แน่นอนว่า SQL และฐานข้อมูลเชิงสัมพันธ์ไม่ทำงานเช่นนี้และสิ่งที่ใกล้เคียงที่สุดที่พวกเขาจะได้รับก็คือการเข้าร่วมระหว่าง 'โพสต์' และ 'ความคิดเห็น' ซึ่งจะส่งคืนข้อมูลซ้ำซ้อนที่ไม่จำเป็นจำนวนมาก ในทุก ๆ แถว) ซึ่งหมายความว่าเวลาในการประมวลผลจะถูกใช้ทั้งในฐานข้อมูลเพื่อรวมเข้าด้วยกันและบน ORM ของฉันเพื่อแยกวิเคราะห์และเลิกทำทั้งหมด
แม้ว่าฉันจะสั่งให้ ORM ของฉันโหลดความคิดเห็นของโพสต์อย่างกระตือรือร้น แต่สิ่งที่ดีที่สุดก็คือการจัดส่งหนึ่งแบบสอบถามสำหรับโพสต์และจากนั้นแบบสอบถามที่สองเพื่อดึงความคิดเห็นทั้งหมดจากนั้นรวบรวมพวกเขาเข้าด้วยกันฝั่งไคลเอ็นต์ ยังไม่มีประสิทธิภาพ
ฉันเข้าใจว่าฐานข้อมูลเชิงสัมพันธ์เป็นเทคโนโลยีที่ได้รับการพิสูจน์แล้ว (นรกพวกเขามีอายุมากกว่าฉัน) และมีการวิจัยมากมายที่รวบรวมไว้ในทศวรรษที่ผ่านมาและฉันแน่ใจว่ามีเหตุผลที่ดีจริงๆที่ทำให้พวกเขา (และ มาตรฐาน SQL) ได้รับการออกแบบให้ทำงานในแบบที่พวกเขาทำ แต่ฉันไม่แน่ใจว่าทำไมวิธีที่ฉันระบุไว้ข้างต้นเป็นไปไม่ได้ ดูเหมือนว่าฉันจะเป็นวิธีที่ง่ายและชัดเจนที่สุดในการสร้างความสัมพันธ์ขั้นพื้นฐานที่สุดระหว่างบันทึก ทำไมฐานข้อมูลเชิงสัมพันธ์ไม่เสนออะไรแบบนี้?
(ข้อจำกัดความรับผิดชอบ: ฉันมักจะเขียน webapps โดยใช้ Rails และ NoSQL datastores แต่เมื่อเร็ว ๆ นี้ฉันได้ลองใช้ Postgres และฉันชอบมันมากจริง ๆ ฉันไม่ได้ตั้งใจจะโจมตีฐานข้อมูลเชิงสัมพันธ์ฉันแค่สับสน)
ฉันไม่ได้ถามวิธีเพิ่มประสิทธิภาพแอพ Rails หรือวิธีแฮ็กวิธีแก้ปัญหานี้ในฐานข้อมูลเฉพาะ ฉันถามว่าทำไมมาตรฐาน SQL ทำงานด้วยวิธีนี้เมื่อดูเหมือนว่าใช้ง่ายและสิ้นเปลืองกับฉัน ต้องมีเหตุผลทางประวัติศาสตร์ว่าทำไมผู้ออกแบบดั้งเดิมของ SQL ต้องการให้ผลลัพธ์ของพวกเขาเป็นเช่นนี้