← 所有文章2026.05.31 · CS 411 · 資料庫系統

Functional Dependencies 與正規化:從 Closure 推到 3NF、BCNF

用一條完整推理鏈串起 attribute closure、candidate key、minimal cover、lossless decomposition、3NF 與 BCNF。

正規化不是把寬 table 切小的儀式,而是讓每個 fact 只放在能決定它的 determinant 之下,並且只維護一次。

Functional dependency 表示決定關係

X → Y 表示任何兩筆合法資料只要 X 相同,Y 就必須相同。它是對所有合法狀態的規則,不是觀察今天 sample 得到的巧合。

假設 relation R(A,B,C,D,E) 有:

A  → BC
CD → E
B  → D
E  → A

可以用 closure 測試 A 是否為 key:

A⁺ = {A}
A → BC  => {A,B,C}
B → D   => {A,B,C,D}
CD → E  => {A,B,C,D,E}

A⁺ 包含所有 attribute,所以 A 是 superkey。它只有一個 attribute,已經不能再移除,因此也是 candidate key。

白話來說: Closure 是有規則的可達性搜尋。從已知 attribute 開始,反覆套用 FD,直到再也到不了新 attribute。

Candidate key 是最小 superkey

「最小」是指移除任何 attribute 都不再有完整 closure,不是所有可能 key 中字數最短的那一個。

在例子裡,E⁺ 可以先到 A,再到其他全部 attribute,所以 E 也是 candidate key。找到一個 key 不代表已經找到所有 key。

Minimal cover 簡化規則集合

Minimal cover 通常分三步:

  1. 拆開右側,讓每條 FD 右邊只有一個 attribute。
  2. 移除左側 extraneous attribute。
  3. 移除可由其他 FD 推導的 redundant dependency。

每次嘗試移除後,都要使用剩餘 FD 重新計算 closure。只靠直覺很容易漏掉間接路徑。

BCNF 在問誰能決定資料

Relation 符合 BCNF 的條件是:每條 non-trivial FD X → Y 的左側 X 都必須是 superkey。例子裡若 B → D 成立但 B 不是 superkey,同一個 B 對應的 D fact 就會重複出現在多列。

可依違規 FD 分解:

R1(B,D)
R2(A,B,C,E)

共同 attribute B 可以決定 R1,因此這個 decomposition 是 lossless。

為什麼有時選 3NF

BCNF 消除更多 redundancy,但 BCNF decomposition 可能失去 dependency preservation。3NF 允許右側是 prime attribute 的特殊情況,因此有機會讓原始 constraint 都能在單一 table 中檢查。

3NF synthesis 使用 minimal cover,依 determinant group 建 relation,移除被包含的 relation;如果沒有任何 relation 含 candidate key,再補一個 key relation。

取捨很明確:

  • BCNF 優先消除 dependency 導致的 redundancy。
  • 3NF 優先得到 lossless 且 dependency-preserving 的 decomposition。

正規化不負責哪些事

Normalization 不會替你決定 index、partition、cache 或 API shape。Normalized model 仍可能很慢。為已量測的 read path 做 denormalization 可以合理,但一定會新增同步責任,必須明確記錄。

複習卡

  • FD 是對所有合法 instance 的規則。
  • Closure 用來測 implication 與 superkey。
  • Candidate key 是最小 superkey。
  • 簡化 minimal cover 時要反覆重算 closure。
  • BCNF 要求每個 determinant 都是 superkey。
  • 3NF 可能保留 BCNF decomposition 會失去的 dependency。
  • Denormalization 用更新責任交換讀取簡單度。