HOME

DAT001

DAT001

28 ธันวาคม 2559

Database System-Normal Form

Normal Form
รูปแบบที่เป็นบรรทัดฐาน

     ก่อนจะเอาแบบฐานข้อมูลมาใช้เนี่ย ก็ต้องแปลงเป็นตาราง
     ก่อนจะแปลงก็ต้องมีขั้นตอนการตรวจสอบก่อน
     คือการ Normalization เพื่อลดความซ้ำซ้อน

     ทำไมต้องลดความซ้ำซ้อน ?
     >เพื่อความถูกต้องของข้อมูล
     ความซ้ำซ้อนมีผลต่อ database มาก ต้องลดให้ได้มากที่สุด
     ความถูกต้องเป็นหัวใจหลักของ database ไม่ใช่ความเร็ว

     การทำ Normalization นอกจากลดความซ้ำซ้อนแล้ว ยังลดเนื้อที่การเก็บข้อมูลอีกด้วย


ลองคิดดูว่าแบบไหนดีกว่า
คำตอบก็คือแบบขวา
เวลาเก็บข้อมูลแต่ละตารางควรเก็บตารางละเรื่องพอ
อย่างในภาพ แบบซ้าย ถ้าจะแก้ไข DeptName ที ก็ต้องแก้หลายที่



ความสัมพันธ์ระหว่างแต่ละคอลัมน์ในหนึ่งตาราง

     *แค่ภายในหนึ่งตารางเท่านั้นไม่เกี่ยวกับตารางอื่น

     1. Functional dependency : Attribute ที่สามารถระบุค่าของ Attribute อื่นๆได้ชัดเจนแน่นอน ไม่ซ้ำ
          
          Ex. รหัสนักศึกษา กับ อาจารย์ที่ปรึกษา
          Attribute รหัสนักศึกษา สามารถระบุ Attribute อาจารย์ที่ปรึกษาได้
          แต่ อาจารย์ที่ปรึกษา เอามาใช้ระบุ รหัสนักศึกษาไม่ได้
     
          ตัวที่ระบุค่าเรียกว่า Determinant ในที่นี่ก็คือ รหัสนักศึกษา
          ตัวที่ถูกระบุเรียกว่า Dependent ซึ่งก็คือ อาจารย์ที่ปรึกษา

          ปกติ Determinant มีเพียงหนึ่ง Attribute
          แต่ว่า Dependent มีกี่ Attribute ก็ได้ 
     
          เอารหัสนักศึกษา ไประบุ ชื่อนักศึกษา, นามสกุล, วันเดือนปีเกิด, ... 


*สัญลักษณ์จะเป็นลูกศร Determinant ชี้ Dependent

          แต่ว่า Determinant จะมีมากกว่าหนึ่ง Attribute ก็ได้
          ก็เหมือน Keyหลักแหละ
          อย่างเช่น ถ้าเป็น Composite Entity 
          Key หลัก ก็จะเป็น 2 Attribute รวมกัน
          Determinant ก็เหมือนกัน

     2. Fully Functional dependency : หลักการคือ ถ้าทุกคอลัมน์มีความสัมพันธ์กันหมดเรียกว่า Fully


          ยกตัวอย่างในภาพนี้เป็น fully เพราะทุกคอลัมน์มีความสัมพันธ์กัน
          คือเป็น Determinant กับ Dependent กัน

          โดยส่วนใหญ่ Keyหลัก ก็เป็น Fully อยู่แล้ว เพราะระบุได้ทุกคอลัมน์
          เพราะ Keyหลักเป็นตัวแทนข้อมูล

     3. Partial dependency* : ในบางครั้งKeyหลักเป็นKeyผสม (มีมากกว่า 1 Attribute)
                                         แล้วบางส่วนของ Keyหลัก มีความสัมพันธ์กับ Attribute อื่น


          Q.มีความสัมพันธ์แบบไหนบ้าง ในตารางนี้ ?

          A.อย่างแรก คือเป็น fully คือทุกคอลัมน์มีความสัมพันธ์กัน
          โดย รหัสนักศึกษา+รหัสชุดวิชา เป็น Determinant
          ชื่อชุดวิชา กับ หมู่เรียน เป็น Dependent

          แล้วมีความสัมพันธ์ซ่อนอยู่อีกมั้ยในตาราง ?
          คำตอบคือมี ก็คือ รหัสชุดวิชา กับ ชื่อชุดวิชา
          วิธีเช็คคือ ถ้าใส่ค่าAttribute นึงแล้ว จะระบุอีก Attribute ได้
          ใส่รหัสชุดวิชาแล้ว ต้องได้ ชื่อวิชาเดิม

          สรุปคือ มันมีความสัมพันธ์ซ่อนอยู่ในตารางเดียว 
          ซึ่งไม่ใช่เรื่องดี เพราะในเมื่อมันมีความสัมพันธ์กัน ทำไมไม่แยกตาราง
          เราควรจะเก็บแยกตารางไป ตารางละเรื่อง เพื่อป้องกันความซ้ำซ้อนทางข้อมูล

     4. Transitive dependency* : คล้ายๆกับ Partial ต่างกันตรงที่ตัวระบุค่าในความสัมพันธ์ที่ซ่อนอยู่ 
                                          ไม่จำเป็นต้องเป็นส่วนหนึ่งของ Keyหลัก

                                           พูดง่ายๆคือ คอลัมน์อะไรก็ได้ที่ไม่เกี่ยวกับ Keyผสม
                                           แต่ว่ามีความสัมพันธ์กับคอลัมน์อื่น ถือว่าเป็น Transitive


     *สรุปว่าที่สำคัญคือต้องแยกให้ออกว่าเป็น Partial หรือ Transitive

Normalization

     เป็นกระบวนการตรวจสอบและแก้ไขปัญหาเกี่ยวกับความซ้ำซ้อนกันของข้อมูล (data anormaly)



     ภาพด้านบนนี้ เป็นตัวอย่าง database ที่ไม่ดี
     เพราะจับทุกอย่าง มายัดในตารางเดียว ( นักศึกษา, อาจารย์, ชุดวิชา )

     การทำ Normalization จะมีการดำเนินงานตามลำดับดังนี้

          1. First Normal Form : 1NF
          2. Second Normal Form : 2NF
          3. Third Normal Form : 3NF
          4. Boyce/Codd Normal Form : BCNF
          5. Fourth Normal Form : 4NF
          6. Fifth Normal Form : 5NF

     *โดยส่วนใหญ่ทำถึงขั้น 3 ก็เพียงพอแล้ว 

     ทำ Normalization แล้วได้อะไร ? 
          หลักๆก็คือ ลดความซ้ำซ้อน
          ประหยัดเนื้อที่เก็บข้อมูล
          ลดปัญหาข้อมูลขาดความถูกต้องสมบูรณ์
          ลดปัญหาที่เกิดจากการปรับปรุง เพิ่มเติม และลบข้อมูล

     1. First Normal Form : 1NF

          คุณสมบัติ : ในแต่ละแถว ของทุกๆคอลัมน์ มีข้อมูลเพียงค่าเดียว 

อย่างในภาพนี้ ถือว่าไม่อยู่ใน 1NF
แถวนึง มีหลายค่า 
ภาพนี้ ถือว่าอยู่ใน 1NF แล้ว

     2. Second Normal Form : 2NF

          คุณสมบัติ : 1. ต้องอยู่ในรูปแบบ 1NF แล้ว
                           2. ไม่มี Partial dependency

          Partial คือ Keyหลักเป็น Keyผสม แล้วพอแยกกันมันก็มีความสัมพันธ์กับAttributeอื่นด้วย
          จากตารางที่แล้ว อะไรคือ Keyหลัก
          รหัสนักศึกษา+รหัสชุดวิชา >>> 2 ตัวรวมกันถึงเป็น Keyหลักได้ 
          แล้วแถม แยกกัน ก็ยังมีความสัมพันธ์กับ Attribute อื่นด้วย


          พอระบุได้ว่าอะไรคือ Keyหลัก และมันเป็น Partial ก็ต้องทำให้มันไม่เป็น Partial 
          โดยการ Split ตารางออก 
          ให้แยก Partial ออกไปทั้งก้อน ( ทั้ง Determinant และ Dependent )

          แต่ว่าถ้ามี Attribute ไหนในตารางเดิม ที่ไม่มีความสัมพันธ์กับ Partial
          เราต้องคง Keyหลักเอาไว้ ในตารางเดิมด้วย
          อย่างในภาพ หมู่เรียน ไม่มีความสัมพันธ์กับ Attributeไหนเลย
          เพราะฉะนั้น หลังจากแยก Partial ออก จะเหลือแต่ หมู่เรียน ไม่ได้
          ก็ต้องเหลือ Keyหลักเอาไว้


     3. Third Normal Form : 3NF

          คุณสมบัติ : ไม่มี Transitive

          หลังจากแยก Partial ออกมาแล้ว ถ้ายังมี Transitiveอยู่ 
          อย่างภาพด้านล่าง
          ตารางข้อมูลนักศึกษา รหัสอาจารย์ กับ ชื่ออาจารย์ มีความสัมพันธ์กัน ถือว่าเป็น Transitive
          ก็ให้แยกตารางออก


         

          แยกแล้วต้องคง รหัสอาจารย์ไว้ด้วย เพราะมันต้องเชื่อมกัน

         ถ้าเราไม่คง รหัสอาจารย์ไว้ เราก็หาข้อมูลไม่ได้ ว่านักศึกษารหัสนี้ มีอาจารย์ที่ปรึกษาเป็นใคร
         เพราะฉะนั้นแยกออกมาก็ให้คง Keyหลักไว้(Determinant)

          แล้ว ตาราง ชุดวิชา ต้องแยกมั้ย เพราะจริงๆแล้ว ชื่อวิชากับหน่วยกิต ก็มีความสัมพันธ์กัน
          จริงๆแล้ว จะแยกไม่แยกก็ได้ เพราะมันก็เรื่องเดียวกัน แยกก็ไม่ได้ผิดหลัก แต่ก็ไม่ควรแยก

          TIP เวลาจะแยกตารางให้ลองถามคำถามดังนี้
               1. เราจะจัดเก็บข้อมูลอะไร
               2. เราจะหาข้อมูลอะไร
               3. เราจะใช้ข้อมูลอะไร
          

     ส่วนใหญ่ ในการทำงาน ทำถึงขั้น 3NF ก็พอแล้ว ขั้น 4-6 ไม่ค่อยได้ใช้

     ข้อควรคำนึงในการทำ Normalization 

          Overnormalization : คือจำแนก Relation มากเกินไป ทำให้เสียเวลาในการหาข้อมูลมากขึ้น

          Denormalization : การลดขั้นของ Normalization เพื่อให้การใช้งานมีความสะดวกขึ้น
                                      อันนี้ต้องคิดดีๆ จะใช้ก็ต่อเมื่อ มี Relation ที่เก็บข้อมูลน้อยๆ 
                                      Ex. เพศ, คำนำหน้าชื่อ








ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Comments system