การออกแบบ database 2/2 [ Database the series ]

Database the series 6 ธ.ค. 2022

สำหรับ Part นี้เรามาต่อเนื้อหาการออกแบบ database กันใครที่ยังไม่ได้อ่าน Part ก่อนหน้าไปอ่านกันได้นะครับ โดยสำหรับ part นี้จะเป็นเรื่องของการทำ Normalization และ Normal form สำหรับ Relational Database

Normalization

คือ Process ในการแปลง ปรับ table ที่ไม่ดี ให้เล็กลง (decomposing) เพื่อให้มีคุณสมบัติตามต้องการโดยการเปลี่ยน table ใหญ่ เป็น table เล็ก

Normal forms

รูปแบบมาตรฐาน ที่ใช้ key และ FD ของ relation ใน table เพื่อตัดสินใจว่าโครงสร้างอยู่ใน normal form ที่ดีหรือเปล่า โดย มีรูปแบบดังนี้

  • 2NF, 3NF, BCNF
    ใช้ key และ FD ในการพิจารณา
  • 4NF
    ขึ้นอยู่กับ keys , multi-valued : MVDs
  • 5NF
    ขึ้นอยู่กับ key , join dependencies : JDs

การนำ Normal forms ไปใช้งาน

Normalization : การออกแบบเพื่อที่จะให้มีคุณภาพสูงขึ้นเพื่อให้ได้ประสิทธิภาพตามที่ต้องการ ในการใช้งานจริงนิยมไปถึง 3NF และ BCNF โอกาศที่จะไปถึง 4NF มีน้อย

Denormalization : กระบวนการที่รวม Table เล็กมาเป็น table ใหญ่ๆจาก NF สูงๆ ลงมาสู่จุดเริ่มต้นใน NF ที่ต่ำกว่า

Definitions ของ Keys และ Attributes Participating

Superkey : คือกลุ่มของ attribute ที่สามารถใช้จำแนกความแตกต่างของแต่ tuple ได้ และ Unique

Key K : คือ superkey ที่มีคุณสมบัติที่ ถ้าลบ attribute ใดๆ ออกจาก K จะทำให้ K ไม่เป็น superkey อีกต่อไป หรือก็คือ minimal superkey

ใน relation schema มี key อยู่มากกว่า 1 key จะถูกเรียกว่า candidate key หนึ่งใน candidate key จะถูกนำไปใช้เป็น primary key และ ที่เหลือจะถูกเรียกว่า secondary keys

Prime attribute จะต้องเป็นหนึ่งใน candidate key

Nonprime attribute คือ attribute ที่ไม่เป็น prime attribute และไม่เป็น candidate key

First Normal Form (1NF)

  • ไม่ให้มี
     - composite attributes
     - multivalued attributes
     - nested relations
  • เป็นส่วนหนึ่งในการนิยาม relation
  • DBMS ส่วนใหญ่จะอนุญาติให้เฉพาะ relation ใน First Normal Form

ตัวอย่าง

Ex 1NF

(a) DEPARTMENT คือ relational schema ที่ยังไม่อยู่ใน 1NF
(b) คือ state ของ (a) โดยจะเห็นได้ว่า ไม่เป็น 1NF เนื่องจาก Dlocations เป็น multivalued attributes โดย (b) สามารถแก้ไขให้เป็น 1NF ได้โดยการแยก Dlocations ออกมาเป็น Dlocation ตามในรูป (c)

Second Normal Form (2NF)

ℹ️
Full functional dependency (Full FD) คือ สมมุติให้ Y depent บน X ถ้า ดึงบางตัวใน X ออกแล้ว Y ยังคง depent บน X อยู่ถือว่าไม่เป็น Full FD แต่จะเป็น partial dependency
ตัวอย่าง : {SSN , PNUMBER} -> ENAME ไม่เป็น Full FD เพราะ SSN -> ENAME โดยไม่จำเป็นต้องมี PNUMBER
  • ต้องเป็น 1NF ก่อน
  • ใช้ FD , Primary key
  • non-prime attribute ทุกตัว จะต้อง fully functionally dependent (Full FD) บน primary key
  • แบ่ง table ออกมา (decomposed) ออกมาเป็น 2NF ผ่านวิธีการที่เรียกว่า 2NF normalization

ตัวอย่าง

Ex 2NF

จากรูป (a) ยังไม่เป็น 2NF เนื่องจาก Ename ซึ่งเป็น non-prime attribute สามารถ depent บน Ssn โดยไม่จำเป็นต้องมี Pnumber ได้ จึงไม่เป็น Full FD และไม่เป็น 2NF โดย normalization ให้เป็น 2NF โดยการแยก attribute ที่ไม่ Full FD ออกมา และทำให้ table ที่แยกออกมาที่เหลือ Full FD กัน

Third Normal Form (3NF)

ℹ️
Transitive functional dependency คือ การที่ X -> Z และยังมี X -> Y , Y -> Z
ตัวอย่าง : SSN -> DMGRSSN เป็น Transitive FD เพราะ SSN -> DNUMBER และ DNUMBER -> DMGRSSN
  • ต้องเป็น 2NF ก่อน
  • ไม่มี non-prime attribute ตัวไหน transitively dependent บน the primary key
  • แบ่ง table ออกมา (decomposed) ออกมาเป็น 3NF ผ่านวิธีการที่เรียกว่า 3NF normalization

ตัวอย่าง

จากรูป (b) ยังไม่เป็น 3NF เพราะ Ssn -> Dname เป็น Transitive FD เนื่องจาก Ssn -> Dnumber , Dnumber -> Dname โดย normalization ให้เป็น 3NF โดยการแยก attribute ที่ Transitive FD กับ Primary key ออกมาเป็นอีก 1 table

Boyce-Codd Normal Form (BCNF)

ℹ️
trivial dependency คือ การที่ X -> Y และ Y คือ subset ของ X
  • เมื่อไหร่ก็ตามที่ nontrivial functional dependency ทั้งหมด X -> A และ X ไม่เป็น superkey

ตัวอย่าง

Ex BCNF

จากรูป (a) ไม่เป็น BCNF เพราะ County_name -> Area , Area -> County_name และ Area ไม่เป็น superkey ซึ่งเป็น trivial dependency จึงไม่เป็น BCNF แก้ให้เป็น BCNF โดยการ decomposition

จากรูป {Student , Course} -> Instructor และ Instructor -> Course ซึ่ง schema นี้เป็น 3NF แต่ไม่เป็น BCNF คำถามคือจากรูปจะ decomposition อย่างไร

ความเป็นไปได้ในการ decomposition มี 3 วิธี
 - D1: {student, instructor} and {student, course}
 - D2: {course, instructor } and {course, student}
 - D3: {instructor, course } and {instructor, student}
คำถามต่อไปคือจะเลือกแบบไหน?

วิธีในการเลือกคือ checking non-additivity of Binary Relational Decompositions

ถ้า R แยกออกเป็น R1 , R2 เมื่อ join กลับมาข้อมูลจะต้องเหมือนเดิม เมื่อ

ทดสอบ decomposition ทั้ง 3 วิธี
 - D1: {student, instructor} and {student, course}
  Student -> Instructor or Student -> Course
 - D2: {course, instructor } and {course, student}
  Course -> Instructor or Course -> Student
 - D3: {instructor, course } and {instructor, student}
  Instructor -> Course or Instructor -> Student

จากทั้งหมด เป็นจริงเมื่อ Instructor -> Course เท่านั้น ดังนั้น D3 จึงเป็นการ decomposition ที่ดี

Multivalued Dependencies and Fourth Normal Form (4NF)

Ex 4NF

จากรูป ใน EMP เป็น all-key relation จึงไม่มี FD และเป็น BCNF ด้วย แต่ใน EMP มีความซ้ำซ้อนของข้อมูลอย่างเห็นได้ชัด

ใช้ multivalued dependency (MVD) ถูกนำมาใช้ในรูปแบบนี้ และ มีการกำหนด Fourth Normal Form (4NF) ขึ้นมา

ℹ️
multivalued dependency (MVD) X ->> Y บน relation schema R เมื่อ ทั้ง X และ Y เป็น subset ของ R

เมื่อ X ->> Y เรียกว่า X multidetermines Y

X ->> Y ใน R จะเรียกว่า trivial MVD ถ้า
 - Y เป็น subset ของ X หรือ X ∪ Y = R

  • จะเป็น 4NF เมื่อ set of dependencies F (รวม FD และ MVD) ถ้า nontrivial multivalued dependency X ↠ Y in F+ , X  เป็น superkey ของ R

ตัวอย่าง

จากรูป (a) ไม่เป็น 4NF เพราะ non-trivial Ename ->> Pname|Dname แก้โดยการ Decompose ออกมาเป็น trivial MVD Ename ->> Pname และ Ename ->> Dname

Join Dependencies and Fifth Normal Form (5NF)

ℹ️
join dependency (JD) table ในทุกๆ state เมื่อ split เป็น n table เมื่อ join กลับมาต้องได้ table เดิม -> nonadditive
  • เป็น 5NF เมื่อ set F of functional, multivalued, and join dependencies if,
    for every nontrivial join dependency JD (R1 , R2 , ... , Rn) in F+ (that is, implied by F) และ Ri เป็น superkey ของ R

ตัวอย่าง

จบไปแล้วสำหรับเนื้อหาในเรื่องนี้นะครับ โดยในเรื่องนี้คิดว่าค่อนข้างยากมากๆ ถ้าผิดพลาดตรงไหนขออภัยด้วยนะครับ หวังว่าจะมีประโยชน์กับคนที่ได้เข้ามาอ่านนะครับ ขอบคุณทุกคนที่อ่านจนจบนะครับ

Tags

Witchayut Gerdchai

Software Engineer คนนึง