范式復(fù)習(xí)
1NF、2NF、3NF和4NF是數(shù)據(jù)庫設(shè)計中用于消除數(shù)據(jù)冗余和提高數(shù)據(jù)完整性的規(guī)范化形式。這些規(guī)范化形式基于一組規(guī)則,指導(dǎo)數(shù)據(jù)庫中的數(shù)據(jù)組織過程。
1. 第一范式(1NF):
第一范式要求數(shù)據(jù)庫表具有主鍵,并且每個列僅包含原子值(不可分割的值)。它消除了重復(fù)的數(shù)據(jù)組,并確保每個列具有單個值。
2. 第二范式(2NF):
第二范式在1NF的基礎(chǔ)上進行了擴展。它規(guī)定數(shù)據(jù)庫表必須符合1NF,并且所有非關(guān)鍵屬性(列)必須完全依賴于整個主鍵。換句話說,它通過將部分依賴關(guān)系移至單獨的表中來消除部分依賴。
3. 第三范式(3NF):
第三范式在2NF的基礎(chǔ)上進行了擴展。它規(guī)定數(shù)據(jù)庫表必須符合2NF,并且所有非關(guān)鍵屬性(列)只能依賴于主鍵,而不能依賴于其他非關(guān)鍵屬性。它通過將傳遞依賴關(guān)系移至單獨的表中來消除傳遞依賴。
4. 第四范式(4NF):
第四范式在3NF的基礎(chǔ)上進行了擴展。它規(guī)定數(shù)據(jù)庫表必須符合3NF,并且不應(yīng)具有多值依賴關(guān)系。換句話說,它消除了非關(guān)鍵屬性依賴于其他非關(guān)鍵屬性組合的情況。
每個更高的范式都包含了前一個范式的要求。范式越高,數(shù)據(jù)庫設(shè)計就越規(guī)范化,冗余就越少。但是,實現(xiàn)更高的范式可能涉及到復(fù)雜性增加和性能考慮的權(quán)衡。在設(shè)計數(shù)據(jù)庫模式時,平衡規(guī)范化和實際應(yīng)用需求非常重要。
舉個例子,假設(shè)我們有一個學(xué)生課程數(shù)據(jù)庫,其中包含以下兩個表:
學(xué)生表(Student):
| 學(xué)生ID(StudentID) | 學(xué)生姓名(StudentName) | 年級(Grade) |
|-------------------|----------------------|--------------|
| 1? ? ? ? ? ? ? ? ?| 張三? ? ? ? ? ? ? ? ?| 10? ? ? ? ? ?|
| 2? ? ? ? ? ? ? ? ?| 李四? ? ? ? ? ? ? ? ?| 11? ? ? ? ? ?|
課程表(Course):
| 課程ID(CourseID) | 課程名稱(CourseName) | 學(xué)生ID(StudentID) |
|------------------|---------------------|------------------|
| 1? ? ? ? ? ? ? ? | 數(shù)學(xué)? ? ? ? ? ? ? ? ? | 1? ? ? ? ? ? ? ? |
| 2? ? ? ? ? ? ? ? | 英語? ? ? ? ? ? ? ? ? | 1? ? ? ? ? ? ? ? |
| 3? ? ? ? ? ? ? ? | 歷史? ? ? ? ? ? ? ? ? | 2? ? ? ? ? ? ? ? |
在1NF中,每個表都有唯一的主鍵(StudentID和CourseID),并且每個列都包含原子值,沒有重復(fù)的數(shù)據(jù)組。
在2NF中,我們可以將學(xué)生表分解為兩個表:學(xué)生表(Student)和年級表(Grade),其中學(xué)生表的非關(guān)鍵屬性完全依賴于主鍵(StudentID),而年級表則與主鍵無關(guān)。這樣可以消除部分依賴。
學(xué)生表(Student):
| 學(xué)生ID(StudentID) | 學(xué)生姓名(StudentName) |
|-------------------|----------------------|
| 1? ? ? ? ? ? ? ? ?| 張三? ? ? ? ? ? ? ? ?|
| 2? ? ? ? ? ? ? ? ?| 李四? ? ? ? ? ? ? ? ?|
年級表(Grade):
| 學(xué)生ID(StudentID) | 年級(Grade) |
|------------------|--------------|
| 1? ? ? ? ? ? ? ? | 10? ? ? ? ? ?|
| 2? ? ? ? ? ? ? ? | 11? ? ? ? ? ?|
課程表(Course)仍然保持不變,因為它的非關(guān)鍵屬性(課程名稱)已經(jīng)完全依賴于主鍵(CourseID)。
在3NF中,我們進一步分解課程表,以消除傳遞依賴。我們將課程表分解為課程表(Course)和學(xué)生課程關(guān)系表(StudentCourse):
課程表(Course):
| 課程ID(CourseID) | 課程名稱(CourseName) |
|------------------|---------------------|
| 1? ? ? ? ? ? ? ? | 數(shù)學(xué)? ? ? ? ? ? ? ? ? |
| 2? ? ? ? ? ? ? ? | 英語? ? ? ? ? ? ? ? ? |
| 3? ? ? ? ? ? ? ? | 歷史? ? ? ? ? ? ? ? ? |
學(xué)生課程關(guān)系表(StudentCourse):
| 學(xué)生ID(StudentID) | 課程ID(CourseID) |
|------------------|------------------|
| 1? ? ? ? ? ? ? ? | 1? ? ? ? ? ? ? ? |
| 1? ? ? ? ? ? ? ? | 2? ? ? ? ? ? ? ? |
| 2? ? ? ? ? ? ? ? | 3? ? ? ? ? ? ? ? |
現(xiàn)在,課程表的非關(guān)鍵屬性(課程名稱)僅依賴于主鍵(CourseID),而不依賴于其他非關(guān)鍵屬性。這樣消除了傳遞依賴。
最后,在4NF中,我們需要檢查是否存在多值依賴。在上述示例中,并不存在多值依賴的情況,因此不需要進一步分解。
通過按照這些規(guī)范化形式逐步優(yōu)化數(shù)據(jù)庫設(shè)計,我們可以消除冗余數(shù)據(jù),提高數(shù)據(jù)完整性,并使數(shù)據(jù)庫結(jié)構(gòu)更加規(guī)范化。



在這個例子中,學(xué)生姓名和課程名稱的非關(guān)鍵屬性傳遞依賴于學(xué)生ID和課程ID的聯(lián)合主鍵。
為了將其轉(zhuǎn)換為3NF,我們需要將傳遞依賴關(guān)系消除,創(chuàng)建一個新的教師表(Teacher)來分離教師姓名和教師ID。
操作步驟如下:
1. 創(chuàng)建一個新的教師表(Teacher),其中包含教師ID和教師姓名。
教師表(Teacher):
| 教師ID(TeacherID) | 教師姓名(TeacherName) |
|------------------|---------------------|
| 1? ? ? ? ? ? ? ? | 王老師? ? ? ? ? ? ? ? ?|
| 2? ? ? ? ? ? ? ? | 李老師? ? ? ? ? ? ? ? ?|
2. 更新學(xué)生課程教師表(StudentCourseTeacher),移除非關(guān)鍵屬性(學(xué)生姓名、課程名稱)中的傳遞依賴。
學(xué)生課程教師表(StudentCourseTeacher):
| 學(xué)生ID(StudentID) | 課程ID(CourseID) | 教師ID(TeacherID) | 成績(Grade) |
|-------------------|------------------|------------------|--------------|
| 1? ? ? ? ? ? ? ? ?| 1? ? ? ? ? ? ? ? | 1? ? ? ? ? ? ? ? | 80? ? ? ? ? ?|
| 1? ? ? ? ? ? ? ? ?| 2? ? ? ? ? ? ? ? | 2? ? ? ? ? ? ? ? | 85? ? ? ? ? ?|
| 2? ? ? ? ? ? ? ? ?| 1? ? ? ? ? ? ? ? | 1? ? ? ? ? ? ? ? | 90? ? ? ? ? ?|
現(xiàn)在,學(xué)生課程教師表(StudentCourseTeacher)中的非關(guān)鍵屬性不再傳遞依賴于聯(lián)合主鍵,傳遞依賴關(guān)系已經(jīng)被消除。
通過以上操作,我們將學(xué)生課程表從1NF轉(zhuǎn)換為2NF,將學(xué)生課程教師表從2NF轉(zhuǎn)換為3NF,分別消除了部分依賴和傳遞依賴關(guān)系。這樣可以提高數(shù)據(jù)庫的規(guī)范性和數(shù)據(jù)完整性。