正規化不是把寬 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 通常分三步:
- 拆開右側,讓每條 FD 右邊只有一個 attribute。
- 移除左側 extraneous attribute。
- 移除可由其他 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 用更新責任交換讀取簡單度。