รูปแบบที่เป็นบรรทัดฐาน
ก่อนจะเอาแบบฐานข้อมูลมาใช้เนี่ย ก็ต้องแปลงเป็นตาราง
ก่อนจะแปลงก็ต้องมีขั้นตอนการตรวจสอบก่อน
คือการ 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. เพศ, คำนำหน้าชื่อ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น