บริษัทแห่งหนึ่งต้องการเก็บข้อมูลลูกค้า (ชื่อ ที่อยู่ เบอร์โทร วันเกิด) และข้อมูลการเช็คอินแต่ละครั้ง (วันเข้า วันออก หมายเลขห้อง จำนวนแขก) โดยต้องการติดตามประวัติที่อยู่และเบอร์โทรของลูกค้าที่เปลี่ยนแปลงไปตามเวลา ควรออกแบบฐานข้อมูลอย่างไรจึงจะเหมาะสมที่สุด
กแยกตาราง Customer และ CheckIn โดยตาราง Customer เก็บข้อมูลปัจจุบัน และสร้างตาราง CustomerHistory เพื่อบันทึกประวัติการเปลี่ยนแปลงที่อยู่และเบอร์โทร พร้อมวันที่มีผล
ขเก็บข้อมูลลูกค้าและการเช็คอินไว้ในตารางเดียวกัน โดยเพิ่มคอลัมน์ที่อยู่เก่าและเบอร์โทรเก่าไว้ในตารางนั้น เพื่อให้ค้นหาข้อมูลได้สะดวกในครั้งเดียว
คสร้างตาราง Customer เพียงตารางเดียว แล้วเพิ่มคอลัมน์ Version เพื่อแยกแถวข้อมูลลูกค้าแต่ละเวอร์ชัน และเชื่อมโยงกับการเช็คอินผ่านคอลัมน์ CustomerID เท่านั้น
งใช้ตาราง CheckIn เก็บข้อมูลลูกค้าซ้ำทุกครั้งที่มีการเช็คอิน เพื่อให้แต่ละรายการเช็คอินมีข้อมูลลูกค้าครบถ้วนและไม่ต้องอ้างอิงตารางอื่น
เฉลยอธิบาย
การออกแบบที่ถูกต้องคือการแยกตาราง Customer สำหรับข้อมูลปัจจุบัน ตาราง CheckIn สำหรับการเช็คอิน และตาราง CustomerHistory สำหรับติดตามการเปลี่ยนแปลงประวัติ ซึ่งเป็นแนวทาง Slowly Changing Dimension (SCD Type 2) ที่ช่วยให้ติดตามข้อมูลเดิมได้โดยไม่สูญหาย ส่วนตัวเลือก B ฝ่าฝืนหลัก Normalization, ตัวเลือก C มีปัญหาเรื่อง Foreign Key กับ CheckIn เนื่องจากลูกค้าคนเดียวมีหลาย Version, และตัวเลือก D ทำให้เกิดข้อมูลซ้ำซ้อนอย่างมาก