Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Database Normalization

4,474 views

Published on

Published in: Education

Database Normalization

  1. 1. สไลด์ต้นแบบสามารถดาวน์โหลดได้ที่http://codex.cs.yale.edu/avi/db-book/db6/slide-dir/
  2. 2. การขึ้นต่อกันของข้อมูล• Data Dependency = การขึ้นต่อกันของข้อมูล• เกิดจาก Attribute หนึ่งมีความสัมพันธ์กับอีก Attribute หนึ่ง• แบ่งออกเป็น 3 ประเภท – Functional Dependency – Multivalued Dependency – Join Dependency• ในคอร์สนี้จะศึกษาเพียง Functional Dependency เท่านั้น
  3. 3. ฟังก์ชันการขึ้นต่อกัน• Functional Dependency (FD) = ฟังก์ชันการขึ้นต่อกัน• FD จะเกิดขึ้นเมื่อมีค่าของ Attribute หนึ่งสอดคล้องกับอีกAttribute หนึ่งเพียงหนึ่งค่า – นิยาม เมื่อ R เป็น Relation และให้ A, B เป็นส่วนหนึ่งของ Attribute ที่อยู่ใน R ถ้าหากค่า A นั้นสอดคล้องกับค่า B เพียงหนึ่งค่า จะกล่าวได้ว่า “B นั้นขึ้นต่อ A” หรือ “A เป็นตัวกาหนด B” หรือ A -> B – เราจะเรียก A ว่าตัวกาหนด (Determinant) และ B ว่าตัวถูกระบุค่า (Dependent)• Functional Dependency มีผลต่อการเลือก PK และการทา NF
  4. 4. ลักษณะของฟังก์ชันการขึ้นต่อกัน• Trivial Functional Dependency – ความสัมพันธ์ระหว่าง Determinant Set กับ Determinant Subset – ไม่รู้ความหมายอะไรในตาราง ก็สามารถบอก Dependent ได้ – ไม่ค่อยสาคัญเท่าไร• Nontrivial Functional Dependency – ความสัมพันธ์ระหว่าง Determinant Attribute Set กับ Attribute อื่น – ต้องเข้าใจความหมาย ความสัมพันธ์ เงื่อนไขของ Attribute ในตาราง ถึง จะบอก Dependent ได้
  5. 5. Trivial Functional Dependency id char_name hair_id skin_color level class_namethep444 Adolescence 2 f0e7c8 34 Archerthep444 AcetoOrceiN 17 f0e7c8 68 Knightmadoka555 QBayDesu 15 ffffff 57 Magician• ในตารางนี้มี Trivial Functional Dependency เท่าไร
  6. 6. Nontrivial Functional Dependency id char_name hair_id skin_color level class_namethep444 Adolescence 2 f0e7c8 34 Archerthep444 AcetoOrceiN 17 f0e7c8 68 Knightmadoka555 QBayDesu 15 ffffff 57 Magician• ในตารางนี้มี Nontrivial Functional Dependency – {id, char_name}  {hair_id, skin_color, level, class_name} – {char_name}  {hair_id, skin_color, level, class_name}
  7. 7. Nontrivial Functional Dependency• ในตารางนี้มี Nontrivial Functional Dependency อะไรบ้าง?
  8. 8. Nontrivial Functional Dependencyรหัสพนักงาน ชื่อพนักงาน รหัสแผนก วันที่ทางาน เวลาเข้างาน เวลาออกงาน 226 Keiseiie Hara FKnL 2100/6/28 7:45 18:10 227 Kawada I. Inoue LL 2100/6/30 8:01 19:24 226 Keiseiie Hara FKnL 2100/6/30 6:19 17:16 228 Moriyama Aiko HR 2100/7/1 8:59 16:44 229 Keiseiie Kune CP 2100/7/1 7:33 20:54 229 Keiseiie Kune CP 2100/7/3 7:42 19:17 • ในตารางนี้มี Nontrivial Functional Dependency อะไรบ้าง?
  9. 9. รูปแบบของฟังก์ชันการขึ้นต่อกัน• Full Functional Dependency – เกิดจากทุก Attribute ใน Determinant Set กาหนดค่า Attribute ทั้งหมด – ถ้า Determinant Set D สามารถกาหนดทุกค่าใน Attribute แล้ว D จะเป็น Primary Key• Partial Dependency – เกิดจาก Dependent Set ขึ้นกับบางส่วนของ Attribute ที่เป็น PK• Transitive Dependency – เกิดจาก Dependent Set ขึ้นกับบางส่วนของ Attribute ที่ไม่เป็น PK
  10. 10. Full Functional Dependencyรหัสพนักงาน ชื่อพนักงาน รหัสแผนก ตาแหน่งงาน เงินเดือน 226 Keiseiie Hara FKnL L Hand General Knight 14800 227 Kawada I. Inoue LL Linguistics Lecturer 13900 228 Moriyama Aiko HR Salary Manager 10430 229 Keiseiie Kune CP Computer Programmer 12040 230 Tadachizu Yoichi FKnL L Hand Security Guard 9400 231 Meira Meiji P Super General Priest 9000• {รหัสพนักงาน} --> {ชื่อพนักงาน, รหัสแผนก, ตาแหน่งงาน, เงินเดือน}
  11. 11. Partial Functional Dependency id char_name hair_id skin_color level class_namethep444 Adolescence 2 f0e7c8 34 Archerthep444 AcetoOrceiN 17 f0e7c8 68 Knightmadoka555 QBayDesu 15 ffffff 57 Magician• {char_name}  {hair_id, skin_color, level, class_name}
  12. 12. Transitive Functional Dependency proj_name staff_id job_class job_id เงินเดือนAbBeaw Project 120 Presenter 20540 6100AbBeaw Project 145 Presenter 20540 6100Makenai Camp 228 First Aid Manager 31001 8020Makenai Camp 130 Director 90001 15400Makenai Camp 144 Entertainer 90100 8020Makenai Camp 210 Entertainer 90100 8020 • {job_id}  {job_class} • {job_class}  {job_id}
  13. 13. การนาเสนอฟังก์ชันที่ขึ้นต่อกัน• เราสามารถเขียน Functional Dependency ได้ 2 รูปแบบ – เขียนเป็น Diagram – เขียนเป็นเซต• ขึ้นกับความถนัดของบุคคลนั้น ๆ {EMP_NUM}  {EMP_NAME, JOB_CLASS}
  14. 14. Normalization• Normalization = การทาบรรทัดฐาน, การทาให้เป็นมาตรฐาน• กระบวนการหนึ่งที่มีอยู่ในการออกแบบฐานข้อมูล – การแก้ไขตารางข้อมูลให้มีการซ้าซ้อนของข้อมูลน้อยลง – นิยมทาไปพร้อมกันกับการออกแบบ ER Diagram• Normalization จะทาตามลาดับไปเรื่อย ๆ – แต่ละระดับเรียกว่า Normal form – Normal Form (NF) = รูปแบบบรรทัดฐาน
  15. 15. Normal Form• ข้อกาหนดในการแก้ไขตารางภายในฐานข้อมูล• รูปแบบที่มีตัวเลขมาก ข้อกาหนดยิ่งมากขึ้น แต่ฐานข้อมูลที่ได้ยิ่งดีขึ้น – รูปแบบบรรทัดฐานที่ 1 (1NF) จะดีกว่ารูปแบบบรรทัดฐานที่ 0 (0NF) – รูปแบบบรรทัดฐานที่ 2 (2NF) จะดีกว่ารูปแบบบรรทัดฐานที่ 1 – ...• ในปัจจุบันรูปแบบบรรทัดฐานหลักมีทั้งหมด 9 รูปแบบ[1] – 1NF, 2NF, 3NF, EKNF, BCNF, 4NF, 5NF, DKNF, 6NF• ส่วนใหญ่นิยมแก้ไขถึงรูปแบบบรรทัดฐานที่ 3 (3NF)
  16. 16. ข้อเสียของตารางที่ไม่ทา Normal Form• ปัญหาการเพิ่มข้อมูล (Insertion Anomalies) – การเพิ่มข้อมูลที่มีข้อมูลไม่ครบตาม Schema – อาจใส่ค่า null แต่ null เป็นค่าที่เราไม่อยากได้• ปัญหาการแก้ไขข้อมูล (Update Anomalies) – การแก้ไขข้อมูลที่มีความซ้าซ้อนกันในตาราง – ไล่แก้ไปเรื่อย ๆ• ปัญหาการลบข้อมูล (Deletion Anomalies) – ข้อมูลใน Attribute นั้นไม่อยากลบ แต่ข้อมูลนั้นอยู่ที่ Tuple ที่อยากลบ
  17. 17. Insertion Anomalies id char_name hair_id skin_color level class_namethep444 Adolescence 2 f0e7c8 34 Archer0816581025 Sensation 10 eed99b 11 Novicemadoka555 null null null null nulldarni_maria FuxkYeah-_-!! 14 ffffee 7 Archerkodman_cs นู๋IปJIทย 7 f0e7c8 13 Novice id thunderstrom
  18. 18. Update Anomalies id char_name hair_id skin_color level class_namethep444 Adolescence 2 f0e7c8 34 Archer0816581025 Sensation 10 eed99b 11 Archermadoka555 QBayDesu 15 ffffff 57 Magiciandarni_maria FuxkYeah-_-!! 14 ffffee 7 Archerkodman_cs นู๋IปJIทย 7 f0e7c8 13 Archr0876551000 n๐IIหล 1 343232 1 Novice
  19. 19. Deletion Anomalies id char_name hair_id skin_color level class_namethep444 Adolescence 2 f0e7c8 34 Archer0816581025 Sensation 10 eed99b 11 Archermadoka555 QBayDesu 15 ffffff 57 Magiciandarni_maria FuxkYeah-_-!! 14 ffffee 7 Archerkodman_cs นู๋IปJIทย 7 f0e7c8 13 Archr0876551000 n๐IIหล 1 343232 1 Novice
  20. 20. รูปแบบบรรทัดฐานที่ 1• รูปแบบบรรทัดฐานที่ 1 = First Normal Form (1NF)• ตารางในข้อกาหนด 1NF ต้องมี Attribute ใด ๆ อยู่ภายใน Attribute – ถ้ามี Attribute ซ้อนอยู่ จะเอา Attribute ที่ซ้อนกันออก• ข้อมูลแบบ Multivalue ต้องแยกเป็นแต่ละแถว• ทุก ๆ Attribute ต้องขึ้นกับ Primary Key• Schema ที่แปลงจาก ER Diagram จะเป็น 1NF ในทันที
  21. 21. การทาตารางเป็น 1NFServ Server Board Charac Character Character Info ID ID Name Name ter ID Name LV Class Name Job Name 0 Mochi 1 Adolescence 34 Archer thep44 Nopakun~* Fighter 1 Adolescence 41 Scout Takoyaki thanyapol thanyapol 15 NeoS Backpacker Mechanic 1 99 78 parazettamon Bard Takoyaki kunemata kunemata Spell User 150 Sufflez 76 Sage 0 Mochi 104 Harasama 64 Dark Stalker Fighter olfactory harasama 119 Reizinixc 99 Bounty Hunter 1 Takoyaki 183 ReizinixcII 36 Backpacker Tatarabe
  22. 22. การทาตารางเป็น 1NF • Attribute ใดที่ซ้อนกับ Attribute ให้เอา Attribute นั้นออกServ Server Board Charac Character Character Info ID ID Name Name ter ID Name LV Class Name Job NameServ Server Board Charac Character ID LV Class Name Job Name ID Name Name ter ID Name
  23. 23. การทาตารางเป็น 1NF • ข้อมูลแบบ Multivalue ต้องแยกเป็นแต่ละแถวServ Server Board Charac Character ID LV Class Name Job Name ID Name Name ter ID Name 0 Mochi thep44 Nopakun~* 1 Adolescence 34 Fighter Archer 1 Takoyaki thep44 Nopakun~* 1 Adolescence 41 Fighter Scout 1 Takoyaki thanyapol thanyapol 15 NeoS 99 Backpacker Mechanic 1 Takoyaki kunemata kunemata 78 parazettamon 99 Spell User Bard 1 Takoyaki kunemata kunemata 150 Sufflez 76 Spell User Sage 0 Mochi olfactory harasama 104 Harasama 64 Fighter Dark Stalker 1 Takoyaki olfactory harasama 119 Reizinixc 99 Fighter Bounty Hunter 1 Takoyaki olfactory harasama 183 ReizinixcII 36 Backpacker Tatarabe
  24. 24. การทาตารางเป็น 1NF • ทุก Attribute ต้องขึ้นกับ Primary KeyServ Server Board Charac Character ID LV Class Name Job Name ID Name Name ter ID Name 0 Mochi thep44 Nopakun~* 1 Adolescence 34 Fighter Archer 1 Takoyaki thep44 Nopakun~* 1 Adolescence 41 Fighter Scout 1 Takoyaki thanyapol thanyapol 15 NeoS 99 Backpacker Mechanic 1 Takoyaki kunemata kunemata 78 parazettamon 99 Spell User Bard 1 Takoyaki kunemata kunemata 150 Sufflez 76 Spell User Sage 0 Mochi olfactory harasama 104 Harasama 64 Fighter Dark Stalker 1 Takoyaki olfactory harasama 119 Reizinixc 99 Fighter Bounty Hunter 1 Takoyaki olfactory harasama 183 ReizinixcII 36 Backpacker Tatarabe
  25. 25. รูปแบบบรรทัดฐานที่ 2• รูปแบบบรรทัดฐานที่ 2 = Second Normal Form (2NF)• มีหลายเหตุผลที่ต้องทาตารางให้เป็น 2NF – ปัญหาความซ้าซ้อนของข้อมูล• ตาราง 2NF ต้องผ่านคุณสมบัติทั้งหมดของ 1NF มาก่อน• 2NF จะไม่มี Dependent Set ใด ๆ ขึ้นกับบางส่วนของ Primary Key – ไม่มี Partial Dependency
  26. 26. การทาตารางเป็น 2NF • พิจารณา Partial Dependency ของตารางServ Server Board Charac Character ID LV Class Name Job Name ID Name Name ter ID Name {Serv ID, Character ID}  {Server Name, ID, Board Name, Character Name, LV, Class Name, Job Name} {Serv ID}  {Server Name}
  27. 27. การทาตารางเป็น 2NF• แยกตาราง โดยย้าย Dependent Set ให้ไปอยู่ที่ตารางใหม่ และให้ตารางใหม่มี PK คือ Determinant Set• ตั้งชื่อ Schema ใหม่ที่แยกออกมา Serv Server ตารางรายชื่อเซิร์ฟเวอร์ ID Name ตารางลักษณะตัวละคร Serv Board Character Character ID LV Class Name Job Name ID Name ID Name
  28. 28. รูปแบบบรรทัดฐานที่ 3• รูปแบบบรรทัดฐานที่ 3 = Second Normal Form (3NF)• ในบางครั้ง การทาตาราง 2NF ยังไม่พอ – ปัญหาความซ้าซ้อนของข้อมูลอีกแล้ว• ตาราง 3NF ต้องผ่านคุณสมบัติทั้งหมดของ 2NF มาก่อน• 3NF จะไม่มี Dependent Set ใด ๆ ขึ้นกับ Attribute ใด ๆ ที่ไม่เป็นPrimary Key – ไม่มี Transitive Dependency
  29. 29. การทาตารางเป็น 3NF• พิจารณา Transitive Dependency ของตาราง• อย่าลืมพิจารณาตารางที่ถูกแยกจาก 2NF ด้วย Serv Server ตารางรายชื่อเซิร์ฟเวอร์ ID Name ตารางลักษณะตัวละคร Serv Board Character Character ID LV Class Name Job Name ID Name ID Name{ID}  {Board Name}{Job Name}  {Class Name}
  30. 30. ECO Job System[2] 1st Class 2nd Class 3rd Class 1st Class 2nd Class 3rd Class 1st Class 2nd Class 3rd Class Blademaster Sorcerer BlacksmithSwordman Gladiator Wizard Force Master Tatarabe Maestro Bounty Hunter Sage Machinery Knight Elementer AlchemistFencer Guardian Shaman Astralist Farmer Harvest Dark Stalker Enchanter Marionette Assasin Druid ExplorerScout Eraser Vates Cardinal Ranger Strider Commando Bard Treasure Hunter Striker Cabalist TraderArcher Hawker Warlock Soultaker Merchant Royal Dealer Gunner Warlock Gambler Fighter Class Spell User Class Backpacker Class
  31. 31. การทาตารางเป็น 3NF• แยกตาราง โดยย้าย Dependent Set ให้ไปอยู่ที่ตารางใหม่ และให้ตารางใหม่มี PK คือ Determinant Set• ตั้งชื่อ Schema ใหม่ที่แยกออกมา ตารางลักษณะตัวละคร Serv Character Character ID LV Job Name ID ID Nameตารางรายชื่อเซิร์ฟเวอร์ ตารางชื่อในเว็บบอร์ด ตารางคลาสอาชีพ Serv ID Server Name ID Board Name Job Name Class Name
  32. 32. รูปแบบบรรทัดฐานบอยซ์คอดด์• ในเชิงธุรกิจ การทาตารางถึง 3NF นั้นเพียงพอแล้ว แต่บางครั้งก็ยังไม่พอ• การพิจารณา BCNF ไม่ต้องพิจารณา 1NF, 2NF, 3NF ก็ได้• ลักษณะของ Relation ที่สามารถนามาพิจารณา BCNF – มี Candidate Key ตั้งแต่ 2 ตัวขึ้นไป – Primary Key เป็น Composite Key – Candidate Key บางตัวมีการใช้ Attribute เดียวกันเป็นส่วนหนึ่งของ Candidate Key• BCNF จะไม่มี Attribute บางส่วนที่เป็น PK ขึ้นกับบาง Attribute ที่ไม่เป็น PK
  33. 33. การทาตารางเป็น BCNF• ผู้ พั ฒ นาระบบคนหนึ่ ง อยากให้ พิ จ ารณาว่ า ตารางการสอนของมหาวิทยาลัย S นั้นอยู่ใน BCNF หรือไม่ Teacher Name Semester Year Course ID sec Capacity Mera Meiji 1 2001 02358230 1 300 Mera Meiji 2 2001 02358230 2 300 Keiseiie Kune 1 2001 02358101 1 300 Edogawa Asaki 1 2002 01411103 1 40 Inoue Shuichi 1 2002 01411103 2 40 Keiseiie Hara 2 2002 01999610 1 30 Inoue Fumiko 2 2002 01420101 1 300
  34. 34. การทาตารางเป็น BCNF• ภายในตารางไม่พบ Transitive Dependency, Partial Dependencyดังนั้นตารางนี้เป็นตาราง 3NF• ตารางนี้ไม่เป็น BCNF เพราะ {Semester, Course ID, sec} เป็นตัวกาหนดให้กับ {Teacher Name} Teacher Name Semester Year Course ID sec Capacity
  35. 35. การทาตารางเป็น BCNF• การเปลี่ยนให้เป็น BCNF ทาได้โดยเปลี่ยน Determinant Set ที่ไม่ใช่PK มาเป็น PK แทน ส่วน Dependent Set นั้นเปลี่ยนเป็น Attributeธรรมดา Teacher Name Semester Year Course ID sec Capacity Teacher Name Semester Year Course ID sec Capacity
  36. 36. การทาตารางเป็น BCNF• ในกรณีที่ Determinant Set เป็น Attribute ที่ไม่ได้อยู่ใน PK ทั้งหมดการเปลี่ยนเป็น BCNF อาจทาให้เกิด Partial Dependency ได้ A B C D E C B D A E B C A B C D E
  37. 37. รูปแบบบรรทัดฐานที่ 4• รูปแบบบรรทัดฐานที่ 4 = Fourth Normal Form (4NF)• ส่วนใหญ่ไม่นิยมทากัน• ตาราง 4NF ต้องผ่านคุณสมบัติทั้งหมดของ BCNF มาก่อน• คอร์สนี้ไม่มีเรื่อง 4NF
  38. 38. Denormalization• ข้อมูลที่ผ่าน Normalization แล้ว จะทาให้ข้อมูลซ้าซ้อนลดลง และSchema มากขึ้น• การคืนสภาพของตาราง Schema ที่ Normalized แล้ว จะใช้วิธีNatural Join – ยิ่ง Schema มาก การ Natural Join จะยิ่งช้าลงเรื่อย ๆ• Denormalization ช่วยเพิ่มความเร็วในการ Query ยิ่งขึ้น• การตัดสินใจ Denormalization ขึ้นกับจุดประสงค์ที่ใช้งานตาราง
  39. 39. Denormalization• ข้อขัดแย้งระหว่าง Time กับ Space• เป้าหมายคือประสิทธิภาพระบบโดยรวมที่ดีที่สุด

×