การทำให้เป็นมาตรฐานใน 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 - ตรวจสอบให้แน่ใจว่าตารางนั้นปราศจากตรรกะหรือการทำให้เป็นมาตรฐาน

จะทำให้ฐานข้อมูลเป็นปกติได้อย่างไร

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