Normalization
ในบทความนี้จะพูดถึงการตัวอย่างการทำ Normalization ให้กับ Relation ในรูปแบบต่างๆ โดยมีรูปแบบที่จะนำเสนออยู่ 3 รูปแบบคือ
- First Normal Form (1NF)
- Second Normal Form (2NF)
- Third Normal Form (3NF)
First Normal Form (1NF)
ตัวอย่าง
จากตัวอย่างจะเห็นว่า มี 2 ค่า สำหรับ propertyNo (PG4 และ PG16) ในลูกค้า (Client) ที่ชื่อว่า John Kay หากต้องการที่จะทำให้ Unnormalized table ให้เป็น 1NF เราจะต้องทำให้มีแต่ข้อมูลที่เป็น single value ภายในแต่ละหลัก และแต่ละแถว โดยสามารถทำได้โดย การนำ Repeating group ออกไป
ขั้นแรก เราจะต้องนำ Repeating group ออก ในที่นี้จะนำ property rented details ที่มีลักษณะซ้อนอยู่ในแถวออกไป และนำไปเป็นข้อมูลในแต่ละแถวที่มี Key เหมือนกัน ดังรูปด้านล่าง
จากตัวอย่าง Relation ของ ClientRental จะเห็นได้ว่าเป็นแบบ Unnormalized table และมี Primary Key คือ clientNo และยังมี Repeating group อยู่ภายใน Unnormalized table นี้ด้วยซึ่งก็คือ
Repeating Group = (propertyNo, pAddress, rentStart, rentFinish, rent, ownerNo, oName)ทำให้เห็นได้ว่า จะมีข้อมูลที่เป็น multiple values หรือข้อมูลที่มีหลายค่า อยู่ภายในความสัมพันธ์
จากตัวอย่างจะเห็นว่า มี 2 ค่า สำหรับ propertyNo (PG4 และ PG16) ในลูกค้า (Client) ที่ชื่อว่า John Kay หากต้องการที่จะทำให้ Unnormalized table ให้เป็น 1NF เราจะต้องทำให้มีแต่ข้อมูลที่เป็น single value ภายในแต่ละหลัก และแต่ละแถว โดยสามารถทำได้โดย การนำ Repeating group ออกไป
ขั้นแรก เราจะต้องนำ Repeating group ออก ในที่นี้จะนำ property rented details ที่มีลักษณะซ้อนอยู่ในแถวออกไป และนำไปเป็นข้อมูลในแต่ละแถวที่มี Key เหมือนกัน ดังรูปด้านล่าง
และรูปด้านล่างก็คือ Functional Dependencies (fd1 ถึง fd6) สำหรับความสัมพันธ์ ClientRental
ซึ่ง ณ ตอนนี้ความสัมพันธ์ ClientRental นั้นเป็นแบบ 1NF แล้วแต่ว่าจะมีข้อมูลเดิมๆ ซ้ำกันอยู่หลายรอบ หรือที่เรียกว่า Data Redundancy ซึ่งจะทำให้เกิด Update anomalies ได้หากนำไปใช้
ขั้นที่สอง เราจะนำ Repeating group (property rented details ) ออก โดยนำข้อมูลที่ซ้ำไปใส่ไว้ใน relation ที่แยกออกไป โดยจะมี Key attribute คือ clientNo ดังรูป
ทำให้เราสามารถสรุป 1NF relations มาได้ดังนี้
Client (clientNo, cName)
PropertyRentalOwner (clientNo, propertyNo, pAddress, rentStart, rentFinish, rent,
ownerNo, oName)
Second Normal Form (2NF)
ความหมายของ 2NF ก็คือ relation ที่เป็น First normal form และทุก non-primary-key เป็น
fully functionally dependent บน primary key
fully functionally dependent บน primary key
โดยการทำ Normalization สำหรับ 1NF relation ไปเป็น 2NF relation จะทำได้โดย นำ partial dependencies ออกไปจาก relation
ClientRental relation จะมี functional dependencies ดังนี้
fd1 clientNo, propertyNo ® rentStart, rentFinish (Primary key)
fd2 clientNo ® cName (Partial dependency)
fd3 propertyNo ® pAddress, rent, ownerNo, oName (Partial dependency)
fd4 ownerNo ® oName (Transitive dependency)
fd5 clientNo, rentStart ® propertyNo, pAddress, rentFinish, rent, ownerNo, oName (Candidate key)
fd6 propertyNo, rentStart ® clientNo, cName, rentFinish (Candidate key)และผลจากการเปลี่ยน 1NF เป็น 2NF เป็นไปดังรูปด้านล่าง
ขั้นตอนของการทำ 2NF ก็คือ เราจะทดสอบ ClientRental relation โดยหาว่ามี partial dependencies บน primary key หรือไม่ จากการทดสอบจะเห็นได้ว่า client attribute (cName) เป็น partial dependencies บน primary key และยังมี (pAddress, rent, ownerNo, oName) อีกที่เป็น partial dependencies และ
property rents attrbutes (rentStart และ rentFinish) เป็น fully dependent บน primary key ทั้งหมด
จากการสังเกตุ Partial dependencies ที่มีภายใน relation หมายความว่า relation นี้ไม่ใช่ 2NF โดยการที่จะเปลี่ยนให้เป็น 2NF สามารถทำได้โดย สร้าง relation ใหม่ขึ้นมา ที่ไม่มี non-primary key เป็น partial dependent และประกอบไปด้วย ส่วนของ primary key ที่เป็น fully functionally dependent
ทำให้เราสามารถสรุป 2NF relations มาได้ดังนี้
Client (clientNo, cName)
Rental (clientNo, propertyNo, rentStart, rentFinish)
PropertyOwner (propertyNo, pAddress, rent, ownerNo, oName)
Third Normal Form (3NF)
ความหมายของ 3NF ก็คือ relation ที่เป็นทั้ง First normal form และ Second normal form และไม่มี non-primary key attributes ที่เป็น transitively dependent บน primary key
โดยการทำ Normalization สำหรับ 2NF relation ไปเป็น 3NF relation จะทำได้โดย นำ transitive dependencies ออกไปจาก relation
จากการทำ 2NF ด้านบน แสดงให้เห็นถึง functional dependencies ของ Client, Rental และ PropertyOwner ได้ดังนี้
Client
fd2 clientNo ® cName (Primary key)
Rental
fd1 clientNo, propertyNo ® rentStart, rentFinish (Primary key)
fd5' clientNo, rentStart ® propertyNo, rentFinish (Candidate key)
fd6' propertyNo, rentStart ® clientNo, rentFinish (Candidate key)
PropertyOwner
fd3 propertyNo ® pAddress, rent, ownerNo, oName (Primary key)
fd4 ownerNo ® oName (Transitive dependency)
จะเห็นได้ว่า non-primary key attributes ทุกตัวในความสัมพันธ์ Client และ Rental เป็น functionally dependent บน primary key ของตัวเอง ทำให้เป็น 3NF แล้วสำหรับความสัมพันธ์นี้
และจะเห็นได้ non-primary key attributes ทุกตัวในความสัมพันธ์ PropertyOwner เป็น functionally dependent บน primary key ของตัวเอง ยกเว้น oName ที่เป็น transitively depentdent บน ownerNo
และการที่จำให้ 2NF เป็น 3NF จะต้องทำให้ transitive dependency หายไป และเราจะสร้าง relation ใหม่ขึ้นมา 2 อัน ดังรูปแบบดังนี้
PropertyForRent (propertyNo, pAddress, rent, ownerNo)
Owner (ownerNo, oName)
ทำให้เราสามารถสรุป 3NF relations มาได้ดังนี้
Client (clientNo, cName)
Rental (clientNo, propertyNo, rentStart, rentFinish)
PropertyForRent (propertyNo, pAddress, rent, ownerNo)
Owner (ownerNo, oName)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น