โดย md040 » 28/11/2016 10:02 am
- Relational_Model.svg.png (22.2 KiB) Viewed 1291 times
Normalization (นอร์มัลไลเซชั่น) คือ ปรับโครงสร้างของตาราง ให้อยู่ในรูปแบบ “Normal Form” (นอร์มัลฟอร์ม) ให้อยู่ในลำดับต่างๆ ที่มีคุณสมบัติแตกต่างกันในแต่ละระดับ เพืื่อลดความซำ้ซ้อนของข้อมูล และลดความผิดพลาดของข้อมูล
- First Normal Form : 1NF (เฟิร์ส นอร์มัลฟอร์ม)
- คุณสมบัติ: ทุก Attribute (แอททริบิว) เก็บค่าเพียงค่าเดียว Single-Value (ซิงเกิลแวลู) หรือมีความเป็น Atomic (อะตอมมิค)
การทำ 1NF: มี 3 วิธี
เช่น ตาราง Department (ดีพาร์ทเม้นต์) ที่ยังไม่ได้นอร์มัลไลเซชั่น จะเห็นว่า Attribute (แอททริบิว) “Location” ยังไม่เป็น Atomic (อะตอมมิค)
==================================
|| DID || DNAME || DLOCATION ||
=================================
|| D01 || Store || Bangkok, Rayong, Yala ||
|| D02 || Warehouse || Bangkok, Changmai ||
=========================
1. Relation Composition (รีเรชั่น คอมโพซิส) คือ การนำแอททริบิวที่มีข้อมูลหลายค่ามาสร้างเป็นตารางใหม่
เช่น จากตาราง Department (ดีพาร์ทเม้นต์) แบ่งเป็น “ Department1” และ “ Department 2”
Department 1:
===================
|| DID || DNAME ||
===================
|| D01 || Store ||
|| D02 || Warehouse ||
===================
Department 2:
=====================
|| DID || DLOCATION ||
=====================
|| D01 || Bangkok ||
|| D01 || Rayong ||
|| D01 || Yala ||
|| D02 || Bangkok ||
|| D02 || Changmai ||
=====================
2. กำหนด Maximum (แม็กซิมัม) ให้แอททริบิวที่ยังไม่เป็น Atomic (อะตอมมิค)
เช่น กำหนดให้ “Location” ไม่เกิน 3 ที่ ก็จะได้ DLOCATION1, DLOCATION2 และ DLOCATION3
========================================================
|| DID || DNAME || DLOCATION1 || DLOCATION2 || DLOCATION3 ||
========================================================
|| D01 || Store || Bangkok || Rayong || Yala ||
|| D02 || Warehouse || Bangkok || Changmai || Null ||
=======================================================
3. เก็บข้อมูลที่ไม่เป็น Atomic (อะตอมมิค) แยกกัน และเพิ่มแอททริบิว “Location” เป็น Key (คีย์) ด้วย
เช่น
==============================
|| DID || DNAME || DLOCATION ||
==============================
|| D01 || Store || Bangkok ||
|| D01 || Store || Rayong ||
|| D01 || Store || Yala ||
|| D02 || Warehouse || Bangkok ||
|| D02 || Warehouse || Changmai ||
===============================
ข้อเสีย คือ ทำให้เกิดข้อมูลซำ้ซ้อนมากขึ้น
- Second Normal Form : 2NF (เซคันดารี่ นอร์มัลฟอร์ม)
- คุณสมบัติ: แอททริบิวทุกตัวต้องขึ้นกับคีย์หลักทุกตัว ไม่ขึ้นกับคีย์ใดคีย์หนึ่งในตาราง ขั้นตอนนี้ต้องกำจัดแอททริบิวที่ไม่ขึ้นกับคีย์หลัก
เช่น ตารางพนักงานในแผนก “Employee” ที่มีแอททริบิว “EID” เป็นคีย์หลัก แต่แอททริบิว “DNAME” ก็สามารถขึ้นกับ “DID” ได้
=========================================
|| EID || ENAME || DID || DNAME ||
=========================================
|| E01 || AAA || D01 || Store ||
|| E02 || BBB || D01 || Warehouse ||
=========================================
ต้องทำการแยกให้เป็น 2 ตารางแทนโดยที่
ตารางที่ 1 มี “EID” ทำหน้าที่เป็นคีย์หลัก กับ “ENAME”
ตารางที่ 2 มี “DID” ทำหน้าที่เป็นคีย์หลัก และ “DNAME”
- Third Normal Form : 3NF (เธิด นอร์มัลฟอร์ม)
- คุณสมบัติ: ปรับมาจาก 2NF ขึ้นตอนก็จะคล้ายกับ 2NF ที่แอททริบิวทุกตัวต้องขึ้นกับคีย์หลักทุกตัว ไม่ขึ้นกับคีย์ใดคีย์หนึ่งในตาราง ต้องกำจัดแอททริบิวที่ไม่ขึ้นกับคีย์หลักเช่นกัน
- Boyce-Codd Normal Form : BCNF (บอยซ์คอดด์ นอร์มัลฟอร์)
- คุณสมบัติ: แอททริบิวในตารางขึ้นกับ Candidate Key (แคนดิเดตคีย์)
Candidate Key (แคนดิเดตคีย์) คือ คีย์ที่มีค่าไม่ซำ้กัน สามารถนำมาแทนคีย์หลักได้ เช่น รหัสประจำตัวประชาชน
เช่น ตาราง “Employee” ที่มีแอททริบิว “IDCARD” หรือเลขประจำตัวประชาชนที่ไม่ซ้ำกัน สามารถนำมาทำเป็นคีย์หลักได้
===================================
|| EID || ENAME || IDCARD ||
==================================
|| E01 || AAA || 1234567890123 ||
|| E02 || BBB || 0123456789123 ||
==================================
- Fourth Normal Form : 4NF (โฟร์ นอร์มัลฟอร์ม)
- คุณสมบัติ: จะต้องไม่มีการขึ้นต่อกันเชิงกลุ่มภายในรีเลชัน
- Fifth Normal Form : 5NF (ฟิฟ นอร์มัลฟอร์ม)
- คุณสมบัติ: จะต้องไม่มีคุณสมบัติของการขึ้นต่อกันแบบเชื่อมโยง join (จอย)
การทำนอร์มัลไลเซชั่นเป็นขั้นตอนที่สำคัญในการออกแบบ
ฐานข้อมูล ทำให้ความซำ้ซ้อนของข้อมูลลดลงก็จริง แต่ไม่จำเป็นต้องทำถึงขั้นที่ 5 เสมอไปเพราะนอร์มัลไลเซชั่นยิ่งลำดับสูงขึ้นจำนวนตารางจะเพิ่มขึ้นแต่การเข้าถึงข้อมูลก็จะช้าลงด้วย ต้องพิจารณาตามความเหมาะสม และการเข้าถึงข้อมูลได้อย่างรวดเร็ว
ที่มาภาพ: commons.wikimedia.org/wiki/File:Relational_database_terms.svg
[attachment=0]Relational_Model.svg.png[/attachment]
[b][url=https://www.mindphp.com/%E0%B8%84%E0%B8%B9%E0%B9%88%E0%B8%A1%E0%B8%B7%E0%B8%AD/73-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3/3636-normalization-%E0%B8%99%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%A1%E0%B8%B1%E0%B8%A5%E0%B9%84%E0%B8%A5%E0%B9%80%E0%B8%8B%E0%B8%8A%E0%B8%B1%E0%B8%99-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3.html?hitcount=0&bb_limitstart=12660]Normalization[/url][/b] (นอร์มัลไลเซชั่น) คือ ปรับโครงสร้างของตาราง ให้อยู่ในรูปแบบ “Normal Form” (นอร์มัลฟอร์ม) ให้อยู่ในลำดับต่างๆ ที่มีคุณสมบัติแตกต่างกันในแต่ละระดับ เพืื่อลดความซำ้ซ้อนของข้อมูล และลดความผิดพลาดของข้อมูล
[b]- First Normal Form : 1NF (เฟิร์ส นอร์มัลฟอร์ม)[/b]
[list]คุณสมบัติ: ทุก Attribute (แอททริบิว) เก็บค่าเพียงค่าเดียว Single-Value (ซิงเกิลแวลู) หรือมีความเป็น Atomic (อะตอมมิค)
[b]การทำ 1NF[/b]: มี 3 วิธี
เช่น ตาราง Department (ดีพาร์ทเม้นต์) ที่ยังไม่ได้นอร์มัลไลเซชั่น จะเห็นว่า Attribute (แอททริบิว) “Location” ยังไม่เป็น Atomic (อะตอมมิค)
==================================
|| [b][u] DID[/u][/b] || [b]DNAME [/b] || [b] DLOCATION[/b] ||
=================================
|| D01 || Store || Bangkok, Rayong, Yala ||
|| D02 || Warehouse || Bangkok, Changmai ||
=========================
1. [url=https://www.mindphp.com/%E0%B8%9A%E0%B8%97%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B8%AD%E0%B8%AD%E0%B8%99%E0%B9%84%E0%B8%A5%E0%B8%99%E0%B9%8C/%E0%B8%AA%E0%B8%AD%E0%B8%99-sql/3677-%E0%B8%9A%E0%B8%97%E0%B8%97%E0%B8%B5%E0%B9%882-%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%AD%E0%B8%AD%E0%B8%81%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%95%E0%B8%B2%E0%B8%A3%E0%B8%B2%E0%B8%87%E0%B8%90%E0%B8%B2%E0%B8%99%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%A1%E0%B8%B9%E0%B8%A5.html]Relation[/url] Composition (รีเรชั่น คอมโพซิส) คือ การนำแอททริบิวที่มีข้อมูลหลายค่ามาสร้างเป็นตารางใหม่
เช่น จากตาราง Department (ดีพาร์ทเม้นต์) แบ่งเป็น “ Department1” และ “ Department 2”
Department 1:
===================
|| [b] [u]DID [/u][/b] || [b]DNAME [/b] ||
===================
|| D01 || Store ||
|| D02 || Warehouse ||
===================
Department 2:
=====================
|| [b][u]DID[/u] [/b] || [b] [u]DLOCATION [/u] [/b] ||
=====================
|| D01 || Bangkok ||
|| D01 || Rayong ||
|| D01 || Yala ||
|| D02 || Bangkok ||
|| D02 || Changmai ||
=====================
2. กำหนด Maximum (แม็กซิมัม) ให้แอททริบิวที่ยังไม่เป็น Atomic (อะตอมมิค)
เช่น กำหนดให้ “Location” ไม่เกิน 3 ที่ ก็จะได้ DLOCATION1, DLOCATION2 และ DLOCATION3
========================================================
|| [b][u]DID[/u][/b] || [b]DNAME [/b] || [b]DLOCATION1[/b] || [b]DLOCATION2[/b] || [b]DLOCATION3[/b] ||
========================================================
|| D01 || Store || Bangkok || Rayong || Yala ||
|| D02 || Warehouse || Bangkok || Changmai || Null ||
=======================================================
3. เก็บข้อมูลที่ไม่เป็น Atomic (อะตอมมิค) แยกกัน และเพิ่มแอททริบิว “Location” เป็น Key (คีย์) ด้วย
เช่น
==============================
|| [b][u]DID[/u][/b] || [b]DNAME[/b] || [b][u]DLOCATION [/u][/b] ||
==============================
|| D01 || Store || Bangkok ||
|| D01 || Store || Rayong ||
|| D01 || Store || Yala ||
|| D02 || Warehouse || Bangkok ||
|| D02 || Warehouse || Changmai ||
===============================
ข้อเสีย คือ ทำให้เกิดข้อมูลซำ้ซ้อนมากขึ้น[/list]
[b]- Second Normal Form : 2NF (เซคันดารี่ นอร์มัลฟอร์ม)[/b]
[list]คุณสมบัติ: แอททริบิวทุกตัวต้องขึ้นกับคีย์หลักทุกตัว ไม่ขึ้นกับคีย์ใดคีย์หนึ่งในตาราง ขั้นตอนนี้ต้องกำจัดแอททริบิวที่ไม่ขึ้นกับ[url=https://www.mindphp.com/%E0%B8%9A%E0%B8%97%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B8%AD%E0%B8%AD%E0%B8%99%E0%B9%84%E0%B8%A5%E0%B8%99%E0%B9%8C/86-pgadmin/2536-%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%84%E0%B8%AD%E0%B8%A5%E0%B8%B1%E0%B8%A1%E0%B8%99%E0%B9%8C-column-%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B8%84%E0%B8%B5%E0%B8%A2%E0%B9%8C%E0%B8%AB%E0%B8%A5%E0%B8%B1%E0%B8%81-primary-key-%E0%B9%83%E0%B8%99%E0%B8%95%E0%B8%B2%E0%B8%A3%E0%B8%B2%E0%B8%87-table.html?bb_limitstart=9920]คีย์หลัก[/url]
เช่น ตารางพนักงานในแผนก “Employee” ที่มีแอททริบิว “EID” เป็นคีย์หลัก แต่แอททริบิว “DNAME” ก็สามารถขึ้นกับ “DID” ได้
=========================================
|| [b][u]EID[/u][/b] || [b]ENAME [/b] || [b] DID[/b] || [b] DNAME[/b] ||
=========================================
|| E01 || AAA || D01 || Store ||
|| E02 || BBB || D01 || Warehouse ||
=========================================
ต้องทำการแยกให้เป็น 2 ตารางแทนโดยที่
ตารางที่ 1 มี “EID” ทำหน้าที่เป็นคีย์หลัก กับ “ENAME”
ตารางที่ 2 มี “DID” ทำหน้าที่เป็นคีย์หลัก และ “DNAME” [/list]
[b]- Third Normal Form : 3NF (เธิด นอร์มัลฟอร์ม)[/b]
[list]คุณสมบัติ: ปรับมาจาก 2NF ขึ้นตอนก็จะคล้ายกับ 2NF ที่แอททริบิวทุกตัวต้องขึ้นกับคีย์หลักทุกตัว ไม่ขึ้นกับคีย์ใดคีย์หนึ่งในตาราง ต้องกำจัดแอททริบิวที่ไม่ขึ้นกับคีย์หลักเช่นกัน[/list]
[b]- Boyce-Codd Normal Form : BCNF (บอยซ์คอดด์ นอร์มัลฟอร์)[/b]
[list]คุณสมบัติ: แอททริบิวในตารางขึ้นกับ Candidate Key (แคนดิเดตคีย์)
Candidate Key (แคนดิเดตคีย์) คือ คีย์ที่มีค่าไม่ซำ้กัน สามารถนำมาแทนคีย์หลักได้ เช่น รหัสประจำตัวประชาชน
เช่น ตาราง “Employee” ที่มีแอททริบิว “IDCARD” หรือเลขประจำตัวประชาชนที่ไม่ซ้ำกัน สามารถนำมาทำเป็นคีย์หลักได้
===================================
|| [b][u]EID [/u][/b] || [b] ENAME [/b] || [b]IDCARD[/b] ||
==================================
|| E01 || AAA || 1234567890123 ||
|| E02 || BBB || 0123456789123 ||
==================================[/list]
[b]- Fourth Normal Form : 4NF (โฟร์ นอร์มัลฟอร์ม)[/b]
[list]คุณสมบัติ: จะต้องไม่มีการขึ้นต่อกันเชิงกลุ่มภายในรีเลชัน[/list]
[b]- Fifth Normal Form : 5NF (ฟิฟ นอร์มัลฟอร์ม)[/b]
[list]คุณสมบัติ: จะต้องไม่มีคุณสมบัติของการขึ้นต่อกันแบบเชื่อมโยง join (จอย) [/list]
การทำนอร์มัลไลเซชั่นเป็นขั้นตอนที่สำคัญในการออกแบบ[url=https://www.mindphp.com/%E0%B8%84%E0%B8%B9%E0%B9%88%E0%B8%A1%E0%B8%B7%E0%B8%AD/73-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3/2055-database-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A323.html?bb_limitstart=100]ฐานข้อมูล[/url] ทำให้ความซำ้ซ้อนของข้อมูลลดลงก็จริง แต่ไม่จำเป็นต้องทำถึงขั้นที่ 5 เสมอไปเพราะนอร์มัลไลเซชั่นยิ่งลำดับสูงขึ้นจำนวนตารางจะเพิ่มขึ้นแต่การเข้าถึงข้อมูลก็จะช้าลงด้วย ต้องพิจารณาตามความเหมาะสม และการเข้าถึงข้อมูลได้อย่างรวดเร็ว
ที่มาภาพ: commons.wikimedia.org/wiki/File:Relational_database_terms.svg