Normalization
ความหมายของการนอร์มอลไลเซซัน Normalization เป็นกระบวนการนำโครงร่างของรีเลชันมาแตกเป็นรีเลชันต่างๆ ให้อยู่ในรูปแบบที่เรียกว่า Normal form เป้าหมายเพื่อให้รีเลชันที่ได้รับการออกแบบอยู่ในรูปแบบบรรทัดฐานระดับที่เหมาะสม E.F. Codd แบ่งรูปแบบ Normal Form ออกเป็น 3 ระดับด้วยกันคือ Normal Form ระดับที่ 1 (1NF) Normal Form ระดับที่ 2 (2NF) Normal Form ระดับที่ 3 (3NF)
จุดประสงค์ของการนอร์มอลไลเซซัน ลดเนื้อที่ในการจัดเก็บข้อมูล การ Normalization เป็นการออกแบบเพื่อลดความซ้ำซ้อนในข้อมูล ทำให้ลดเนื้อที่ในการจัดเก็บข้อมูลลงไปด้วย ลดปัญหาข้อมูลที่ไม่ถูกต้อง เมื่อมีข้อมูลไม่มีความซ้ำซ้อน ในการปรับปรุงข้อมูลก็สามารถปรับปรุงข้อมูลได้จากแหล่งเดียว จึงช่วยลดปัญหาการปรับปรุงข้อมูลถูกต้องได้
ความผิดพลาดจากการปรับปรุงข้อมูล การผิดพลาดจากการเพิ่มข้อมูล การผิดพลาดจากการลบข้อมูล การผิดพลาดจากเปลี่ยนแปลงข้อมูล
ตาราง Staff sl22 ChuChai Suksri b5 ChaingMai 053-893452 sg37 Sirirat Staff_id Name Surname Branch_id Address Tel. sl22 ChuChai Suksri b5 ChaingMai 053-893452 sg37 Sirirat ManeeJun b1 Bangkok 02-2204446 sa23 Somsak SeeTang sg09 Piya Thanasilp b3 Phitsanulok 055-453246 sg41 Ladda Wongdes b4 Tak 054-215467
Normalize ระดับที่ 1 ไม่มีคอลัมน์ใด มีค่า มากกว่า 1 ค่า (ไม่มี repeating Group) แต่ละตารางต้องมี Primary key
ตัวอย่างข้อมูล ตาราง Student และ ตาราง Subject
Student Subject
ทำให้ตารางทั้ง 3 เป็น NF1 แยกคอลัมน์ที่มีมากว่า 1 ค่าเป็นแถวใหม่ เพิ่มข้อมูลที่เหมาะสมเข้าไป กำหนด Primary Key
ได้ตาราง NF 1 ดังต่อไปนี้ ตาราง Student
ตาราง Subject
ตาราง student_subject
Functional Dependency ฟังก์ชั่นการขึ้นต่อกัน คือ ความสัมพันธ์ระหว่าง Attribute หนึ่ง หรือ กลุ่มของ Attribute ที่ประกอบกันแล้ว สามารถระบุค่าของ Attribute อื่นๆ ใน tuple เดียวกันของรีเลชั่นนั้นได้ สมมติว่า A กับ B คือ Attribute ของรีเลชั่น R แล้ว B เป็นฟังก์ชั่นที่ขึ้นอยู่กับ A จะเขียนในรูปแบบสัญลักษณ์ได้ว่า A B โดยเรียก A ว่า Determinant และ เรียก B ว่า Dependent
ตัวอย่าง จากตาราง staff ถ้าถามว่า พนักงานคนใดมี รหัสพนักงงาน sl22 เราสามารถตอบได้ทันทีว่า คือ พนักงานชื่อ Chuchai Suksri ดังนั้น แสดงว่า ชื่อพนักงาน ขึ้นอยู่กับ รหัสพนักงาน Staff_id Name Surname Branch_id Address Tel. sl22 ChuChai Suksri b5 ChaingMai 053-893452
Functional Dependency (FD) เป็นวิธีที่ใช้ตรวจสอบว่า Attribute ที่ไม่ใช่ Primary key นั้นมีความเกี่ยวข้องกับ Primary key หรือ ไม่เพื่อใช้ พิจารณา ว่าควรจะแยก Attribute ดังกล่าวควรจะแยกเป็นคอลัมน์ในตารางใหม่ หรือ ไม่ ในรีเลชั่นหนึ่ง Attribute ทุกตัวต้องขึ้นอยู่กับ Primary key โดยถ้า Primary Key เป็นกลุ่ม Attribute ต้องขึ้นอยู่กับ Attribute ทุกตัวที่รวมเป็น Primary Key ถ้าขึ้นอยู่กับ Primary key เพียงบางส่วนจะเรียกว่า Partial Dependency ถ้าขึ้นอยู่กับ Primary key ทั้งหมดเรียกว่า Full Functional Dependency ถ้า Primary key เป็น Attribute เดียวจะเป็น Full Functional Dependency
ตัวอย่าง รูปแบบ NF2 ตาราง Student จะเห็นได้ว่า Name,BirthDay,Cladd,Advisor ไม่ได้ขึ้นอยู่กับ Attribute ที่เป็น Primary key ทั้งหมด แต่ ขึ้นอยู่กับ Student_id เพียง Attribute เดียว ไม่ได้ขึ้นอยู่กับ Club และ Hobby ดังนั้นจะเขียน FD ได้ดังนี้ Student_id Name,Birthday,Class,Advisor Student_id club,hobby
ดังนั้น จึงสามารถแยกตารางตาม FD ได้ดังนี้
ตัวอย่าง รูปแบบ NF2 ตาราง Subject จะเห็นได้ว่า ตาราง Subject จะมีลักษณะคล้ายกับ ตารางStudent ดังนั้นจะเขียน FD ได้ดังนี้ Subject_id Name, Credit Subject_id Teacher,Textbook
ดังนั้น จึงสามารถแยกตารางตาม FD ได้ดังนี้
สำหรับตาราง Student_subject เขียน FD ได้ดังนี้ Student_id,Subject_id Grade,Score,Term จาก FD จะเห็นได้ว่า เมื่อต้องการจะทราบค่าของ Attribute ที่ไม่ใช้ Key ซึ่งก็คือ Grade,Score,Term ต้องทราบค่าของ Primary key คือ Student_id,Subject_id ก่อน ไม่ได้ขึ้นอยู่กับตัวใดตัวหนึ่ง ดังนั้นจึงไม่เป็ฯ Partial Dependency จึงไม่จำเป็นต้องแยกตาราง
Normalize ระดับที่ 3 เป็น 2NF Attribute ที่ใช่ Key ไม่ขึ้นต่อกันเอง (ไม่เป็น Transitive Dependency) เป็น FD ที่ไม่เกี่ยวข้องกับ Primary key
จากตาราง Student จะมี FD ที่ไม่เกี่ยวข้องกับ Primary key คือ Class Teacher จึงต้องแยกตารางออกเป็น สองตารางดังนี้
Boyce/Codd Normal Form (BCNF) Attribute ทุกตัวขึ้นอยู่กับ Candidate Key Determinant ทุกตัวต้องเป็น Candidate Key ตัวอย่าง จากตาราง Teacher_Textbook ได้ FD ดังต่อไปนี้ Textbook Subject_id Teacher,Subject_id Textbook
Cadidate Key ของตารางนี้คือ (teacher,textbook) กับ (teacher,subject_id) Determinant คือ textbook กับ teacher,subject_id จะเห็นว่า textbook ที่เป็น Determinant ของ FD ไม่ได้เป็น Cadidate Key ดังนั้น Relation นี้จึงไม่เป็น BCNF
ดังนั้น ต้องแยกตารางดังกล่าวออกเป็นสองตาราง ตาม FD ซึ่งมี Determinant ที่ไม่ได้เป็น Candidate Key ซึ่งจะได้ตารางดังต่อไปนี้ คือ ตาราง Textbook และ Teacher_Textbook
Normalize ระดับที่ 4 เป็น BCNF ไม่มี Multivalued Dependency
Nomalization ระดับที่ 5 จะต้องมี Candidate Key ปรากฏใน Join Dependency ของ Relation นั้นเสมอ