หน่วยที่ 1 ความรู้เบื้องต้นเกี่ยวกับฐานข้อมูล
เรื่อง การทำนอร์มอลฟอร์ม (Normalization)

_________________________________________________________________                               

การทำนอร์มอลฟอร์ม (Normalization)
การนอร์มัลไลเซซัน (Normalization) เป็นทฤษฎีหรือกระบวนการที่ใช้ในการทำให้เอนทิตี้และแอททริบิวต์ที่ได้ออกแบบไว้มาจัดกลุ่มตารางให้ความสัมพันธ์กัน ให้อยู่ในรูปแบบที่เรียกว่า รูปแบบบรรทัดฐาน หรือ Normal Form เพื่อเพิ่มประสิทธิภาพให้แก่ฐานข้อมูล โดยทำให้ฐานข้อมูลไม่มีความซ้ำซ้อนและไม่มีขนาดใหญ่จนเกินไป โดย การทำ “Normalization” มีลำดับดังนี้
        1.       0NF เป็นตาราง (Table)
        2.       1NF (First Normal Form)
        3.       2NF (Second Normal Form)
        4.       3NF (Third Normal Form)
        5.       BCNF (Boyce/Codd Normal Form)
        6.       4NF (Forth Normal Form)
        7.       5NF (Fifth Normal Form)
โดยส่วนใหญ่ ในการทำนอร์มอลฟอร์มจะทำถึง 3NF เท่านั้น ส่วนพวกที่มากกว่านี้แทบจะไม่พบในชีวิตประจำวัน

0NF เป็นตาราง
          ในการสร้างฐานข้อมูลนั้น ข้อมูลจะต้องสามารถทำเป็นตารางได้ ซึ่งตารางที่มีมานั้น อาจมีข้อมูลไม่ครบทุกช่อง (ซึ่งตารางที่ผ่านมา ได้ทำการทำนอร์มอลฟอร์มมาแล้ว ซึ่งตารางดังกล่าวยังไม่ได้ทำ) ดังตารางที่ 1

ดังนั้น 0NF คือตารางที่มีช่องว่าง ซึ่งไม่สามารถนำข้อมูลมาใส่ฐานข้อมูลได้ จึงต้องมีการนำมา 1NF เสียก่อน

1NF (First Normal Form)
          กฎของการทำ 1NF คือ ต้องทำการเติมตารางที่เว้าแหว่งในแต่ละฟิลด์ให้เต็มทุกช่องโดย 1 ช่องต้องมีข้อมูลแค่ 1 ข้อมูลเท่านั้น ที่สำคัญจะต้องไม่มีเรคอร์ดซ้ำ (Repeating Groups)
          จากตารางที่ 1 เราสังเกตได้ว่าในตารางนั้นมีช่องว่างอยู่ ซึ่งตารางแบบนี้ไม่เหมาะสมที่จะใส่ในฐานข้อมูล โดยใน 1NF จะต้องทำการเติมช่องว่างให้เต็ม จะได้ดังตารางที่ 2


หลังจากทำ 1NF แล้วตารางอาจยังดูแปลกๆอยู่ เพราะ
              1.       ตารางดูใหญ่มาก มีข้อมูลมากเกินความจำเป็น
              2.       ข้อมูลซ้ำซ้อน
              3.       ถ้าเลิกขายสินค้าชิ้นไหนก็ต้องลบข้อมูลออกหลายจุด
              4.       ถ้ามีสินค้าใหม่ออกจำหน่าย ก็ต้องใส่ข้อมูลหลายแห่ง

ดังนั้นการทำ 1NF ยังไม่เพียงพอ จึงต้องทำ 2NF ต่อไป 

2NF (Second Normal Form)
กฎของการทำ 2NF คือ ต้องเป็น 1NF มาก่อน แล้วต้องมีคีย์หลัก (Primary keyส่วนข้อมูลที่อยู่ในฟิลด์อื่นจะเรียกว่า ไม่มีคีย์ (Non-key) และฟิลด์ดังกล่าวต้องขึ้นกับฟิลด์ที่เป็นคีย์หลักด้วย โดย คีย์หลักนี้สามารถเป็นคีย์เดี่ยวหรือคีย์รวม (Compound key) ก็ได้ และถ้าเป็นคีย์รวม แล้วฟิลด์ที่ไม่มีคีย์ต้องขึ้นกับคีย์รวมด้วย

วิธีการนำตาราง 1NF มาทำเป็น 2NF
      1. พิจารณาว่าข้อมูลในตารางของเรามีอะไรบ้าง อาจนำความรู้จากเรื่องเอ็นทิตี้และแอททริบิวท์มาช่วยจากตารางที่ 2 แปลงได้ ดังนี้


2. พิจารณาความสัมพันธ์ของข้อมูล โดยในที่นี้จะเป็นข้อมูล 2 กลุ่มที่มีความสัมพันธ์กันเองคือ “รายการอาหาร” และ “ข้อมูลการสั่งอาหาร” ทำให้เราสามารถแยกเป็น 2 เอ็นทิตี้ได้ดังนี้

ข้อสังเกต
                  1.  ราคาอาหารจะขึ้นอยู่กับชนิดของอาหารเท่านั้นไม่ได้ขึ้นกับฟิลด์อื่นเลย ทำให้สามารถแยกมาเป็น 1 ตารางได้
                  2.  อาหารที่สั่ง และจำนวนที่สั่ง จะขึ้นอยู่กับลูกค้าว่าจะอะไร แต่อย่างไรก็ตามเราไม่สามารถนำข้อมูลลูกค้าของร้านอาหารตามสั่งมาใส่ในฐานข้อมูลได้ ก็เลยต้องใช้ Order No กับโต๊ะที่ลูกค้านั้ง รวมกับวัน-เวลาที่ลูกค้ามาใช้บริการเป็นหลักให้อาหารที่สั่งกับจำนวนที่สั่ง ก็เลยได้มาอีก 1 ตาราง
                  3.  แอททริบิวท์ที่เป็น “ยอดรวม” เป็นค่าที่สามารถหาได้จากการคำนวณ โดยนำจำนวนที่สั่งมาคูณกับราคาอาหาร ก็เลยไม่จำเป็นต้องมีฟิลด์นี้อยู่ในตาราง ดังนั้นจึงตัดทิ้งได้

      3. หาคีย์หลักให้กับเอ็นทิตี้ทั้งสอง โดยถ้าเอ็นทิตี้ไหนไม่มีคีย์หลัก ให้เพิ่มแอททริบิวท์คีย์หลักของตารางนั้นๆ (อาจกำหนดรหัสของอาหารด้วยว่ารายการไหนรหัสอะไร) ดังนี้

      4. แปลงเอ็นทิตี้และแอททริบิวท์เป็นตาราง จากนั้นดูว่าคีย์หลักที่เราใส่มานั้นใช้ได้หรือไม่ โดยพิจารณาจากตารางที่ 3 และตารางที่ 4 ดังนี้




จากตารางที่ 3 รายการอาหารดูแล้วไม่น่ามีปัญหา แต่เมื่อมาดูตารางที่ 4 ข้อมูลการสั่งอาหารดูแล้วมีปัญหาแน่ๆ เพราะดูเหมือนว่าจะไม่มีฟิลด์ไหนเป็นคีย์หลักได้เลย ดังนั้นจึงต้องรวม Order No วันที่ โต๊ะที่ เวลาและรายชื่ออาหารเข้าไปเป็นคีย์หลัก ซึ่งในการรวมฟิลด์หลายๆฟิลด์นี้เองที่เรียกว่าคีย์รวม (Compound key)

หมายเหตุ ในแง่ของฐานข้อมูล โดยปกติแล้วเราจำไม่นำชื่อของอะไรก็ตามมาเป็นคีย์หลัก หรือส่วนหนึ่งของคีย์รวม เพราะจะมีปัญหาในการกำหนด Index key ดังนั้นจึงทำการเปลี่ยน จากรายการชื่ออาหารที่สั่งเป็นรหัสสินค้าแทน ดังนี้


จากตารางรายการอาหาร กับข้อมูลการสั่งอาหาร เราจะมาวิเคราะห์ความสัมพันธ์ (Relationships) ของทั้งสอน เอ็นทิตี้ ซึ่งเมื่อพิจารณาแล้วจะได้ความสัมพันธ์ในรูปแบบดังนี้

วิธีพิจารณาคือ “รายการอาหารหลายรายการสามารถอยู่ในข้อมุลการสั่งอาหารได้หลายข้อมูล”
หลังจากทำ 2NF ยังไม่สามารถน้ำข้อมูลมาใช่ได้ เนื่องจาก
1.       มีข้อมูลซ้ำซ้อนเยอะ
2.       ความสัมพันธ์ก็แบบ M:N
ดังนั้นเราควรไปทำ 3NF ต่อไป

3NF (Third Normal Form)
          กฎของการทำ 3NF คือ จะต้องเป็น 2NF มาก่อนและต้องไม่มีการขึ้นต่อกันเองในหมู่ Non-key หมายความว่า พวกที่ไม่ใช่คีย์หลัก ต้องขึ้นตรงกับคีย์หลักเท่านั้น
          สำหรับตาราง “รายการอาหาร” ดูแล้วไม่น่ามีปัญหาอะไร เพราะอาหารที่สั่ง กับราคาอาหารต่างก็ขึ้นกับรหัสอาหารทั้งหมด ดังนั้นตารางนี้ถึงว่าเป็น 3NF แล้ว
          ตาราง “ข้อมูลการสั่งอาหาร” จะเห็นว่า “อาหารที่สั่ง (รหัสอาหาร) ” กับ “จำนวน” นอกจากจะขึ้นกับ Order No แล้ว ยังขึ้นกลับ วันที่ โต๊ะ และเวลาอีกด้วย ซึ่งกรณีนี้แสดงว่ามีความสัมพันธ์แบบ Non-key อยู่แน่นอน ดังนั้นเราจึงแบ่ง “ข้อมูลการสั่งอาหาร” ออกเป็นเอ็นทิตี้ย่อยดังนี้

 เมื่อมาดูในมุมมองของตารางข้อมูลจะได้ดังนี้


ส่วนตารางข้อมูลการสั่ง สามารถตัดส่วนที่ซ้ำๆ ออกได้ ทำให้คีย์หลักของเรา เปลี่ยนไป จากที่รวม ทั้ง Order No วันที่ โต๊ะที่ และเวลา ก็เหลือเพียง Order No เป็นคีย์หลักก็เพียงพอแล้ว

เขียนในรูปแบบของเอ็นทิตี้กับแอททริบิวท์ ได้ดังนี้


จากนั้นทำการพิจารณาความสัมพันธ์ของเอ็นทิตี้ ซึ่งจะมีความสัมพันธ์ในรูปแบบนี้

ตารางที่ได้นั้นก็สามารถนำไปใส่ในฐานข้อมูลได้แล้ว ซึ่งการทำนอมอลฟอร์มนั้น ถ้าทำถึง 3NF มักจะเพียงพอต่อการนำไปใส่ฐานข้อมูลโดยไม่ก่อให้เกิดปัญหา

โพสต์ยอดนิยมจากบล็อกนี้

หน่วยที่ 4 การจัดการข้อมูลด้วยคิวรี