นอร์มัลไลเซชัน (Normalization)

     การออกแบบฐานข้อมูลที่ดี ต้องมีความซ้าซ้อนในการจัดเก็บข้อมูลน้อยที่สุด หรือไม่มีความซ้ำซ้อนเลย ซึ่งต้องอาศัยหลักการในการทานอร์มัลไลเซชันดังรายละเอียดต่อไปนี้
          1. แนวคิดเกี่ยวกับนอร์มัลไลเซชัน
     นอร์มัลไลเซชันเป็นวิธีการที่ใช้ในการตรวจสอบและแก้ไขปัญหาเกี่ยวกับความซ้าซ้อนของข้อมูล โดยดำเนินการให้ข้อมูล ในแต่ละรีเลชั่น (relation) อยู่ในรูปที่เป็นหน่วยที่เล็กที่สุดที่ไม่สามารถแตกออกเป็นหน่วยย่อยๆ ได้อีก โดยยังคงความสัมพันธ์ระหว่างข้อมูลในรีเลชั่นต่างๆ ไว้ตามหลักการที่กาหนดไว้ใน relational model การทำนอร์มัลไลเซชันนี้ เป็นการดำเนินการอย่าง เป็นลำดับ ที่กำหนดไว้ด้วยกันเป็นขั้นตอน ตามปัญหาที่เกิดขึ้นในขั้นตอนนั้นๆ ซึ่งแต่ละขั้นตอน จะมีชื่อตามโครงสร้างข้อมูลที่กำหนดไว้ดังนี้ 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 NF เพราะจริงๆ แล้ว ในการทำงานทั่วๆ ไป แค่ 3 NF ก็สามารถใช้งานได้แล้ว แต่สำหรับ BCNF ไปจนถึง 5NF เป็นฐานข้อมูลชนิดพิเศษจริงๆ ที่แทบจะไม่มีในชีวิตประจำวัน โอกาสพบประมาณ 0.01 % ดังนั้นในที่นี้จะศึกษาเพียงแค่ 1NF 2NF และ 3NF เท่านั้น เพื่อใช้เป็นแนวทางในการศึกษาระดับอื่นต่อไป

          2. รูปแบบของนอร์มัลฟอร์ม (Normal Form : NF)
     2.1 First Normal Form (1NF)
     ตารางที่ผ่านการทำนอร์มัลไลเซชันระดับที่ 1 หรือ First Normal Form ต้องมีคุณสมบัติดังนี้

ไม่มีคอลัมน์ใดในตารางที่มีค่ามากกว่า 1 ค่า คือ ค่าในแต่ละคอลัมน์ต้องเป็น atomic หรือไม่อยู่ในรูปของ repeating group

     หมายความว่าข้อมูลที่เก็บในแต่ละคอลัมน์จะต้องมีลักษณะเป็นค่าเดียว (single valued) ไม่สามารถแบ่งย่อยได้อีก

     ในการทำนอร์มัลไลเซชันจะต้องดูข้อมูลในตารางเป็นหลัก ตัวอย่างเช่น ข้อมูลในตารางต่อไปนั้น แสดงการเก็บข้อมูลเกี่ยวกับนักศึกษา ซึ่งแต่ละคนสามารถอยู่ชมรมและมีงานอดิเรกได้มากกว่า 1 อย่าง
     จากตารางดังกล่าว จะเห็นว่าข้อมูลในคอลัมน์ชมรมและงานอดิเรกมีค่ามากกว่า 1 ค่า แสดงว่าไม่เป็น atomic หรืออยู่ในรูปของ repeating group ดังนั้นตารางที่ 1.5 จึงไม่เป็น 1NF โดยเราจะเรียกตารางที่ยังไม่ผ่านแม้แต่ 1NF ว่า Unnormalized Form (UNF) ซึ่งมีวิธีการ ที่จะทาให้เป็น 1NF คือ
          1) แยกคอลัมน์ที่มีค่ามากกว่า 1 ค่าออกเป็นแถวใหม่
          2) เพิ่มข้อมูลที่เหมาะสมเข้าไปในคอลัมน์ที่ว่างอยู่ของแถวที่เกิดขึ้นใหม่
     จากตารางที่ 1.5 ที่ไม่มีคุณสมบัติเป็น 1NF สามารถทาให้มีคุณสมบัติเป็น 1NF ได้ดังตารางที่ 1.6 ซึ่งมีรหัสนักศึกษา ชมรม และงานอดิเรก เป็นคีย์หลัก

     สาเหตุที่แยกคอลัมน์ที่มีค่ามากกว่า 1 ค่าออกเป็นแถวใหม่ เนื่องจากไม่รู้จานวนที่แน่นอนของค่าที่มีอยู่ในคอลัมน์นั้น เช่น ไม่ทราบว่านักศึกษาแต่ละคนจะมีงานอดิเรกกันคนละไม่เกินกี่อย่าง แต่ถ้าเราทราบจeนวนที่แน่นอนของคอลัมน์ที่มีหลายค่านั้น เราอาจแยกเป็นคอลัมน์ใหม่ได้เลย ตัวอย่างเช่น การเก็บชื่อผู้แต่งของหนังสือในห้องสมุด ซึ่งหนังสือเล่มหนึ่งอาจจะมีผู้แต่งหลายคน แต่ในการเก็บชื่อผู้แต่งจะเก็บเพียง 3 คนเท่านั้น ในกรณีนี้ควรจะแบ่งคอลัมน์ซึ่งเก็บชื่อผู้แต่งออกเป็นหลายคอลัมน์โดยขึ้นกับจeนวนผู้แต่งที่มากที่สุดที่มีอยู่หรือเราต้องการเก็บข้อมูลเอาไว้ ซึ่งจะทeให้ค่าของแต่ละคอลัมน์ เป็น Atomic ดังตารางต่อไปนี้

     ถึงแม้ว่าตารางข้างต้น จะได้รับการออกแบบให้อยู่ในรูป 1NF แล้ว แต่ลักษณะของข้อมูลภายในอาจก่อให้เกิดปัญหาขึ้นได้อีก เช่น ข้อมูลที่เกี่ยวกับนักศึกษารหัส 55001 ถูกจัดเก็บไว้ในแถวที่ 1, 2 และ 3 ได้แก่ ชื่อ และที่อยู่ โดยจะเห็นว่าเป็นการเก็บข้อมูลที่ซ้าซ้อนกัน ทำให้สิ้นเปลืองเนื้อที่ในการจัดเก็บ และก่อให้เกิดปัญหาในการเปลี่ยนแปลงข้อมูลด้วย เช่น ถ้านักศึกษารหัส 55001 มีการเปลี่ยนชื่อ หรือที่อยู่ ก็ต้องทำการแก้ไขข้อมูลหลายแถว ซึ่งถ้ามีการแก้ไขข้อมูลไม่ครบ ก็อาจทำให้ข้อมูลภายในตารางเกิดความขัดแย้งกันได้ ดังนั้นจึงต้องมีการนอร์มัลไลเซชันระดับที่ 2 ต่อไป

     2.2 Second Normal Form (2NF)
          ตารางที่ผ่านการทานอร์มัลไลเซชันระดับที่ 2 หรือ Second Normal Form ต้องมีคุณสมบัติดังนี้
                          1) ต้องมีคุณสมบัติของ 1NF
               2) ทุก nonprime attribute จะต้องขั้นกับ prime (primary key) ทุกตัว

     นั่นคือแอตทริบิวต์ที่ไม่ใช่คีย์หลักจะต้องมีค่าขึ้นอยู่กับคีย์หลักเท่านั้น โดยถ้าคีย์หลักประกอบด้วยแอตทริบิวต์ที่มากกว่า 1 ตัวก็จะต้องขึ้นอยู่กับแอตทริบิวต์ทั้งหมดที่เป็นคีย์หลัก ไม่ใช่ขึ้นอยู่กับบางตัว
     การที่จะรู้ว่าแอตทริบิวต์ใดขึ้นอยู่กับแอตทริบิวต์ใดนั้น ต้องใช้ความรู้ในเรื่องฟังก์ชันการขึ้นต่อกัน หรือ functional dependency ซึ่งเป็นสิ่งที่ใช้แสดงความสัมพันธ์ระหว่าง แอตทริบิวต์ ในรูปแบบฟังก์ชัน เพื่อช่วยในการตัดสินใจว่าแอตทริบิวต์ที่ไม่ใช่คีย์หลักควรจะปรากฏเป็นคอลัมน์อยู่ในตารางหรือควรจะแยกออกมาสร้างเป็นตารางใหม่
     สมมุติว่า X และ Y เป็นแอตทริบิวต์ในตารางหนึ่ง ถ้า Y ขึ้นอยู่กับ X จะสามารถเขียนฟังก์ชันการขึ้นต่อกันได้ดังนี้

     การที่ Y ขึ้นอยู่กับ X หมายความว่า ทุกๆค่าของ X ที่เราเลือกขึ้นมา จะสามารถหาค่าของ Y มา 1ค่าที่สอดคล้องกับค่าของ X ได้เสมอ เช่น จากตารางที่ 1.8 เป็นตารางที่เก็บข้อมูลเกี่ยวกับนักศึกษา ถ้าถาว่านักศึกษาคนใดที่มีรหัสนักศึกษาเป็น 55111 ก็สามารถตอบได้ทันทีว่าคือ นักศึกษาที่ชื่อว่า สามารถประเสริฐกุล ดังนั้นชื่อนักศึกษาจึงขึ้นอยู่กับรหัสนักศึกษา ซึ่งเขียนเป็นฟังก์ชันการขึ้นต่อกันได้ว่า รหัสนักศึกษา > ชื่อ นั่นเอง

     เมื่อเข้าใจในเรื่องฟังก์ชันการขึ้นต่อกันแล้ว เราลองมาพิจารณาว่าตารางต่อไป จะมีคุณสมบัติเป็น 2NF หรือไม่

     ก่อนอื่นเราต้องพิจารณาว่าตารางที่ 1.9 มีคุณสมบัติเป็น 1NF หรือไม่ จากข้อมูลในตารางจะเห็นว่าไม่มีคอลัมน์ใดในตารางที่มีค่ามากกว่า 1 ค่า แสดงว่าผ่านคุณสมบัติเป็น 1NF จากนั้นต้องพิจารณาต่อว่ามีแอตทริบิวต์ใดเป็น prime หรือคีย์หลัก ส่วนที่เหลือก็จะเรียกว่า nonprime จากตารางที่ 1.9 จะมีแอตทริบิวต์ รหัสลูกค้า และ รหัสสินค้า เป็น prime ส่วน ชื่อลูกค้า ที่อยู่ ชื่อสินค้า และจานวนสินค้า เป็น nonprime
     จากคุณสมบัติของ 2NF คือ nonprime ต้องขึ้นกับ prime ทุกตัว ในการพิจารณาว่าเป็น 2NF หรือไม่ จะต้องพิจารณา nonprime ทีละตัว ซึ่งมีผลสรุปการขึ้นต่อกันดังนี้

     จากข้อมูลในตารางข้างต้น จะสังเกตว่าชื่อลูกค้า, ระดับ และประเภทจะขึ้นกับ รหัสลูกค้าเพียงอย่างเดียว ไม่ขึ้นกับรหัสสินค้าเลย ทาให้ไม่เป็นไปตามคุณสมบัติของ 2NF และนอกจากนี้ยังมีกรณีอื่นอีกที่ทาให้ตารางข้างต้น ไม่เป็นไปตามคุณสมบัติของ 2NF ได้แก่

     จากข้อมูลในตาราข้างต้นจะสังเกตว่าชื่อสินค้าจะขึ้นกับรหัสสินค้าเพียง อย่างเดียว ไม่ขึ้นกับรหัสลูกค้าเลย ทำให้ไม่เป็นไปตามคุณสมบัติของ 2NF มีเพียงจำนวนสินค้าอย่างเดียวที่ขึ้นกับรหัสลูกค้า และรหัสสินค้า สรุปว่า
                                        รหัสลูกค้า,รหัสสินค้า      > จำนวนสินค้า
                                        รหัสลูกค้า                         > ชื่อลูกค้า, ระดับ, ประเภท
                                        รหัสสินค้า                         > ชื่อสินค้า

ดังนั้นถ้าต้องการให้ตารางข้างต้น มีคุณสมบัติเป็น 2NF จะต้องทำการแตกตารางออกมา ตามความสัมพันธ์ของฟังก์ชันการขึ้นต่อกัน เป็น 3 ตาราง ดังนี้


     จากตารางที่ 1.10 หากต้องการเพิ่มข้อมูลลูกค้าขึ้นมาอีก 1 คน อาจมีปัญหาเกิดขึ้น คือ ถ้าลูกค้าที่จะเพิ่มเข้าไปเป็นลูกค้าในระดับ A แสดงว่าต้องเป็นลูกค้าชั้นดี ในช่องประเภทต้องใส่ว่า “ชั้นดี” เท่านั้น ถ้าหากใส่ว่า ปานกลาง หรือพอใช้ ข้อมูลก็จะขัดแย้งกัน เพราะฉะนั้นตารางที่ผ่าน 2NF บางตารางอาจเกิดปัญหาในเรื่องของการเพิ่มข้อมูลได้ ดังนั้นจึงต้องมีการนอร์มัลไลเซชันระดับที่ 3 ต่อไป

     2.3 Third Normal Form (3NF)
          ตารางที่ผ่านการทานอร์มัลไลเซชันระดับที่ 3 หรือ Third Normal Form ต้องมีคุณสมบัติดังนี้
            1) ต้องมีคุณสมบัติของ 2NF
            2) nonprime ต้องไม่ขัั้นnonprime

     จากตารางที่ 1.13 จะมีแอตทริบิวต์ เลขที่ใบเสร็จ เป็น prime ส่วน รหัสลูกค้า ชื่อลูกค้า และที่อยู่ เป็น nonprime นักศึกษาต้องพิจารณาก่อนว่าตารางที่ 1.13 มีคุณสมบัติเป็น 2NF หรือไม่ ซึ่งจากข้อมูลจะสังเกตว่ามีคุณสมบัติเป็น 2NF เนื่องจากไม่อยู่ในรูป repeating group และ nonprime ทุกตัวขึ้นกับ prime ทุกตัว คือ รหัสลูกค้า ชื่อลูกค้า และที่อยู่ ขึ้นกับ เลขที่ใบเสร็จ ซึ่งเป็น prime เพียงตัวเดียว

เลขที่ใบเสร็จ ---> รหัสลูกค้า, ชื่อลูกค้า, ที่อยู่

     เมื่อมีคุณสมบัติเป็น 2NF แล้ว ก็พิจารณาต่อว่า nonprime ขึ้นกับ nonprime หรือไม่ ถ้าไม่มี nonprime ตัวใดขึ้นต่อกัน ก็แสดงว่ามีคุณสมบัติเป็น 3NF แต่จากข้อมูลในตารางที่ 1.13 มี nonprime บางตัวที่ขึ้นต่อกัน ได้แก่ ชื่อลูกค้าและที่อยู่ ขึ้นกับรหัสลูกค้า ทาให้ไม่เป็นไปตามคุณสมบัติของ 2NF

รหัสลูกค้า ---> ชื่อลูกค้า, ที่อยู่

     ดังนั้นจึงต้องมีการแตกตารางที่ 1.13 ออกมาเป็น 2 ตาราง ตามความสัมพันธ์ของฟังก์ชันการขึ้นต่อกัน ดังนี้
     อีกตัวอย่างหนึ่ง จากตารางที่ 1.10 ซึ่งผ่านการนอร์มัลไลเซชันระดับที่ 2 แล้ว แต่ยังมีปัญหาการเพิ่มข้อมูลอยู่ ดังที่กล่าวมาแล้วข้างต้น จึงต้องมีการทาให้เป็น 3NF เนื่องจาก nonprime บางตัวขึ้นกับ nonprime คือ ระดับ ---> ประเภท ดังนั้นจึงต้องแยก เป็น 2 ตาราง ดังต่อไปนี้