正規化概述
Codd (1972) 提出正規化(Normalization)流程,目的是將設計不良的 relation 分解成更小的、具有良好性質的 relation。
核心目標
- 消除資料冗餘(Data Redundancy)
- 避免修改異常(Modification Anomalies):
- Insertion Anomaly:無法插入某些資料
- Update Anomaly:更新時需修改多筆記錄
- Deletion Anomaly:刪除時意外丟失資料
基本概念
- 正規化基於 Functional Dependency(功能相依)概念
- 將不良 relation 逐步分解,每一步消除特定類型的問題
七種 Normal Form
由低到高:1NF → 2NF → 3NF → BCNF → 4NF → 5NF → DK/NF
本課程討論前四種:1NF、2NF、3NF、BCNF
正規化的主要目標是什麼?
正規化是基於哪個概念?
Functional Dependency (FD)
定義
X → Y 表示:X 的值可以唯一決定 Y 的值。
若兩個 tuple 的 X 值相同,則它們的 Y 值也必須相同。
- X = Determinant(決定因子,左邊)
- Y = Right-hand side(右邊)
重要性質
- 若 X 是 PK 或 candidate key,則 X → Y 對 relation 中所有 attribute Y 成立
- X → Y 不代表 Y → X
範例
Works-on
SSN, P#, Hours, PName
- SSN, P# → Hours, PName(PK 決定所有 attribute)
- P# → PName(專案編號決定專案名稱)
Works-For
SSN, D#, DPhone
- SSN → D#, DPhone
- D# → DPhone(部門編號決定部門電話)
若 X → Y,下列何者正確?
在 Works-on(SSN, P#, Hours, PName) 中,P# → PName 代表什麼?
Armstrong's Axioms(FD 公理)
Armstrong 提出的公理系統,用來推導所有可能的 Functional Dependencies。
三大基本公理
- Reflexive(自反律):若 Y ⊆ X,則 X → Y
例:{SSN, SName} → SSN
- Augmentation(增補律):若 X → Y,則 XZ → YZ
例:SSN → D# 則 SSN,P# → D#,P#
- Transitive(遞移律):若 X → Y 且 Y → Z,則 X → Z
例:SSN → D# 且 D# → DPhone,則 SSN → DPhone
衍生規則
- Union(合併律):若 X → Y 且 X → Z,則 X → YZ
- Decomposition(分解律):若 X → YZ,則 X → Y 且 X → Z
- Pseudo-transitive(偽遞移律):若 X → Y 且 WY → Z,則 WX → Z
若 A → B 且 B → C,根據哪個公理可推出 A → C?
若 X → Y 且 X → Z,根據 Union 規則可得到什麼?
1NF(First Normal Form)
定義
Relation 的每個 attribute 對每個 tuple 都是 single-valued(atomic,不可再分割)。
不允許的情況
- Multi-valued attributes(多值屬性)
- Composite attributes(複合屬性)
- Nested relations(巢狀關聯)
範例:1NF 正規化
正規化前
SSN, SName, Major, GPA
Major 是 multi-valued(一個學生可能有多個主修)
正規化後
SSN, SName, GPA
SSN, Major
將 multi-valued attribute 拆出成新的 relation,以原 PK + 該 attribute 為新 PK
下列哪個 relation 違反 1NF?
將 multi-valued attribute 正規化為 1NF 的方法是?
Partial FD 與 Full FD
- Partial FD:X → Y 中,X 的某個真子集也能決定 Y
例:{SSN, P#} → PName,但 P# → PName 也成立 → partial
- Full FD:X → Y 中,X 的任何真子集都不能決定 Y
例:{SSN, P#} → Hours,SSN 或 P# 單獨都無法決定 Hours → full
2NF(Second Normal Form)
定義
在 1NF 基礎上,每個 nonkey attribute 都 fully dependent on PK(不能有 partial dependency)。
注意:只有 PK 是 composite key 時才可能有 partial dependency
範例:2NF 正規化
正規化前
SSN, P#, Hours, PName
P# → PName 是 partial dependency(P# 是 PK 的真子集)
正規化後
SSN, P#, Hours
P#, PName
將 partial dependency 的 attribute 拆出,以 determinant 為新 PK
在 R(A, B, C, D) 中,若 A → C 成立,這是什麼類型的 FD?
2NF 要求消除什麼?
Transitive FD
X → Z 且 Z → Y,其中 Z 不是 candidate key 也不是 PK 的子集。
此時 Y 透過 Z 間接依賴 X,稱為 transitive dependency。
3NF(Third Normal Form)
定義
在 2NF 基礎上,沒有 nonkey attribute 透過 transitive dependency 依賴 PK。
範例:Works-For
SSN, D#, DPhone
FDs:SSN → D#,D# → DPhone
DPhone 透過 D# 間接依賴 SSN → transitive dependency!
修改異常展示
點擊按鈕查看各種異常:
| SSN | D# | DPhone |
| 111 | D1 | 1234 |
| 222 | D1 | 1234 |
| 333 | D2 | 5678 |
正規化後
SSN, D#
D#, DPhone
消除 transitive dependency,各異常都解決了!
在 R(A, B, C) 中,若 A → B 且 B → C(B 不是 candidate key),C 對 A 是什麼關係?
3NF 在 2NF 基礎上額外消除了什麼?
BCNF(Boyce-Codd Normal Form)
定義
在 3NF 基礎上,沒有任何 attribute(包括 key attribute)透過 transitive dependency 依賴 PK。
更精確地說:對於每個非平凡的 FD X → Y,X 必須是 superkey。
BCNF 比 3NF 更嚴格:3NF 只要求 nonkey attribute,BCNF 連 key attribute 也要求。
範例 1
A, B, C
FDs:A, B → C 且 C → B
C → B 中,C 不是 superkey → 違反 BCNF
BCNF 正規化
C, B
A, C
範例 2:學生選課
Student-SSN, Course, Instructor
FDs:
- Student-SSN, Course → Instructor
- Instructor → Course(每位教師只教一門課)
Instructor → Course 中,Instructor 不是 superkey → 違反 BCNF
BCNF 正規化
Instructor, Course
Instructor, Student-SSN
⚠ 注意:錯誤的分解方式可能產生 spurious tuples(虛假元組),分解時必須確保 lossless join!
BCNF 與 3NF 的主要差異是什麼?
錯誤的 BCNF 分解可能導致什麼問題?
Normal Form 關係圖
越高的 Normal Form 消除越多異常,但分解後的 relation 越多,join 操作也越多。
實務上達到 3NF 或 BCNF 就算是「好的」relation design。
各 NF 消除的問題
| Normal Form | 消除的問題 | 基於 |
1NF | Multi-valued / composite attributes | Atomic values |
2NF | Partial dependency | Full FD on PK |
3NF | Transitive dependency (nonkey) | No transitive FD |
BCNF | Transitive dependency (all attrs) | Every determinant is superkey |
4NF | Multi-valued dependency | MVD |
5NF | Join dependency | JD |
下列 Normal Form 的包含關係,何者正確?
綜合練習:Course-Taking 正規化
原始 Relation:
S-SSN, C#, S-Name, C-Name, I-SSN, I-Name, Grade
Functional Dependencies:
- S-SSN, C# → S-Name, C-Name, I-SSN, I-Name, Grade(PK → all)
- S-SSN → S-Name
- C# → C-Name, I-SSN
- I-SSN → I-Name
跟著步驟一步步正規化!點擊「下一步」展開。
1判斷是否為 1NF
檢查所有 attribute 是否都是 single-valued(atomic)。
✓ 是 1NF!所有 attribute 都是 atomic(single-valued)。
2找出 Partial Dependencies
PK 是 {S-SSN, C#}(composite key),檢查是否有 nonkey attribute 只依賴 PK 的一部分:
- S-SSN → S-Name → Partial(S-SSN 是 PK 的真子集)
- C# → C-Name, I-SSN → Partial(C# 是 PK 的真子集)
- 由 I-SSN → I-Name 加上 C# → I-SSN,所以 C# → I-Name 也是 partial
32NF 正規化
消除 partial dependencies,拆成三個 relation:
Student(S-SSN, S-Name)
Course-Taking(S-SSN, C#, Grade)
Course-Teaching(C#, C-Name, I-SSN, I-Name)
4檢查 3NF
檢查每個 relation 是否有 transitive dependency:
- Student(S-SSN, S-Name) → ✓ OK
- Course-Taking(S-SSN, C#, Grade) → ✓ OK
- Course-Teaching(C#, C-Name, I-SSN, I-Name) → ✗ 有問題!
C# → I-SSN → I-Name(I-SSN 不是 candidate key → transitive dependency)
53NF 正規化
將 Course-Teaching 的 transitive dependency 拆開:
Course-Teaching(C#, C-Name, I-SSN)
Instructor(I-SSN, I-Name)
6最終結果
4 個 relations,全部在 3NF:
Student(S-SSN, S-Name)
Course-Taking(S-SSN, C#, Grade)
Course-Teaching(C#, C-Name, I-SSN)
Instructor(I-SSN, I-Name)
✓ 所有 relation 都在 3NF!沒有 partial dependency,沒有 transitive dependency。
選擇題測驗
共 18 題,涵蓋 FD、Partial/Transitive Dependency、1NF~BCNF 判斷、正規化步驟。
已答:0 / 18
1. Functional Dependency X → Y 表示什麼?
2. 下列何者是 Armstrong's Axiom 的基本公理?
3. 1NF 要求什麼?
4. 若 PK 是 {A, B},且 A → C 成立,這是什麼類型的 dependency?
5. 2NF 在 1NF 基礎上額外要求什麼?
6. 在 R(A, B, C) 中,A → B 且 B → C(B 不是 candidate key),此 relation 最高是幾 NF?
7. 3NF 的定義是什麼?
8. BCNF 比 3NF 更嚴格的地方在於?
9. Works-For(SSN, D#, DPhone) 中 SSN → D# → DPhone,若刪除 D1 部門的最後一個員工會怎樣?
10. 將 multi-valued attribute 正規化為 1NF 時,新 relation 的 PK 是什麼?
11. R(A, B, C, D) PK={A,B},FD: A,B→C,D 且 A→C。要達到 2NF 應如何分解?
12. Spurious tuples 是什麼?
13. 下列哪個 relation 在 BCNF?
14. Reflexive 公理說的是什麼?
15. Course-Taking(S-SSN, C#, S-Name, C-Name, I-SSN, I-Name, Grade) 中,S-SSN → S-Name 是什麼類型的 dependency?
16. 正規化到 3NF 後的 Course-Teaching(C#, C-Name, I-SSN) 中,為什麼 I-Name 被移除了?
17. 下列何者不是修改異常(Modification Anomaly)?
18. 實務上,資料庫設計通常正規化到哪個程度就足夠了?