正規化是關聯式資料庫設計的科學方法論,透過六階範式 (1NF~6NF) 逐步消除資料冗余、更新異常、刪除異常。實務上 3NF 通常為甜蜜點,平衡正確性與查詢效能。本文深度解析前三階範式判斷邏輯與重構技巧。
定義:每個屬性 (欄位) 均為不可分割的原子值;同一欄位不包含多值、無重複群組。
違反特徵:
重構策略:
範例:員工技能表 `EmpSkills(EmpID, Skills)` → 拆分為 `Employee(EmpID, Name...)` + `EmpSkill(EmpID, SkillID)` + `Skill(SkillID, SkillName)`。
前提:滿足 1NF。
定義:所有非主鍵屬性完全函數相依於主鍵 (整個主鍵),不存在部分相依 (僅相依主鍵子集)。
違反場景:複合主鍵表中,某欄位僅相依主鍵之一部分。
例:`OrderDetail(OrderID, ProductID, ProductName, Qty)` — `ProductName` 僅相依 `ProductID`。
重構策略:
口訣:非主屬性不部分相依於主鍵。
前提:滿足 2NF。
定義:非主鍵屬性不傳遞相依於主鍵 (即:非主鍵屬性不相依於其他非主鍵屬性)。
違反場景:`Employee(EmpID, DeptID, DeptName, DeptLoc)` — `DeptName, DeptLoc` 傳遞相依 `DeptID` (非主鍵)。
重構策略:
口訣:屬性不相依於其他非主屬性。
| 維度 | 高度正規化 (3NF+) | 適度反正規化 |
|---|---|---|
| 資料完整性 | 極高 (無冗余、無異常) | 需應用層/觸發器維護一致性 |
| 查詢效能 | 多表 JOIN 成本高 | 預先 JOIN/彙總減少關聯 |
| 寫入效能 | 單表寫入、索引少 | 多表同步寫入、觸發器開銷 |
| 儲存空間 | 最小 | 冗余佔用空間 |
| 適用場景 | OLTP 核心交易、主資料管理 | OLAP 報表、資料倉儲維度表、高頻唯讀查詢 |
正規化不是教條,而是「理解冗余成本與查詢收益權衡」的分析框架。以 3NF 為基線,針對性引入受控冗余,才是成熟資料架構師的實務智慧。