ว่าด้วย "ความสัมพันธ์"

ไม่รู้เข้าใจถูกหรือผิด …

โดยปกติสำหรับการเขียนโปรแกรมทำงานร่วมกับฐานข้อมูล โดยเฉพาะอย่างยิ่งระบบที่สามารถเข้าถึง “ความสัมพันธ์” (relationship) ของข้อมูลได้ เช่น Ruby on Rails หรือ PHP frameworks ต่างๆ

สมมติว่าอย่างนี้ …

Supplier->Product->PO RelationshipSupplier->Product->PO Relationship

แล้วในโปรแกรมก็บอกเอาไว้ว่า …

[php] Supplier->hasMany(‘PurchaseOrder’); [/php]

และ …

[php] PurchaseOrder->belongsTo(‘Supplier’); [/php]

แล้วถ้าสมมติว่าเราต้องการถามหาข้อมูลของ PO ทั้งหมด เราก็อาจจะบอกว่า

[php] $po = PurchaseOrder::all(); [/php]

ทีนี้ระหว่าง output ถ้าเราต้องการแสดง supplier ของแต่ละรายการด้วย เราก็สามารถบอกว่า

[php] echo $po->supplier->name; [/php]

ซึ่งโปรแกรมก็จะไปมองหาเองจาก relationship ที่กำหนดไว้แล้ว

แต่คำถามคือ การเขียนแบบนี้มันก็กลายเป็นว่า ในแต่ละบรรทัดของการแสดงผล ก็ต้องมีการถามเข้าไปที่ฐานข้อมูลเพื่อหยิบชื่อของ supplier ทุกครั้ง กลายเป็นว่าจะเกิด query ซ้ำๆ หลายๆ อัน เช่นจากตัวอย่างข้างบนก็จะเกิดว่า

[sql] SELECT * from purchase_orders; [/sql] เพื่อถามหา PO ทั้งหมด

[sql] SELECT * from suppliers WHERE id = purchase_order.supplier_id; [/sql] เพื่อถามหา supplier ของ PO แต่ละรายการ และวนข้อ 2 จนกว่าจะหมดรายการ เท่ากับว่าต้องมี query ทั้งหมด n (จำนวนรายการ PO) + 1

ทีนี้ถ้าเอาใหม่ เขียนตั้งแต่ถามหา PO เลยว่า ให้ไป join ตาราง suppliers มาด้วย เป็นว่า

[php] $po = PurchaseOrder::all()->join(‘suppliers’, ‘supplier_id’, ‘=’, ‘suppliers.id’); [/php]

ก็จะเกิด query แค่หนึ่งอันที่ว่า

[sql] SELECT * FROM purchase_orders INNER JOIN suppliers ON supplier_id = suppliers.id; [/sql]

ลดจำนวนของ query ไปเหลือ 1 … มันไม่ดีกว่าเหรอ?

(แต่ก็แปลว่า ไม่จำเป็นต้องกำหนด relationship ใน database เพราะว่า relationship ถูกกำหนดในเวลาเขียน query)

หรือไม่ได้เขียนนานมาก จนลืม concept?