← 返回 DBM

Chapter 7: Normalization

嘉義大學 管理資訊系 李延憲 教授
進度:0%

正規化概述

Codd (1972) 提出正規化(Normalization)流程,目的是將設計不良的 relation 分解成更小的、具有良好性質的 relation。

核心目標

  • 消除資料冗餘(Data Redundancy)
  • 避免修改異常(Modification Anomalies):
    • Insertion Anomaly:無法插入某些資料
    • Update Anomaly:更新時需修改多筆記錄
    • Deletion Anomaly:刪除時意外丟失資料

基本概念

  • 正規化基於 Functional Dependency(功能相依)概念
  • 將不良 relation 逐步分解,每一步消除特定類型的問題

七種 Normal Form

由低到高:1NF2NF3NFBCNF4NF5NFDK/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 → YY → Z,則 X → Z
    例:SSN → D# 且 D# → DPhone,則 SSN → DPhone

衍生規則

  • Union(合併律):若 X → YX → Z,則 X → YZ
  • Decomposition(分解律):若 X → YZ,則 X → YX → Z
  • Pseudo-transitive(偽遞移律):若 X → YWY → 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 FDX → Y 中,X 的某個真子集也能決定 Y
    例:{SSN, P#} → PName,但 P# → PName 也成立 → partial
  • Full FDX → Y 中,X 的任何真子集都不能決定 Y
    例:{SSN, P#} → Hours,SSN 或 P# 單獨都無法決定 Hours → full

2NF(Second Normal Form)

定義

在 1NF 基礎上,每個 nonkey attributefully dependent on PK(不能有 partial dependency)。

注意:只有 PK 是 composite key 時才可能有 partial dependency

範例:2NF 正規化

正規化前

SSN, P#, Hours, PName

P# → PNamepartial 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 → ZZ → 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!

修改異常展示

點擊按鈕查看各種異常:

SSND#DPhone
111D11234
222D11234
333D25678

正規化後

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 → CC → 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。

All Relations 1NF 2NF 3NF BCNF 4NF 5NF DK/NF 實務目標

各 NF 消除的問題

Normal Form消除的問題基於
1NFMulti-valued / composite attributesAtomic values
2NFPartial dependencyFull FD on PK
3NFTransitive dependency (nonkey)No transitive FD
BCNFTransitive dependency (all attrs)Every determinant is superkey
4NFMulti-valued dependencyMVD
5NFJoin dependencyJD
下列 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. 實務上,資料庫設計通常正規化到哪個程度就足夠了?

術語表

Normalization
正規化。將設計不良的 relation 分解成更小、具有良好性質的 relation 的過程。由 Codd (1972) 提出。
Functional Dependency (FD)
功能相依。X → Y 表示 X 的值可以唯一決定 Y 的值。
Determinant
決定因子。在 FD X → Y 中,X 稱為 determinant(左邊)。
Partial FD
部分功能相依。X → Y 中,X 的某個真子集也能決定 Y。
Full FD
完全功能相依。X → Y 中,X 的任何真子集都不能決定 Y。
Transitive FD
遞移功能相依。X → Z 且 Z → Y,其中 Z 不是 candidate key。Y 透過 Z 間接依賴 X。
Normal Form (NF)
正規形式。衡量 relation 設計品質的標準,由低到高:1NF → 2NF → 3NF → BCNF → 4NF → 5NF → DK/NF。
1NF (First Normal Form)
第一正規形式。要求每個 attribute 都是 atomic(single-valued),不允許 multi-valued 或 composite attributes。
2NF (Second Normal Form)
第二正規形式。在 1NF 基礎上,消除 nonkey attribute 對 PK 的 partial dependency。
3NF (Third Normal Form)
第三正規形式。在 2NF 基礎上,消除 nonkey attribute 的 transitive dependency。
BCNF (Boyce-Codd Normal Form)
Boyce-Codd 正規形式。比 3NF 更嚴格,要求所有非平凡 FD 的 determinant 都是 superkey。
Insertion Anomaly
插入異常。因為資料冗餘,無法插入某些資料(例如無法新增沒有員工的部門)。
Deletion Anomaly
刪除異常。刪除某筆資料時,意外丟失其他有用的資訊。
Update Anomaly
更新異常。更新某個值時,需要修改多筆記錄才能保持一致性。
Decomposition
分解。將一個 relation 拆成多個更小的 relation 的過程。
Lossless Join
無損接合。分解後的 relations 透過 natural join 可以完整還原原始 relation,不會產生 spurious tuples。
Spurious Tuple
虛假元組。因為不正確的分解,在 join 時產生的不存在於原始資料的假記錄。
Superkey
超鍵。能唯一識別 relation 中每個 tuple 的 attribute 集合。
Candidate Key
候選鍵。最小的 superkey,移除任何 attribute 後就不再是 superkey。
Primary Key (PK)
主鍵。從 candidate keys 中選出的一個,用來唯一識別 tuple。
Armstrong's Axioms
Armstrong 公理。用來推導所有可能 FD 的公理系統,包含 Reflexive、Augmentation、Transitive 三大基本公理。
Atomic Value
原子值。不可再分割的單一值,是 1NF 的基本要求。
Data Redundancy
資料冗餘。同一份資料在多處重複儲存,是正規化要消除的主要問題。