แบบฟอร์มฐานข้อมูลปกติคืออะไรและคุณสามารถให้ตัวอย่างได้บ้าง [ปิด]


277

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

เนื่องจากบทความส่วนใหญ่ค่อนข้างเป็นเรื่องทางเทคนิคและยากที่จะเข้าใจฉันจึงขอให้บางคนเขียนคำอธิบายที่เข้าใจง่ายขึ้นโดยอ้างอิงจากตัวอย่างเกี่ยวกับความหมายของ 1NF, 2NF, 3NF แม้แต่ 3.5NF (Boyce-Codd)

คำตอบ:


435

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

2NF และ 3NF ล้วนเกี่ยวกับการพึ่งพาคีย์หลัก จำได้ว่าคีย์หลักอาจประกอบด้วยหลายคอลัมน์ อย่างที่ Chris พูดไว้ในคำตอบของเขา:

ข้อมูลขึ้นอยู่กับคีย์ [1NF] ทั้งคีย์ [2NF] และไม่มีอะไรนอกจากกุญแจ [3NF] (ดังนั้นช่วยฉันCodd )

2NF

สมมติว่าคุณมีตารางที่มีหลักสูตรที่ใช้ในภาคการศึกษาหนึ่งและคุณมีข้อมูลต่อไปนี้:

|-----Primary Key----|               uh oh |
                                           V
CourseID | SemesterID | #Places  | Course Name  |
------------------------------------------------|
IT101    |   2009-1   | 100      | Programming  |
IT101    |   2009-2   | 100      | Programming  |
IT102    |   2009-1   | 200      | Databases    |
IT102    |   2010-1   | 150      | Databases    |
IT103    |   2009-2   | 120      | Web Design   |

นี่ไม่ใช่ใน 2NFเนื่องจากคอลัมน์ที่สี่ไม่ได้ขึ้นอยู่กับคีย์ทั้งหมด - แต่เป็นเพียงส่วนหนึ่งเท่านั้น ชื่อหลักสูตรขึ้นอยู่กับ ID ของหลักสูตร แต่ไม่มีส่วนเกี่ยวข้องกับภาคการศึกษาใด ๆ ดังนั้นอย่างที่คุณเห็นเรามีข้อมูลที่ซ้ำกันหลายแถวบอกเราว่า IT101 เป็นโปรแกรมและ IT102 เป็นฐานข้อมูล ดังนั้นเราจึงแก้ไขได้โดยการย้ายชื่อหลักสูตรไปยังตารางอื่นโดยที่ CourseID เป็นคีย์ทั้งหมด

Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |

ไม่มีความซ้ำซ้อน!

3NF

เอาล่ะสมมติว่าเราเพิ่มชื่อครูของหลักสูตรและรายละเอียดบางอย่างเกี่ยวกับพวกเขาลงใน RDBMS:

|-----Primary Key----|                           uh oh |
                                                       V
Course  |  Semester  |  #Places   |  TeacherID  | TeacherName  |
---------------------------------------------------------------|
IT101   |   2009-1   |  100       |  332        |  Mr Jones    |
IT101   |   2009-2   |  100       |  332        |  Mr Jones    |
IT102   |   2009-1   |  200       |  495        |  Mr Bentley  |
IT102   |   2010-1   |  150       |  332        |  Mr Jones    |
IT103   |   2009-2   |  120       |  242        |  Mrs Smith   |

ตอนนี้หวังว่ามันควรจะเป็นที่ชัดเจนว่า TeacherName จะขึ้นอยู่กับ TeacherID - ดังนั้นนี่คือไม่ได้อยู่ใน 3NF ในการแก้ไขปัญหานี้เราทำเช่นเดียวกับที่เราทำใน 2NF - นำฟิลด์ TeacherName ออกจากตารางนี้และวางไว้ในของมันเองซึ่งมี TeacherID เป็นกุญแจสำคัญ

 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |

ไม่มีความซ้ำซ้อน !!

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


9
แค่คิดในแง่ของความสัมพันธ์ระหว่างสิ่งต่าง ๆ ถ้าฉันถามคุณ "ชื่อหลักสูตรกับ ID IT101 คืออะไร" คุณสามารถให้คำตอบได้ใช่ไหม ในทำนองเดียวกันถ้าฉันถามคุณว่า "ครูคนไหนมี ID 332" คุณสามารถบอกฉันได้ว่าครูนั่นคืออะไร ดังนั้นชื่อหลักสูตรจึงขึ้นอยู่กับ ID
Smashery

9
อย่างไรก็ตามคุณไม่สามารถไปทางอื่นได้ - ถ้าฉันถามคุณว่า "ID ของ Mr Jones คืออะไร" คุณอาจไม่สามารถให้คำตอบที่ไม่เหมือนใครเนื่องจากอาจมีนายโจนส์สองคน ดังนั้น ID ไม่ได้ขึ้นอยู่กับชื่อ - มันเป็นชื่อที่ขึ้นอยู่กับ ID
Smashery

2
คุณสามารถคิดแบบนี้ - ดูที่ตารางที่สามลงมา (อันแรกที่มี TeacherName อยู่) อะไรที่ทำให้ฉันหยุด "Mr Jones" ในแถวแรก แต่จากนั้นใส่ "Mr Bloggs" ในแถวที่สอง ฉันไม่ควรได้รับอนุญาตให้ทำเช่นนั้นเพราะพวกเขาได้ทั้งสองได้รหัสของ 332
Smashery

30
@instantsetsuna - คำอธิบายแบบเต็ม: ในบางศาลพยานจะถามว่าพวกเขาจะบอกว่า "ความจริงความจริงทั้งหมดและไม่มีอะไรนอกจากความจริงดังนั้นช่วยฉันพระเจ้า"; ดังที่พระเจ้าได้รับการยกย่องว่าเป็นผู้มีอำนาจเมื่อรู้ว่าคุณกำลังพูดความจริงหรือไม่ ในกรณีของฐานข้อมูลเราสามารถพูดว่า "ข้อมูลขึ้นอยู่กับคีย์คีย์ทั้งหมดและไม่มีอะไรนอกจากคีย์ดังนั้นช่วยให้ฉัน Codd" Ted Codd เป็นผู้ที่คิดไอเดียเกี่ยวกับฐานข้อมูลเชิงสัมพันธ์ - สิ่งที่ต้องอาศัยกุญแจเป็นต้นดังนั้นเขาจะเป็นผู้มีอำนาจที่จะไปในกรณีของฐานข้อมูลเชิงสัมพันธ์
Smashery

5
@Smashery ความแตกต่างระหว่าง 2NF และ 3NF คืออะไร?
Zo มี

119

ฉันไม่เคยมีความทรงจำที่ดีสำหรับการใช้ถ้อยคำที่แน่นอน แต่ในชั้นเรียนฐานข้อมูลของฉันฉันคิดว่าอาจารย์มักจะพูดอะไรบางอย่างเช่น

ข้อมูลขึ้นอยู่กับคีย์ [1NF] ทั้งคีย์ [2NF] และไม่มีอะไรนอกจากกุญแจ [3NF]


72
... โปรดช่วยฉัน Codd en.wikipedia.org/wiki/Ted_Codd
Smashery

6
ดังนั้นสิ่งที่เป็นความแตกต่างระหว่างThe data depends on the key [1NF], nothing but the key [3NF]? โปรดอย่าสับสนเราเนื่องจากคำตอบ 1 ประโยคไม่ได้ทำให้ชัดเจน แต่ผู้เข้าชมสับสน!
Pratik

2
"แต่ละเซลล์ในตารางจะต้องมีข้อมูลเพียงชิ้นเดียวเท่านั้นและต้องไม่มีแถวที่ซ้ำกัน" - ฉันไม่เห็นว่า "ข้อมูลขึ้นอยู่กับคีย์" ตรงกับสิ่งเหล่านั้นทั้งหมดอย่างไร
Simon Forsberg

46

นี่เป็นอย่างรวดเร็วเป็นที่ยอมรับเชือดการตอบสนอง แต่ในประโยค:

1NF: ตารางของคุณถูกจัดระเบียบเป็นชุดข้อมูลที่ไม่มีการเรียงลำดับและไม่มีคอลัมน์ที่ซ้ำกัน

2NF: คุณไม่ต้องทำซ้ำข้อมูลในคอลัมน์หนึ่งของตารางเนื่องจากอีกคอลัมน์หนึ่ง

3NF: ทุกคอลัมน์ในตารางของคุณเกี่ยวข้องกับคีย์ของตารางเท่านั้น - คุณจะไม่มีคอลัมน์ในตารางที่อธิบายคอลัมน์อื่นในตารางของคุณซึ่งไม่ใช่กุญแจ

สำหรับรายละเอียดเพิ่มเติมดูวิกิพีเดีย ...


1
เท่าที่ฉันสามารถบอกได้การแยกกลุ่มซ้ำของ 1NF ไม่ได้หมายถึงคอลัมน์ซ้ำ แต่เป็นคอลัมน์เดียวที่แสดงจำนวนซ้ำของค่าซ้ำ ๆ สำหรับคุณลักษณะเดียวกันนั่นคือไม่ใช่อะตอมมิก ฉันยึดสิ่งนี้เช่น (1) stackoverflow.com/questions/23194292/… / (2) stackoverflow.com/questions/26357276/…
underscore_d

34

1NF: หนึ่งค่าต่อคอลัมน์เท่านั้น

2NF: คอลัมน์ที่ไม่ใช่คีย์หลักทั้งหมดในตารางควรขึ้นอยู่กับคีย์หลักทั้งหมด

3NF: คอลัมน์ที่ไม่ใช่คีย์หลักทั้งหมดในตารางควรขึ้นอยู่กับคีย์หลักทั้งหมดโดยตรง

ฉันเขียนบทความโดยละเอียดมากกว่านี้


เพราะคุณไม่ได้ระบุแหล่งที่มา ฉันได้แก้ไขคำตอบเพื่อให้แสดงที่มา
Robert Harvey

เมื่อใดก็ตามที่ทำได้ให้ใส่ตัวอย่างในคำตอบด้วยตนเอง ผู้ใช้ที่ไม่เป็นทางการควรอ่านคำตอบของคุณและรับประโยชน์จากมันโดยไม่ต้องคลิกที่ลิงค์บล็อก คำตอบควรอยู่ในตัวเองในคำอื่น ๆ
Robert Harvey

ฉันจะจำไว้ว่า ขอบคุณ :)
Arcturus

3
นอกจากนี้โปรดทราบว่าคำถามนี้มีอายุสองปีและมีคำตอบที่ได้รับการโหวตอย่างสูงที่มีการทำเครื่องหมายว่า OP ยอมรับแล้ว คำตอบที่ล่าช้าจะถูกตรวจสอบอย่างละเอียดมากขึ้นโดยชุมชนเพื่อประเมินว่าพวกเขาจะเพิ่มมูลค่าเพิ่มเติมของแท้ให้กับ OP หรือไม่
Robert Harvey

3
@Actctus อ่านบทความนี้ยังเป็นหนึ่งในคำอธิบายที่ดีกว่าสำหรับการทำให้เป็นมาตรฐาน
Olian04
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.