范式
- 1. 第一范式(1NF)
- 2. 第二范式(2NF)
- 3. 第三范式(3NF)
- 4. BC范式(BCNF,Boyce-Codd Normal Form)
- 5. 第四范式(4NF)
- 6. 第五范式(5NF)
- 總結:
在數據庫設計中, 范式(Normal Forms, NFs)是一種用于規范化數據庫結構的理論,用以消除數據冗余、提高數據一致性,同時減少異常問題。范式的核心思想是將數據劃分成更小、更獨立的表,并通過關系(外鍵)進行連接。
1. 第一范式(1NF)
目標:確保每列的值是原子值。
-
要求:
- 數據庫表中的每一列只包含單一值(原子性)。
- 不允許一列存儲多個值(如數組、列表等),也不允許嵌套表。
-
示例:不符合1NF
學生ID 姓名 聯系方式 1 張三 12345, 67890 2 李四 98765 上述表中“聯系方式”列包含了多個值,因此不符合1NF。
-
改進(符合1NF)
學生ID 姓名 聯系方式 1 張三 12345 1 張三 67890 2 李四 98765
2. 第二范式(2NF)
目標:消除非主屬性對主鍵的部分依賴。
-
要求:
- 滿足1NF。
- 表中的每一個非主屬性必須完全依賴于主鍵,而不能只依賴于主鍵的一部分(解決部分依賴)。
-
示例:不符合2NF
學生ID 課程ID 課程名稱 成績 1 C001 數學 90 1 C002 英語 85 假設主鍵是(學生ID, 課程ID)的組合,“課程名稱”只依賴于課程ID,而不是組合主鍵,因此違反2NF。
-
改進(分表,符合2NF)
-
課程表:
課程ID 課程名稱 C001 數學 C002 英語 -
成績表:
學生ID 課程ID 成績 1 C001 90 1 C002 85
-
3. 第三范式(3NF)
目標:消除非主屬性之間的傳遞依賴。
-
要求:
- 滿足2NF。
- 非主屬性之間不存在傳遞依賴(即非主屬性不能依賴于另一個非主屬性)。
-
示例:不符合3NF
學生ID 系ID 系名稱 1 CS001 計算機系 2 EE002 電氣工程系 在此表中,“系名稱”依賴于“系ID”,“系ID”又依賴于主鍵“學生ID”,這是一種傳遞依賴。
-
改進(分表,符合3NF)
-
學生表:
學生ID 系ID 1 CS001 2 EE002 -
系表:
系ID 系名稱 CS001 計算機系 EE002 電氣工程系
-
4. BC范式(BCNF,Boyce-Codd Normal Form)
目標:消除主屬性間的依賴關系。
-
要求:
- 滿足3NF。
- 對于每一個函數依賴 X → Y X \to Y X→Y , X X X 必須是超鍵。(超鍵是一個或多個屬性的組合,這些屬性的值可以唯一地標識表中的每一行記錄。換句話說,一個超鍵中的值是足夠獨特的,它能夠用來區分表中的任意兩條記錄。)
-
示例:不符合BCNF
教師ID 課程名稱 教室 T001 數學 R101 T002 英語 R102 假設(教師ID, 課程名稱)為主鍵,“教室”依賴于“課程名稱”,“課程名稱”不是超鍵,因此違反BCNF。
-
改進(分表)
-
課程表:
課程名稱 教室 數學 R101 英語 R102 -
教師課程表:
教師ID 課程名稱 T001 數學 T002 英語
-
5. 第四范式(4NF)
目標:消除多值依賴。
-
要求:
- 滿足BCNF。
- 表中不能存在非主屬性的多值依賴。
-
示例:不符合4NF
學生ID 語言 愛好 1 英語 籃球 1 英語 足球 1 法語 籃球 1 法語 足球 上述表中,“語言”和“愛好”是獨立的多值屬性,存在多值依賴。
-
改進(分表)
-
學生語言表:
學生ID 語言 1 英語 1 法語 -
學生愛好表:
學生ID 愛好 1 籃球 1 足球
-
6. 第五范式(5NF)
目標:消除連接依賴。
- 要求:
- 滿足4NF。
- 表中每一個關系都應該能夠通過其更小的關系表連接復原(避免連接依賴)。
總結:
范式 | 目標 | 主要特點 |
---|---|---|
1NF | 消除重復組,保證每列值原子性。 | 每列只存儲單一值。 |
2NF | 消除部分依賴,非主屬性完全依賴主鍵。 | 必須完全依賴主鍵,不允許部分依賴。 |
3NF | 消除傳遞依賴,非主屬性只依賴主鍵。 | 非主屬性之間不能存在依賴關系。 |
BCNF | 消除主屬性間依賴,所有函數依賴的決定因素為超鍵。 | 更嚴格的3NF。 |
4NF | 消除多值依賴,每個關系只存儲一個獨立主題。 | 解決多值屬性獨立的問題。 |
5NF | 消除連接依賴,確保關系可以通過小表復原。 | 對復雜表分解到極致。 |