การใส่ฐานข้อมูลในฟอร์มปกติที่สาม (3NF)

รูปแบบปกติที่สาม (3NF) เป็นหลักการฐานข้อมูลที่สนับสนุนความสมบูรณ์ของข้อมูลโดยการสร้างตาม หลักการ normalization ของฐานข้อมูล โดย First Normal Form (1NF) และ Second Normal Form (2NF)

ข้อกำหนดฟอร์มปกติที่สาม

มีสองข้อกำหนดพื้นฐานสำหรับฐานข้อมูลจะอยู่ในรูปแบบปกติที่สาม:

เกี่ยวกับการพึ่งพิงหลัก

ลองดูเพิ่มเติมว่าเราหมายถึงอะไรจากข้อเท็จจริงที่ว่าคอลัมน์ทั้งหมดต้องขึ้นอยู่กับคีย์หลัก

ถ้าค่าของคอลัมน์สามารถได้มาจากทั้งคีย์หลักและคอลัมน์อื่นในตารางจะเป็นการละเมิด 3NF พิจารณาตารางพนักงานที่มีคอลัมน์เหล่านี้:

ทั้ง LastName และ FirstName จะขึ้นอยู่กับค่า EmployeeID เท่านั้นหรือไม่? ดี LastName อาจขึ้นอยู่กับ FirstName หรือไม่? ไม่ได้เพราะไม่มีอะไรที่มีอยู่ใน LastName จะแนะนำค่าของ FirstName FirstName อาจขึ้นอยู่กับ LastName หรือไม่? ไม่มีอีกแล้วเพราะความจริงเช่นเดียวกัน: ไม่ว่า LastName อาจเป็นเช่นไรจะไม่สามารถให้คำแนะนำเกี่ยวกับค่าของ FirstName ได้ ดังนั้นตารางนี้เป็นไปตามมาตรฐาน 3NF

แต่พิจารณาตารางรถนี้:

ผู้ผลิตและโมเดลอาจได้รับมาจาก VehicleID - แต่ Model อาจได้รับมาจากผู้ผลิตเนื่องจากโมเดลรถทำโดยเฉพาะผู้ผลิตเท่านั้น การออกแบบตารางนี้ไม่สอดคล้องกับมาตรฐาน 3NF และอาจทำให้ข้อมูลไม่เป็นไปตามข้อกำหนด ตัวอย่างเช่นคุณอาจอัปเดตผู้ผลิตโดยไม่ต้องอัปเดตโมเดลโดยแนะนำข้อมูลที่ไม่ถูกต้อง

เพื่อให้เป็นไปตามข้อกำหนดเราจำเป็นต้องย้ายคอลัมน์ขึ้นกับตารางอื่นและอ้างอิงโดยใช้คีย์ต่างประเทศ ซึ่งจะทำให้มีสองตาราง:

ยานพาหนะตาราง

ในตารางด้านล่าง ModelID เป็นคีย์ต่างประเทศในตาราง โมเดล :

ตารางรูปแบบ

ตารางใหม่นี้จะจำลองโมเดลไปยังผู้ผลิต ถ้าคุณต้องการปรับปรุงข้อมูลยานพาหนะใด ๆ ที่ระบุถึงโมเดลคุณจะทำในตารางนี้แทนในตารางยานพาหนะ

ฟิลด์ที่ได้รับในรูปแบบ 3NF

ตารางอาจมีฟิลด์ที่ได้รับซึ่งเป็นฟิลด์ที่คำนวณจากคอลัมน์อื่น ๆ ในตาราง ตัวอย่างเช่นพิจารณาตารางคำสั่งเครื่องมือนี้:

ทั้งหมดแบ่งการปฏิบัติตาม 3NF เพราะสามารถได้มาโดยการคูณราคาต่อหน่วยตามปริมาณแทนที่จะต้องพึ่งพาคีย์หลักอย่างเต็มที่ เราต้องนำออกจากตารางเพื่อให้สอดคล้องกับรูปแบบปกติที่สาม

ในความเป็นจริงเนื่องจากเป็นที่มาจะดีกว่าที่จะไม่เก็บไว้ในฐานข้อมูลเลย

เราสามารถคำนวณได้ว่า "ทันที" เมื่อทำการค้นหาฐานข้อมูล ตัวอย่างเช่นเราอาจเคยใช้ข้อความค้นหานี้เพื่อดึงข้อมูลหมายเลขคำสั่งซื้อและผลรวม:

SELECT OrderNumber รวมจาก WidgetOrders

ขณะนี้เราสามารถใช้ข้อความค้นหาต่อไปนี้:

เลือก OrderNumber, UnitPrice * Quantity AS Total จาก WidgetOrders

เพื่อให้ได้ผลลัพธ์ที่เหมือนกันโดยไม่มีการละเมิดกฎเกณฑ์เรื่อง normalization