ตัวอย่างการปรับบรรทัดฐาน 1NF >> 3NF
ตารางที่ยังไม่เป็น Normal Form ขั้นใด Bill_No Bill_Date P_ID P_Name Unit Price QTY Total Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 P01 Sofa Bed 12,500 1 C03 Pim Australia E02 Smith P03 Dinning Table 5,000 2 10,000 B002 P02 Bed 15,000 30,000 E03 Benny P05 Electric Fan 3,000 10 P04 Printer 12,000 24,000 B003 3/08/2004 125,000 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA 5 B005 P07 Air Conditioner 20,000 40,000 New zeland
Step 1 : ขจัด Derived Attribute(ถ้ามี) Bill_No Bill_Date P_ID P_Name Unit Price QTY Total Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 P01 Sofa Bed 12,500 1 C03 Pim Australia E02 Smith P03 Dinning Table 5,000 2 10,000 B002 P02 Bed 15,000 30,000 E03 Benny P05 Electric Fan 3,000 10 P04 Printer 12,000 24,000 B003 3/08/2004 125,000 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA 5 B005 P07 Air Conditioner 20,000 40,000 New zeland เกิดจาก UnitPrice * QTY
รีเลชันที่ขจัด Derived Attr. แล้ว Bill_No Bill_Date P_ID P_Name Unit Price QTY Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 P01 Sofa Bed 12,500 1 C03 Pim Australia E02 Smith P03 Dinning Table 5,000 2 B002 P02 Bed 15,000 E03 Benny P05 Electric Fan 3,000 10 P04 Printer 12,000 B003 3/08/2004 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA 5 B005 P07 Air Conditioner 20,000 New zeland
First Normal Form (1NF) นิยามของ 1NF รีเลชันที่เป็น 1NF ต้องไม่มีกลุ่มข้อมูลซ้ำ(Repeating Group) และไม่มีแอตทริบิวต์ที่มีหลายค่า(Multivalued Attribute)
ขจัด Multivalued Attr. และ Repeating Group Bill_No Bill_Date P_ID P_Name Unit Price QTY Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 P01 Sofa Bed 12,500 1 C03 Pim Australia E02 Smith P03 Dinning Table 5,000 2 B002 P02 Bed 15,000 E03 Benny P05 Electric Fan 3,000 10 P04 Printer 12,000 B003 3/08/2004 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA 5 B005 P07 Air Conditioner 20,000 New zeland
รีเลชันที่ไม่มี Multivalued Attr รีเลชันที่ไม่มี Multivalued Attr. และ Repeating group โดยการแยกแต่ละข้อมูลออกเป็นเอกเทศในแต่ละทูเพิล Bill_No Bill_Date P_ID P_Name Unit Price QTY Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 P01 Sofa Bed 12,500 1 C03 Pim Australia E02 Smith P03 Dinning Table 5,000 2 B002 P02 Bed 15,000 E03 Benny P05 Electric Fan 3,000 10 P04 Printer 12,000 B003 3/08/2004 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA 5 B005 P07 Air Conditioner 20,000
หา Functional Dependency FD1 : Bill_No Bill_date , Cus_ID ,Cus_Name , Address , Emp_ID , Emp_Name FD2 : P_ID P_name , UnitPrice FD3 : Bill_No , P_ID QTY FD4 : Cus_ID Cus_Name , Address FD5 : Emp_ID Emp_Name เอา FD1 , FD2 และ FD3 มารวมกัน(Composition)ได้ FD6 : BiLL_No , P_ID Bill_date , Cus_ID ,Cus_Name , Address , Emp_ID , Emp_Name ,P_Name , UnitPrice ดังนั้นพิจารณาได้ว่า primary key ของรีเลชันคือ Bill_No รวมกับ P_ID
รีเลชันที่อยู่ในรูป 1NF Bill_No Bill_Date P_ID P_Name Unit Price QTY Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 P01 Sofa Bed 12,500 1 C03 Pim Australia E02 Smith P03 Dinning Table 5,000 2 B002 P02 Bed 15,000 E03 Benny P05 Electric Fan 3,000 10 P04 Printer 12,000 B003 3/08/2004 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA 5 B005 P07 Air Conditioner 20,000
Second Normal Form (2NF) รีเลชันที่เป็น 2NF ต้องต้องเป็น 1NF มาก่อน และ ไม่มีแอตทริบิวต์ที่ขึ้นต่อกันกับบางส่วนของคีย์หลัก(Partial Dependency)
รีเลชันอยู่ในรูป 1NF แต่ไม่เป็น 2NF เนื่องจากมี Partial Dependency Bill_No Bill_Date P_ID P_Name Unit Price QTY Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 P01 Sofa Bed 12,500 1 C03 Pim Australia E02 Smith P03 Dinning Table 5,000 2 B002 P02 Bed 15,000 E03 Benny P05 Electric Fan 3,000 10 P04 Printer 12,000 B003 3/08/2004 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA 5 B005 P07 Air Conditioner 20,000 Partial Dependency Partial Dependency Fully Functional Dependency
วิธรการปรับจาก 1NF เป็น 2NF ให้แตกรีเลชัน โดยเอากลุ่มแอตทริบิวต์ที่ขึ้นกับบางส่วนของ Primary ออกเป็นรีเลชันใหม่ Smith E02 Newzeland Jennifer C01 1 12,000 Printer P04 4/08/2004 B005 Emp_Name Emp_ID Address Cus_ Name Cus_ID QTY Unit Price P_Name P_ID Bill_Date Bill_No 2 20,000 Air Conditioner P07 Johnson E01 USA David C02 5 3,000 Electric Fan P05 B004 5,000 Dinning Table P03 10 12,500 Sofa Bed P01 3/08/2004 B003 Benny E03 Australia Pim C03 1/08/2004 B002 15,000 Bed P02 B001 Emp_Name Emp_ID Address Cus_Name Cus_ID Bill_Date Bill_No Unit Price P_Name P_ID QTY P_ID Bill_No
Bill Bill_Details Product Bill_No P_ID QTY B001 P01 1 P03 2 B002 P02 Bill_Date Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 C03 Pim Australia E02 Smith B002 E03 Benny B003 3/08/2004 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA B005 Bill_Details Bill_No P_ID QTY B001 P01 1 P03 2 B002 P02 P05 10 P04 B003 B004 5 B005 P07 Product P_ID P_Name Unit Price P01 Sofa Bed 12,500 P03 Dinning Table 5,000 P02 Bed 15,000 P05 Electric Fan 3,000 P04 Printer 12,000 P07 Air Conditioner 20,000
Thrid Normal Form (3NF) นิยามของ 3NF รีเลชันที่เป็น 3NF ต้องต้องเป็น 2NF มาก่อน และ ไม่มีแอตทริบิวต์ที่ไม่ได้เป็นคีย์หลักขึ้นต่อค่าของแอตทริบิวต์ที่ไม่ได้เป็นคีย์หลัก(Transitive Dependency)
Bill Bill_Details Product ยังไม่เป็น 3NF เป็น 3NF แล้ว ยังไม่เป็น 3NF Bill_No Bill_Date Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 C03 Pim Australia E02 Smith B002 E03 Benny B003 3/08/2004 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA B005 Bill_Details Bill_No P_ID QTY B001 P01 1 P03 2 B002 P02 P05 10 P04 B003 B004 5 B005 P07 Product เป็น 3NF แล้ว P_ID P_Name Unit Price P01 Sofa Bed 12,500 P03 Dinning Table 5,000 P02 Bed 15,000 P05 Electric Fan 3,000 P04 Printer 12,000 P07 Air Conditioner 20,000 ยังไม่เป็น 3NF
อาจแตกตารางเป็นดังนี้ Product P_ID P_Name Unit Price P01 Sofa Bed 12,500 P03 Dinning Table 5,000 P02 Bed 15,000 P05 Electric Fan 3,000 P04 Printer 12,000 P07 Air Conditioner 20,000 แต่การแตกแบบนี้ทำให้เกิดความซ้ำซ้อนมากกว่า จึงไม่นิยมแตกออก ให้ใช้รีเลชัน Product เดิมก่อนแตก อาจแตกตารางเป็นดังนี้ P_ID P_Name P01 Sofa Bed P03 Dinning Table P02 Bed P05 Electric Fan P04 Printer P07 Air Conditioner P_Name Unit Price Sofa Bed 12,500 Dinning Table 5,000 Bed 15,000 Electric Fan 3,000 Printer 12,000 Air Conditioner 20,000
แตกรีเลชันได้เป็นดังนี้ Transitive Dependency Bill Bill_No Bill_Date Cus_ID Cus_ Name Address Emp_ID Emp_Name B001 1/08/2004 C03 Pim Australia E02 Smith B002 E03 Benny B003 3/08/2004 C01 Jennifer Newzeland E01 Johnson B004 4/08/2004 C02 David USA B005 แตกรีเลชันได้เป็นดังนี้ Bill Customer Cus_ID Cus_Name Address C03 Pim Australia C01 Jennifer Newzeland C02 David USA Bill_No Bill_Date Cus_ID Emp_ID B001 1/08/2004 C03 E02 B002 E03 B003 3/08/2004 C01 E01 B004 4/08/2004 C02 B005 Employee Emp_ID Emp_Name E02 Smith E03 Benny E01 Johnson
Bill Customer Employee Bill_Details Product Cus_ID Cus_Name Address Pim Australia C01 Jennifer Newzeland C02 David USA Bill_No Bill_Date Cus_ID Emp_ID B001 1/08/2004 C03 E02 B002 E03 B003 3/08/2004 C01 E01 B004 4/08/2004 C02 B005 Employee Emp_ID Emp_Name E02 Smith E03 Benny E01 Johnson Bill_Details Bill_No P_ID QTY B001 P01 1 P03 2 B002 P02 P05 10 P04 B003 B004 5 B005 P07 Product P_ID P_Name Unit Price P01 Sofa Bed 12,500 P03 Dinning Table 5,000 P02 Bed 15,000 P05 Electric Fan 3,000 P04 Printer 12,000 P07 Air Conditioner 20,000