ในการวิเคราะห์ระบบบัญชีของบริษัท พบตาราง Invoice ที่มี: InvoiceID, CustomerID, CustomerAddress, ItemList, TotalAmount โดย CustomerAddress เป็นที่อยู่ ณ เวลาออกใบแจ้งหนี้ และ ItemList เป็นรายการสินค้าคั่นด้วยจุลภาค ปัญหาหลักของการออกแบบนี้คืออะไร
กTotalAmount ควรคำนวณจาก View ไม่ควรเก็บในตาราง
ขItemList ละเมิด 1NF เพราะเก็บหลายค่าในคอลัมน์เดียว ทำให้ค้นหาและจัดการแต่ละรายการสินค้าได้ยาก
คตารางนี้ถูกต้องสมบูรณ์ ไม่มีปัญหาใดๆ
งCustomerAddress ควรเป็น NULL เพราะไม่จำเป็นต้องเก็บ
เฉลยอธิบาย
ปัญหาหลักที่ร้ายแรงที่สุดคือ ItemList ที่เก็บหลายรายการสินค้าในคอลัมน์เดียว ซึ่งละเมิด 1NF เพราะแต่ละคอลัมน์ต้องมีค่าเดียว (Atomic Value) การเก็บแบบนี้ทำให้ไม่สามารถ Query หาสินค้าชิ้นหนึ่งได้ง่าย ไม่สามารถคำนวณจำนวนสินค้าได้ และยากต่อการอัปเดต ควรแยกออกเป็นตาราง InvoiceDetail ที่มี InvoiceDetailID, InvoiceID, ProductID, Quantity, UnitPrice ส่วน CustomerAddress ที่เก็บไว้ ณ เวลาออกใบแจ้งหนี้นั้นถือเป็น Design Pattern ที่ถูกต้องสำหรับข้อมูลทางบัญชี