การทำให้เป็นมาตรฐานใน SQL: 1NF, 2NF, 3NF & BCNF
เผยแพร่แล้ว: 2021-03-12การทำให้เป็นมาตรฐานเป็นกระบวนการที่เป็นระบบเพื่อให้แน่ใจว่าโมเดลฐานข้อมูลเชิงสัมพันธ์มีประสิทธิภาพ เหมาะสำหรับการสืบค้นทั่วไปและปราศจากลักษณะที่ไม่พึงประสงค์ เช่น การแทรก การอัปเดต และความผิดปกติในการลบ ซึ่งนำไปสู่การสูญเสียความสมบูรณ์ของข้อมูล กระบวนการทำให้เป็นมาตรฐานนี้ยังช่วยขจัดความซ้ำซ้อนของข้อมูล และลดโอกาสที่ข้อมูลไม่สอดคล้องกันหลังจากการแทรก อัปเดต หรือลบใดๆ
เพื่อความเข้าใจที่ดีขึ้น ให้พิจารณาสคีมาต่อไปนี้ นักเรียน (ชื่อ ที่อยู่ วิชา เกรด)
สกีมานี้มีปัญหาหรือความไร้ประสิทธิภาพเล็กน้อย
1) ความซ้ำซ้อน : ที่อยู่ของนักเรียนจะถูกทำซ้ำสำหรับแต่ละวิชาที่เขาลงทะเบียนไว้
2) การ อัปเดตความผิดปกติ : เราอาจอัปเดตที่อยู่ในทูเพิลหนึ่ง (แถว) โดยไม่เปลี่ยนแปลงในแถวอื่นๆ ดังนั้น เราจะไม่มีที่อยู่ที่ไม่ซ้ำกันอย่างสม่ำเสมอสำหรับนักเรียนแต่ละคน
3) ความผิดปกติในการแทรก : เราจะไม่บันทึกที่อยู่ของนักเรียนโดยไม่ได้ลงทะเบียนอย่างน้อยหนึ่งเรื่อง ในทำนองเดียวกัน เมื่อนักเรียนต้องการลงทะเบียนสำหรับเรื่องใหม่ อาจเป็นไปได้ว่าต้องใส่ที่อยู่อื่น
4) ความผิดปกติในการลบ : หากนักเรียนตัดสินใจที่จะยกเลิกวิชาที่ลงทะเบียนไว้ทั้งหมด ที่อยู่ของนักเรียนจะหายไปในกระบวนการลบด้วย
ดังนั้น จึงเป็นสิ่งสำคัญในการแสดงข้อมูลผู้ใช้ตามความสัมพันธ์ที่ไม่สร้างความผิดปกติหลังจากดำเนินการเพิ่ม ลบ หรืออัปเดต tuple สิ่งนี้สามารถทำได้โดยการวิเคราะห์อย่างรอบคอบเกี่ยวกับข้อจำกัดด้านความสมบูรณ์ โดยเฉพาะอย่างยิ่งการขึ้นต่อกันของข้อมูลของฐานข้อมูล
ความสัมพันธ์ควรได้รับการออกแบบเพื่อให้เฉพาะคุณลักษณะเหล่านั้นเท่านั้นที่ถูกจัดกลุ่มที่มีอยู่ร่วมกันอย่างเป็นธรรมชาติ ส่วนใหญ่สามารถทำได้โดยความเข้าใจพื้นฐานเกี่ยวกับความหมายของแอตทริบิวต์ข้อมูลทั้งหมด อย่างไรก็ตาม เรายังต้องการมาตรการที่เป็นทางการเพื่อให้แน่ใจว่าเป้าหมายการออกแบบของเรา
การทำให้เป็นมาตรฐานคือการวัดที่เป็นทางการ มันตอบคำถามว่าเหตุใดการจัดกลุ่มคุณลักษณะเฉพาะจึงดีกว่าที่อื่น
เจ็ดรูปแบบปกติที่มีอยู่ ณ วันนี้:
- ฟอร์มปกติครั้งแรก (1NF)
- แบบฟอร์มปกติที่สอง (2NF)
- แบบฟอร์มปกติที่สาม (3NF)
- Boyce-Codd แบบฟอร์มปกติ (BCNF)
- แบบฟอร์มปกติที่สี่ (4NF)
- แบบฟอร์มปกติที่ห้า (5NF)
- ฟอร์มปกติของคีย์ที่หกหรือโดเมน (6NF)
อ่าน: ประเภทของมุมมองในSQL
สารบัญ
First Normal Form (1NF หรือ Minimal Form)
- ไม่มีการเรียงลำดับจากบนลงล่างไปยังแถวและการเรียงลำดับจากซ้ายไปขวาไปยังคอลัมน์
- ไม่มีแถวที่ซ้ำกัน
- ทุกทางแยกของแถวและคอลัมน์มีค่าหนึ่งค่าจากโดเมนที่เกี่ยวข้องหรือค่า Null เงื่อนไขนี้บ่งชี้ว่าค่าของคอลัมน์ทั้งหมดควรเป็นค่าอะตอม สเกลาร์ หรือมีค่าเพียงค่าเดียว ไม่อนุญาตให้มีการทำซ้ำข้อมูลหรือค่าในหลายคอลัมน์ที่นี่
- คอลัมน์ทั้งหมดเป็นแบบปกติ (เช่น แถวไม่มีส่วนประกอบที่ซ่อนอยู่ เช่น รหัสแถว รหัสวัตถุ หรือการประทับเวลาที่ซ่อนอยู่)
มาดูตัวอย่างของสคีมาที่ไม่ได้ทำให้เป็นมาตรฐาน สมมติว่าผู้ออกแบบต้องการบันทึกชื่อและหมายเลขโทรศัพท์ของลูกค้า พวกเขากำหนดตารางลูกค้าตามที่แสดง:
รหัส ลูกค้า | ชื่อ จริง | นามสกุล | หมายเลขโทรศัพท์ |
123 | บีมาล | สฮา | 555-861-2025 |
456 | Kapil | คันนา | 555-403-1659, 555-776-4100 |
789 | Kabita | รอย | 555-808-9633 |
ที่นี่ไม่ใช่ใน 1 NF คอลัมน์หมายเลขโทรศัพท์ไม่ใช่อะตอมมิกหรือไม่มีค่าสเกลาร์ กล่าวคือ มีค่ามากกว่าหนึ่งค่า ซึ่งไม่อนุญาตใน 1 NF
To Make It 1 NF
- ก่อนอื่นเราจะแบ่ง (สลาย) โต๊ะเดี่ยวของเราออกเป็นสองส่วน
- แต่ละตารางควรมีข้อมูลเกี่ยวกับเอนทิตีเดียวเท่านั้น
รหัส ลูกค้า | ชื่อ จริง | นามสกุล |
123 | บีมาล | สฮา |
456 | Kapil | คันนา |
789 | Kabita | รอย |
รหัส ลูกค้า | หมายเลขโทรศัพท์ |
123 | 555-861-2025 |
456 | 555-403-1659 |
456 | 555-776-4100 |
789 | 555-808-9633 |
การออกแบบนี้จะไม่เกิดกลุ่มหมายเลขโทรศัพท์ซ้ำ ลิงก์หมายเลขลูกค้าถึงโทรศัพท์แต่ละรายการจะปรากฏในบันทึกของตนเองแทน
การ ชำระเงิน: คำถามและคำตอบในการสัมภาษณ์ SQL ที่พบบ่อยที่สุด
แบบฟอร์มปกติที่สอง
แบบฟอร์มปกติแต่ละแบบมีเกณฑ์ที่จำกัดมากกว่ารุ่นก่อน ดังนั้นตารางใดๆ ที่อยู่ในรูปแบบปกติที่สอง (2NF) หรือสูงกว่านั้น ตามคำจำกัดความแล้ว จะอยู่ใน 1NF ด้วย ในทางกลับกัน ตารางที่อยู่ใน 1NF อาจจะใช่หรือไม่ใช่ใน 2NF; หากอยู่ใน 2NF มันอาจจะใช่หรือไม่ใช่ใน 3NF เป็นต้น
ตาราง 1NF ถูกกล่าวว่าอยู่ใน 2NF ถ้าหากว่า ไม่มี แอตทริบิวต์ที่ไม่ใช่ไพรม์ของตารางนั้นขึ้นอยู่กับการทำงานโดยขึ้นอยู่กับส่วน (เซ็ตย่อยที่เหมาะสม) ของคีย์ตัวเลือก (แอตทริบิวต์ nonprime ไม่ได้อยู่ในคีย์ตัวเลือกใดๆ)
โปรดทราบว่าเมื่อตาราง 1NF ไม่มีคีย์ตัวเลือกแบบผสม (คีย์ผู้สมัครที่ประกอบด้วยแอตทริบิวต์มากกว่าหนึ่งรายการ) ตารางจะเป็น 2NF โดยอัตโนมัติ
ตรวจสอบว่าความสัมพันธ์ R (A, B, C, D, E) กับ FD ตั้งเป็น { BC ? ดี เอซี ? พ.ศ. บี ? E } อยู่ใน 2NF หรือไม่
- อย่างที่เราเห็น การปิด AC คือ (AC)+ = {A, C, B, E, D} โดยใช้อัลกอริทึมการเป็นสมาชิก แต่ไม่มีชุดย่อยใดสามารถกำหนดคุณลักษณะทั้งหมดของความสัมพันธ์ได้ ดังนั้น AC จึงเป็นคีย์ตัวเลือกสำหรับความสัมพันธ์นี้ นอกจากนี้ ทั้ง A และ C ไม่สามารถรับมาจากแอตทริบิวต์อื่นของความสัมพันธ์ ดังนั้นจะมีคีย์ตัวเลือกเพียง 1 รายการเท่านั้นคือ {AC}
- ในที่นี้ {A, C} คือแอตทริบิวต์เฉพาะและ {B, D, E} เป็นแอตทริบิวต์ที่ไม่ใช่ไพรม์
- ความสัมพันธ์ R อยู่ในรูปแบบปกติที่ 1 แล้ว เนื่องจาก DBMS เชิงสัมพันธ์ใน 1NF ไม่อนุญาตให้ใช้แอตทริบิวต์ที่มีหลายค่าหรือคอมโพสิต
พ.ศ. ? D อยู่ในรูปแบบปกติที่ 2 เนื่องจาก BC ไม่ใช่ชุดย่อยที่เหมาะสมของคีย์ตัวเลือก AC
เอซี ? BE อยู่ในรูปแบบปกติที่ 2 เนื่องจาก AC เป็นคีย์ตัวเลือกและ
ข ? E อยู่ในรูปแบบปกติที่ 2 B ไม่ใช่ชุดย่อยที่เหมาะสมของคีย์ตัวเลือก AC
ดังนั้นความสัมพันธ์ที่ให้ R อยู่ในรูปแบบปกติที่ 2
แบบฟอร์มปกติที่สาม
กล่าวกันว่าตารางอยู่ใน 3NF ต่อเมื่อสำหรับการพึ่งพาการทำงานแต่ละรายการ
X → A อย่างน้อยหนึ่งเงื่อนไขต่อไปนี้ถือ:
- X มี A (นั่นคือ X → A เป็นการพึ่งพาฟังก์ชันเล็กน้อย) หรือ
- X เป็นซุปเปอร์คีย์หรือ
- A เป็นแอตทริบิวต์ที่สำคัญ (เช่น A มีอยู่ในคีย์ตัวเลือก)
นิยามอื่นของ 3NF ระบุว่าทุกแอตทริบิวต์ที่ไม่ใช่คีย์ของ R นั้น ไม่ขึ้นกับทราน ส์ซิทีฟ (เช่น ขึ้นอยู่โดยตรง) บนคีย์หลักของ R ซึ่งหมายความว่าไม่มีแอตทริบิวต์ที่ไม่ใช่ไพรม์ (ไม่ใช่ส่วนหนึ่งของคีย์ตัวเลือก) ที่ใช้งานได้ขึ้นอยู่กับแอตทริบิวต์ที่ไม่ใช่ไพรม์อื่นๆ หากมีการขึ้นต่อกันสองอย่างเช่นว่า A ? B และ BC จาก FDs เหล่านี้ เราอาจได้ A ? C. การพึ่งพา AC นี้เป็นสกรรมกริยา
ตัวอย่างของ 3NF:
พิจารณาความสัมพันธ์ของคำสั่งซื้อ (Order#, Part, Supplier, UnitPrice, QtyOrdered) กับชุดของ FDs ที่ให้มา:
คำสั่ง# ? ส่วน, ซัพพลายเออร์, QtyOrdered และ Supplier, Part ? ราคาต่อหน่วย)
ที่นี่ Order# เป็นกุญแจสำคัญในความสัมพันธ์
โดยใช้สัจพจน์ของ Amstrong เราจะได้
คำสั่ง# ? ส่วนหนึ่ง การสั่งซื้อ ? ซัพพลายเออร์ และ สั่งซื้อ ? จำนวนสั่งซื้อ
คำสั่ง# ? ส่วนหนึ่ง ซัพพลายเออร์ และ ซัพพลายเออร์ ส่วนหนึ่ง ? ราคาต่อหน่วย ทั้งสองให้ Order# ? ราคาต่อหน่วย.
ดังนั้น เราจะเห็นว่าแอตทริบิวต์ nonprime ทั้งหมดขึ้นอยู่กับคีย์ (Order#) อย่างไรก็ตาม มีการพึ่งพาสกรรมกริยาระหว่าง Order# และ UnitPrice ดังนั้นความสัมพันธ์นี้จึงไม่อยู่ใน 3NF เราจะสร้างมันใน 3NF ได้อย่างไร
เราไม่สามารถจัดเก็บราคาต่อหน่วยของชิ้นส่วนใด ๆ ที่จัดหาโดยซัพพลายเออร์ใด ๆ เว้นแต่จะมีผู้สั่งซื้อชิ้นส่วนนั้น ดังนั้นเราจะต้องทำการย่อยสลายตารางเพื่อให้เป็นไปตาม 3NF ดังนี้
คำสั่งซื้อ (Order#, Part, Supplier, QtyOrdered) และ Price Master (Part, Supplier, UnitPrice)
ขณะนี้ไม่มีการพึ่งพาสกรรมกริยา ความสัมพันธ์อยู่ใน 3NF
อ่านเพิ่มเติม: SQL สำหรับ Data Science
เรียนรู้ หลักสูตรซอฟต์แวร์ออนไลน์ จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว
บทสรุป
การทำให้เป็นมาตรฐานยังมีอะไรอีกมากมาย เช่น BCNF, 4NF, 5NF และ 6NF กล่าวโดยย่อ BCNF เป็นเพียงส่วนขยายของ 3NF เนื่องจากกฎข้อสุดท้ายของ 3NF ไม่มีผลบังคับใช้ที่นี่ การพึ่งพาการทำงานทั้งหมดจำเป็นต้องมีแอตทริบิวต์ที่สำคัญทางด้านซ้ายและไม่มีทางด้านขวามือ (BCNF เรียกอีกอย่างว่า 3.5NF) อย่างไรก็ตาม รูปแบบปกติจาก 4NF ขึ้นไปนั้นแทบจะไม่ได้นำมาใช้ในทางปฏิบัติ
หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับการพัฒนาแบบฟูลสแตก โปรดดูโปรแกรม Executive PG ของ upGrad & IIIT-B ในการพัฒนาซอฟต์แวร์ฟูลสแตก ซึ่งออกแบบมาสำหรับมืออาชีพที่ทำงานและมีการฝึกอบรมที่เข้มงวดมากกว่า 500 ชั่วโมง โครงการมากกว่า 9 โครงการ และการมอบหมายงาน สถานะศิษย์เก่า IIIT-B โครงการหลักและความช่วยเหลือด้านงานกับบริษัทชั้นนำ
การทำให้ฐานข้อมูลเป็นปกติคืออะไร?
แบบฟอร์มปกติประเภทต่าง ๆ มีอะไรบ้าง?
รูปแบบปกติได้รับการพัฒนาโดย Edgar F. Codd บิดาแห่งฐานข้อมูลเชิงสัมพันธ์ รูปแบบปกติแต่ละรูปแบบคือระดับของความถูกต้องเชิงตรรกะโดยรวมของแบบจำลองเชิงสัมพันธ์และใช้เพื่อจุดประสงค์ในการออกแบบฐานข้อมูลจริง รูปแบบปกติรูปแบบแรกคือ 1NF ที่เกี่ยวกับการออกแบบตาราง และเกี่ยวข้องกับการลบรายการที่ซ้ำกัน และทำให้แน่ใจว่าข้อมูลทุกชิ้นจะแสดงเพียงครั้งเดียวในตาราง รูปแบบปกติที่สองเป็นเรื่องเกี่ยวกับคอลัมน์ที่ทำซ้ำได้ โดยแบ่งออกเป็นหลายตาราง รูปแบบปกติที่สามนั้นเกี่ยวกับการทำซ้ำกลุ่ม - แบ่งออกเป็นหลายตาราง รูปแบบปกติที่สี่คือประมาณ 1NF, 2NF และ 3NF - ตรวจสอบให้แน่ใจว่าตารางนั้นปราศจากตรรกะหรือการทำให้เป็นมาตรฐาน
จะทำให้ฐานข้อมูลเป็นปกติได้อย่างไร
การทำให้ฐานข้อมูลเป็นมาตรฐานคือกระบวนการแบ่งย่อยออกเป็นตารางจำนวนน้อยที่สุด ในท้ายที่สุด ฐานข้อมูลจะไม่มีฟิลด์ซ้ำและไม่มีแถวที่มีข้อมูลบางส่วน จุดประสงค์คือเพื่อให้แน่ใจว่าข้อมูลทั้งหมดเชื่อมโยงกับข้อมูลอื่นที่เกี่ยวข้องทั้งหมด และเมื่อมีการเปลี่ยนแปลงเกิดขึ้นในบันทึกเดียว บันทึกอื่นๆ ทั้งหมดที่อาจเกี่ยวข้องกับข้อมูลจะเปลี่ยนไปด้วย