การออกแบบฐานข้อมูลในรูปแบบบรรทัดฐานเบื้องต้น
การออกแบบฐานข้อมูลในบทนี้คุณจะได้เรียนรู้วิธีการทำตารางข้อมูลให้อยู่ในรูปแบบบรรทัดฐาน (Normalization) ซึ่งเป็นวิธีการที่สำคัญมากถือเป็นหัวใจของระบบฐานข้อมูลเชิงสัมพันธ์ เพราะหากคุณสามารถทำได้ถูกต้อง จะส่งผลให้ระบบฐานข้อมูลของคุณถูกต้องตามหลักการและได้รับประโยชน์สูงสุดเท่าที่จะมีขึ้นได้
- ความหมายของรูปแบบบรรทัดฐาน
- การทำตารางข้อมูลให้อยู่ ในรูปแบบบรรทัดฐาน (Normalization) หมายถึง การออกแบบตาราง (Relation) ให้เป็น รูปแบบบรรทัดฐาน คือมีความเป็นปรกติไม่ก่อให้เกิดปัญหาข้อมูลขัดแย้ง (Inconsistency) ในที่เก็บต่าง ๆ ปัญหาการเพิ่ม - ปรับปรุง และลบข้อมูล (Insert,Updateand Delete Anomalies) ตลอดจนช่วยลดเน้อที่ในการจัดเก็บข้อมูลให้อยู่ในระดับที่ยอมรับได้อีกด้วยแนวคิดการทำตารางให้อยู่ในรูปแบบบรรทัดฐานนี้ อี .เอฟ.คอดด์ เป็ฯผู้คิดขึ้นมาเป็นคนแรกเมื่อประมาณปี ค.ศ. 1917 กล่าวคือ ได้คิดค้นรูปแบบบรรทัดฐานขั้นที่ 1,2และ3แต่ต่อมาพบว่ารูปแบบบรรทัดฐานขั้นที่ 3 มีข้อจำกัดบางอย่างจึงร่วมกันคิดค้นรูปแบบบรรทัดฐานขั้นที่ 3 ใหม่ขึ้นมาในราว ปี ค.ศ. 1974 กับบอยซ์ จึงนิยมเรียกว่า รูปแบบบรรทัดฐาน บอยซ์/คอดด์ (Boyce/codd Normal Form) สำหรับรูปแบบบรรทัดฐานขั้นที่ 4และ5นั้นคิดค้นโดย โรแนลด์ ฟาจิน (Ronald Fagin) ในปี ค.ศ.1977 และ 1979
รูปแบบบรรทัดฐานมีต่าง ๆ ระดับดังนี้
1. รูปแบบบรรทัดฐานขั้นที่ 1 (First Normal Form: 1NF)
2. รูปแบบบรรทัดฐานขึ้นที่ 2 (Second Normal Form: 2NF)
3 รูปแบบบรรทัดฐานขึ้นที่ 3(Third Normal Form: 2NF)
4. รูปแบบบรรทัดฐานขึ้นที่ 3 ใหม่ (Boyce/Codd Normal Form: 2NF)
5. รูปแบบบรรทัดฐานขึ้นที่ 4 Forth Normal Form: 2NF)
6. รูปแบบบรรทัดฐานขึ้นที่ 5 (FifthNormal Form: 2NF)
โครงสร้างของตาราง (Relvars) ซึ่งประกอบด้วยชื่อแอตทริบิวต์ต่าง ๆ ที่อยู่ในรูปแบบบรรทัดฐาน
ในขั้นต่าง ๆ มีลักษณะบอกระดับได้
นอกจากนี้ยังมีรูปแบบบรรทัดฐานอื่น ๆ ที่มีผู้คิดค้นขึ้นมาอีก ได้แก่ รูปแบบบรรทัดฐานโดเมน – คีย์ และรูปแบบบรรทัดฐานรีสตริกชั่น- ยูเนียน ซึ่งยังไม่มีงานศึกษาวิจัดสนับสนุนมากพอ ในปัจจุบันจึงถือว่า รูปแบบบรรทัดฐานขั้นที่ 5 นี้นับเป็นขึ้นสูงสุดแล้ว แต่ไม่จำเป็นเสมอไปที่ตารางหนึ่งในฐานข้อมูลของเราจะต้องสามารุทำให้อยู่ในรูปแบบบรรทัดฐานขั้นสูงสุดขึ้นอยู่กัลป์ปบลักษณะของข้อมูลในตาราง แบะปัญหาที่เตาต้องการแก้ไขในระบบฐานข้อมูลของเราว่ามีปัญหาการปรับปรุงข้อมูลในฐานข้อมูลนั้นหรือไม่ และการแก้ปัญหาจะทำได้ด้วยการทำให้ตารางข้อมูลอยู่ในรูปแบบบรรทัดฐานขั้นถัดไปหรือไม่
แต่อย่างไรก็ตาม ในการออกแบบฐานข้อมูล เราควรมุ่งทำให้แอตทริบิวต์ในตาราง อยู่ในรูปแบบบรรทัดฐานขั้นที่สูงที่สุดเท่าที่จะเป็นไปได้ โดยทำตามหลักเกณฑ์ของรูปแบบบรรทัดฐานขั้นต่าง ๆ ดังนี้
- รูปแบบบรรทัดฐานขั้นที่ 1
รูปแบบบรรทัดฐานขั้นที่ 1 (First Normal Form: 1NF)
มีเงื่อนไขว่า “ตารางใดจะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 1 ได้ ก็ต่อเมื่อค่าของข้อมูลในแต่ละแถวมีค่าเพียงค่าเดียว สำหรับแต่ละแอตทริบิวต์”(คือเป็นค่าแบบ Atomic)
เช่น
NotFrist
SNO |
STATUS |
CITY |
PNO |
QTY |
S 1 |
20 |
LONDON |
P1
P2
P3
P4
P5
P6 |
300
200
400
200
100
100 |
S 2 |
10 |
Paris |
P1
P2 |
300
400 |
S 3 |
10 |
Paris |
P2 |
200 |
S 4 |
20 |
London |
P2
P4
P5 |
200
300
400 |
ในตารางข้างบนนี้จะพบว่ามีการเก็บข้อมูลไว้หลายค่าในแถวเดียว โดยเฉพาะในแอตทริบิวต์ PNO
และ QTY จึงทำให้ตาราง NotFirst นี้ไม่อยู่ในรูปแบบบรรทัดฐานขั้นที่ 1 หากจะทำให้อยู่ในรูปแบบบรรทัดฐานขั้นที่ 1 จะต้องเป็นดังตาราง ต่อไปนี้
SNO |
STATUS |
CITY |
PNO |
QTY |
S1 |
20 |
London |
P1 |
300 |
S1 |
20 |
London |
P2 |
200 |
S1 |
20 |
London |
P3 |
400 |
S1 |
20 |
London |
P4 |
200 |
S1 |
20 |
London |
P5 |
100 |
S1 |
20 |
London |
P6 |
100 |
S2 |
10 |
Paris |
P1 |
300 |
S2 |
10 |
Paris |
P2 |
400 |
S3 |
10 |
Paris |
P2 |
200 |
S4 |
20 |
London |
P2 |
200 |
S4 |
20 |
London |
P4 |
300 |
S4 |
20 |
London |
P5 |
400 |
รูปแบบบรรทัดฐานขั้นที่ 2
รูปแบบบรรทัดฐานจะอยู่ในรูปแบบบรรทัดฐานที่2 ได้ก็ต่อเมื่อ
- ตารางนั้นมีลักษณะอยู่ในรูปแบบบรรทัดฐานขั้นที่1 แล้ว และ
- แอตทริบิวต์ที่ไม่ใช่คีย์หลัก (Nonkey) ทุกตัวต่างขึ้นอยู่กับคีย์หลักโดยไม่สามาระลดรูปได้อีก
จากตารางจะพบว่ามีการขึ้นต่อกันในลักษณะที่แอตทริบิวต์ที่ไม่ใช่คีย์หลัก ไปขึ้นอยู่กับแอตทริบิวต์อื่นที่ไม่ใช่คีย์หลักได้แก่ FD2,FD3และ FD4 ทำให้ตาราง ไม่อยู่ในรูปแบบบรรทัดฐานที่ 2
ค่าของข้อมูลจะมีการซับซ้อนกันอยู่มากจึงนำไปสู่การเปลี่ยนแปลงปรับปรุงการเพิ่มและลบข้อมูลดังนี้
- ปัญหาการเพิ่มข้อมูล จะไม่สามารถเพิ่มข้อมูลได้จนกว่า ผู้จัดส่ง โดยเพิ่มเฉพาะเลขรหัส (SNO) และเมืองที่อยู่ของผู้จัดส่ง แต่ว่างเว้นส่วนอื่น ๆ ไว้ก่อน ได้แก่ (STATUS,PNO และ QTY) ก็จะไม่สามารุทำได้ เนื่องจากจะละค่าข้อมูลในคีย์หลักแม้เพียงส่วนใดส่วนหนึ่งไม่ได้
- ปัญหาการลบข้อมูล จะไม่สามารถลบข้อมูลของผู้จัดส่งรายการใดรายการหึ่งได้ เพราะจะทำให้ข้อมูลอื่นที่อาจยังไม่ต้องการลบหายไปด้วย เช่น ชี่อเมืองกับชื่อ สถานะของเมือง
- ปัญหาการปรับปรุงข้อมูล จะไม่สะดวกในการปรับปรุงข้อมูลให้เป็นปัจจุบัน เพราะจะต้องตามแก้หลายที่ เช่น ถ้า S1ย้ายจาก London จะต้องหาทุกทูเพิลที่เกี่ยวข้องกับ S1 และ London แล้วแก้ตามให้เป็นปัจจุบัน หรือไม่เช่นนั้นจะพบกับปัญหาผลลัพธ์ไม่คงเส้นคงวา(Inconsistent Result) กล่าวคือ ในทูเพิลหนึ่งแจ้งว่า S1 ตั้งอยู่ ที่ London ส่วนอีกทูเพิลหนึ่งบอกว่า S1 ตั้งอยู่ที่ Amsterdam
หากเป็นเช่นนี้เราสามารถแก้ไขได้ด้วยวิธีการทำตารางให้อยู่ในรูปแบบบรรทัดฐานในขั้นที่สูงไปตามลำดับ โดยใช้เทคนิคที่เรียกว่า การแยกส่วนประกอบ (Decomposition) โดยการอยกที่ถูกต้องนั้นจะต้องทำแล้วไม่เกิดการสูญเสียการขึ้นต่อกันบางประการไป (Nonloss Decompoosition) คือต้องสามารถทำย้อนกลับได้ผลคงเดิม (Reversible)ด้วยวิธีการเชื่อมตาราง (Join)ตาราง Second จะเก็บข้อมูลเฉพาะแอนทิตี้ของผู้จัดส่งและตาราง SP จะเก็บข้อมูลเฉพาะส่วนที่เกี่ยวกับการจัดส่งสินค้าดังแผนภาพนี้
Second
SNO |
STATUS |
CITY |
S1 |
20 |
London |
S2 |
10 |
Paris |
S3 |
10 |
Paris |
S4 |
20 |
London |
SP
SNO |
PNO |
QTY |
S1 |
P1 |
300 |
S1 |
P2 |
200 |
S1 |
P3 |
400 |
S1 |
P4 |
200 |
S1 |
P5 |
100 |
S1 |
P6 |
100 |
S2 |
P1 |
300 |
S2 |
P2 |
400 |
S3 |
P2 |
200 |
S4 |
P2 |
200 |
S4 |
P4 |
300 |
S4 |
P5 |
400 |
รูปแบบบรรทัดฐานขั้นที่ 3
มีเงื่อนไขว่า “ตารางใดจะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 3ได้ก็ต่อเมื่อ
- ตารางนั้นมีลักษณะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 2
- แอตทริบิวต์ที่ไม่ใช่คีย์หลัก (Nonkey) ทุกตัว จะต้องขึ้นอยู่กับคีย์หลักแบบไม่มีการถ่ายทอด
ตารางในลักษณะที่กล่าวถึงนี้มองเฉพาะที่มีคีย์หลักเป็นคีย์เดี่ยว ไม่ใช่คีย์ประกอบ
สังเกตว่าในตาราง Secondมีการขึ้นต่อกันดังนี้
FD1:SNO ->CITY
FD2:CITY->S TATUS
FD3:SNO->STATUS
ซึ่งจะสังเกตุได้ว่า FD3 ได้มาจากกฎการถ่ายทอดที่ระบุว่า “ถ้า A->B และ B->A แล้ว A->C ซึ่งอาจกล่าวอีกอย่างหนึ่งได้ว่า A->C ผ่านทาง A
ดังนั้น เราสามารถจะแยกส่วนประกอบของตาราง Second ให้เป็นตารางได้อีก 2 ตารางโดยเรามีทางเลือกทำได้ 2 แบบดังนี้
แบบที่ 1 แยกตาราง Second ออกเป็น
SC{SNO,CITY}และ
CS{CITY,STATUS}
แบบที่ 2 แยกตาราง Second ออกเป็น
SC{SNO,CITY}
SS{SNO,STATUS}
ปัญหาก็คือ เราต้องตอบคำถามให้ได้ว่าการแยกส่วนประกอบแบบใดจึงจะถูกต้องกล่าวคือ หลังจากแยกออกไปแล้ว ต้อง....
- ไม่เกิดการสูญเสียการขึ้นต่อกับบางประการไป
- สามารถทำย้อนกลับได้ผลคงเดิมด้วยวิธีการเชื่อมตาราง
มีทฤษฎีของริสสะเนน (Risssnrn,1977)ระบุว่าการทำ Projectionเพื่อให้ให้ได้ตาราง R1 และ R2 ออกมาจกตาราง R นั้นจะทำได้อย่างเป็นอิสระคือ
- การขึ้นต่อกันทุกรายการที่เดิมมีอยู่ในตาราง R เป็นผลลัพธ์ทางตรรกของการขึ้นต่อกันที่มาจากตาราง R1 และ R2
- แอตทริบิวต์ร่วมของตาราง R 1 และ R2 อย่างน้อยต้องเป็นคีย์คู่แข่งของตาราง R1 และ R 2
เมื่อพิจารณาดูแล้วจะเห็นว่า การแบ่งแบบที่ 2 คือ SC,SS ไม่ผ่านคุณสมบัติตามกฎของริสสะเนนในข้อ 1 นอกจากนั้นการอบ่งแบบที่ 2 จะไม่สามารถอนุมานได้ว่ามีการขึ้นต่อกันแบบ
FD2:CITY->STATUS
ดังนั้นการแยกส่วนประกอบออกเป็นตารางในแบบที่ 1 จึงถูกต้องตามหลักการดังกล่าวผลจากการดำเนินการข้างต้นนี้ทำให้ได้ตารางที่อยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 คือ
SC
SNO |
CITY |
S1 |
London |
S2 |
Paris |
S3 |
Paris |
S4 |
London |
CS
CITY |
STATUS |
London |
20 |
Paris |
10 |
รูปแบบบรรทัดขั้นที่ 3 ใหม่
รูปแบบบรรทัดขั้นที่ 3 ใหม่เกิดขึ้นเนื่องจากรูปแบบบรรทัดฐานขั้นที่ 3 เดิมนั้นไม่สามารถจัดการกับปัญหาของโครงสร้างตารางที่มีคุณสมบัติต่อไปนี้ได้
1.มีคีย์คู่แข่ง 2 คีย์ขึ้นไป
2.คีย์คู่แข่งนั้นเป็นคีย์ประกอบ
3.คีย์คู่แข่งซึ่งเป็นคีย์ประกอบนั้นต้องมีตัวร่วมคือ มีแอตทริบิวต์ร่วมอย่างน้อย 1 ตัว
บอยส์และคอร์ดจึงร่วมกันคิดรูปแบบบรรทัดฐานขั้นที่ 3 ใหม่ขึ้นมาซึ่งมีกฎดังนี้
“ตารางใดจะอยู่ในรูปแบบบรรทัดฐานขึ้นที่ 3 ใหม่ได้ ก็ต่อเมื่อการขึ้นต่อกันที่สำคัญและลดรูปไม่ได้ทางด้านซ้าย มีคีย์คู่แข่งเป็นตัวกำหนดซึ่งอยู่ทางด้านซ้ายมือของนิพจน์การขึ้นต่อกัน
ตัวอย่างตาราง S{SNO,SNAME,CITY,STATUS}
S
SNO |
SNAME |
STATUS |
CITY |
S1 |
Smith |
20 |
London |
S2 |
Jones |
10 |
Paris |
S3 |
Blake |
30 |
Paris |
S4 |
Clark |
20 |
London |
S5 |
Adams |
30 |
Athens |
ซึ่งมีการขึ้นต่อกันดังนี้ (โดยสมมติว่า SNAME ไม่มีค่าของข้อมูลซ้ำ และ CITY กับ STATUS ไม่ยึดติดกัน
FD1:SNO->SNAME
FD2:SNAME->SNO
FD3:SNO->STATUS
FD4:SNO->CITY
FD5:SNAME->STATUS
FD6:SNAME->CITY
จะเห็นได้ว่าตัวกำหนด Determinals ซึ่งอยู่ด้านซ้ายมือของลูกศรได้แก่ SNO และ SNANE นั้นต่างก็เป็นคีย์คู่แข่งทั้นคู่
ตัวอย่าง SSP
SNO |
SNAME |
PNO |
QTY |
S1 |
Smith |
P1 |
300 |
S1 |
Smith |
P2 |
200 |
S1 |
Smith |
P3 |
400 |
S1 |
Smith |
P4 |
200 |
…… |
……… |
……… |
…….. |
ซึ่งมีการขึ้นต่อกันแบบฟังก์ชันดังนี้
FD1:SNO->SNAME
FD2:SNAME->SNO
FD3:{SNO,PNO}->QTY
FD4:{SNAME,PNO}->QTY
สังเกตได้ว่าค่าของข้อมูลใน SNAMEมีค่าซ้ำนอกจากนั้นยังมีคีย์คู่แข่ง ได้แก่ {SNO,PNO}แต่ตารางนี้ไม่อยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 ใหม่เพราะมีตัวกำหนดทางด้านซ้ายขจองลูกศร คือ (SNAME,SNO)ซึ่งไม่ใช่คีย์คู่แข่ง ล่าวคือ FD1 มีตัวกำหนดคือ SNOซึ่งไม่ใช่คีย์ค๔แข่ง และ FD2 มีตัวกำหนดคือ SNAME ซึ่งไม่ใช่คีย์คู่แข่งกีย
วิธีแก้คือ การแยกส่วนประกอบของตาราง SSP ออกเป็น 2 ตารางคือ
SS{SNO,SNAME}
SP{SNO,PNO,QTY}
|