關聯式資料庫設計需遵循範式以消除異常、減少冗余。本文系統整理 1NF、2NF、3NF、BCNF 定義、違反情形、分解方法與權衡原則。
每個屬性值皆為不可再分割的最小單位。
違反例:員工(工號, 姓名, 電話) -- 一人有多支電話
解法:
1. 重複工號姓名 (電話為主鍵) -- 不推薦
2. 電話拆分為 公司電話、住宅電話
3. 強制單一電話 (視業務而定)
所有非主屬性完全相依於任一候選鍵 (無部分相依)。
違反例:選課(學號, 課號, 成績, 學分) -- 鍵(學號,課號),學分僅相依課號
解法:分解為 選課(學號,課號,成績) + 課程(課號,學分)
非主屬性不傳遞相依於任何候選鍵。
違反例:學生(學號, 姓名, 系號, 系名, 系址) -- 學號→系號→系名/系址
解法:分解為 學生(學號,姓名,系號) + 系(系號,系名,系址)
每個決定因素皆包含候選鍵。
違反例:倉管(倉庫, 配件, 員工, 數量)
條件:(倉庫,配件)→員工,員工→倉庫,(員工,配件)→數量
候選鍵:(倉庫,配件)、(員工,配件)
主屬性員工決定倉庫,但員工非超鍵 → 違反 BCNF
解法:分解為 管理(員工,配件,數量) + 所屬(員工,倉庫)
代價:函數相依 (倉庫,配件)→員工 遺失,需靠觸發器維護
BCNF ⊃ 3NF ⊃ 2NF ⊃ 1NF
4NF 處理多值相依,5NF 處理連接相依,適用於極複雜語義建模,實務較少見。