正規化是關聯式資料庫設計中,為了減少資料冗餘、避免異常(插入、更新、刪除異常),依照一系列規範(範式)將關聯結構逐步分解的過程。範式之間呈遞進關係:滿足高階範式必然滿足所有低階範式。
| 範式 | 核心要求 | 解決的問題 |
|---|---|---|
| 1NF(第一範式) | 每個屬性不可再分(原子性) | 消除重複群、多值屬性 |
| 2NF(第二範式) | 非主鍵屬性完全函數依賴於整個主鍵(針對複合主鍵) | 消除部分函數依賴 |
| 3NF(第三範式) | 非主鍵屬性不傳遞依賴於主鍵(即:非主鍵不依賴其他非主鍵) | 消除傳遞函數依賴 |
| BCNF(巴斯-科德範式) | 在 3NF 基礎上,每個決定因素都是候選鍵(無多餘候選鍵) | 處理主鍵屬性間的依賴異常 |
| 4NF(第四範式) | 消除非平凡多值依賴(MVD) | 處理獨立的多值屬性 |
| 5NF(第五範式/完美範式) | 所有連接依賴皆由候選鍵推導 | 極少數極複雜場景 |
若主鍵為 (A, B),屬性 C 由 A 單獨決定,則稱 C 部分依賴於主鍵,違反 2NF。必須拆分為 (A, C) 與 (A, B, ...) 兩表。
A → B 且 B → C(B 非主鍵),則 C 傳遞依賴於 A,違反 3NF。拆分為 (A, B) 與 (B, C)。
3NF 允許主鍵屬性依賴非主鍵,BCNF 禁止。例如 (學生, 科目, 教師),若一位教師只教一科,則 教師 → 科目,教師 成為決定因素但非候選鍵,違反 BCNF,需拆分。
原始表(不滿足 1NF)
訂單表
OrderID | Customer | Products(多值) | Address
1001 | 張三 | 筆記本, 滑鼠 | 台北市
1002 | 李四 | 手機 | 新北市
1NF:拆分多值屬性
訂單主檔 訂單明細
OrderID Customer OrderID Product
1001 張三 1001 筆記本
1002 李四 1001 滑鼠
1002 手機
2NF:移除部分依賴(假設明細主鍵為 OrderID+Product)
若 Customer 僅依賴 OrderID,則屬部分依賴,已在上步拆分解決。
3NF:移除傳遞依賴
若 Address 依賴 Customer,而 Customer 非主鍵,則再拆分:
客戶表
Customer | Address
張三 | 台北市
李四 | 新北市
正規化是資料庫設計的基石。掌握 1NF~3NF 的判斷與拆分技巧,能讓你設計出結構清晰、易維護、擴展性強的資料模型。記住:理論為實務服務,適度即可。