ระบบห้างสรรพสินค้าต้องการออกแบบฐานข้อมูลสำหรับโปรแกรมสะสมแต้ม ลูกค้าสะสมแต้มได้จากทุกการซื้อ และสามารถแลกแต้มได้ ควรออกแบบการติดตามแต้มอย่างไรให้มีประสิทธิภาพสูงสุด
กเก็บประวัติการซื้อทั้งหมดในคอลัมน์ Text เดียวในตาราง Customer
ขเก็บ TotalPoints เป็นตัวเลขเดียวในตาราง Customer และอัปเดตทุกครั้งที่มีการซื้อหรือแลก
คสร้างตาราง PointTransaction ที่บันทึกแต่ละรายการ (ประเภท: สะสม/แลก, จำนวนแต้ม, วันที่, อ้างอิง OrderID) และคำนวณยอดแต้มรวมจากการ SUM
งไม่ต้องเก็บประวัติ ให้เก็บเฉพาะยอดแต้มปัจจุบันของลูกค้า
เฉลยอธิบาย
การสร้างตาราง PointTransaction แบบ Ledger (บัญชีรายการ) เป็นแนวปฏิบัติที่ดีที่สุดเพราะสามารถตรวจสอบประวัติย้อนหลังได้ ป้องกันข้อผิดพลาดจากการ Update พร้อมกัน (Concurrency Issues) และสามารถ Audit ได้ ตัวเลือก A มีความเสี่ยงสูงเพราะถ้า Update ผิดพลาดจะไม่มีประวัติให้ตรวจสอบ ตัวเลือก C ละเมิด 1NF ตัวเลือก D ทำให้ไม่สามารถตรวจสอบหรือแก้ไขข้อผิดพลาดได้