範式 是關聯式資料庫結構設計的規範標準,分為 1NF 到 6NF,實務上 **滿足 3NF 通常即足夠**。本文以通俗範例逐層拆解 1NF、2NF、3NF 定義、違反情形與修正步驟,助你建立不冗餘、易維護的資料模型。
1NF (最低要求) ⊂ 2NF ⊂ 3NF ⊂ BCNF ⊂ 4NF ⊂ 5NF ⊂ 6NF (最高) 實務建議:達到 3NF 即可平衡正規化與效能
原始未正規化表: Customer | Item Purchased | Purchase Price Thomas | Shirt | $40 Maria | Tennis shoes | $35 Evelyn | Shirt | $40 Pajaro | Trousers | $25
問題:刪除 Thomas 會導致 Shirt $40 價格資訊遺失 (刪除異常);新增商品價格需虛擬顧客 (插入異常);修改 Shirt 價格需更新多列 (更新異常)。
定義:每個欄位皆為不可再分割的原子值,同一欄位不包含多值、無重複群組。
Tags 欄位存 "tag1,tag2,tag3"、或同一列重複 Phone1, Phone2, Phone3前提:滿足 1NF。定義:非主鍵屬性**完全函數相依**於**整個**候選鍵 (複合主鍵情況下,非主鍵不得僅相依於主鍵一部分)。
(Customer, Item Purchased) 複合主鍵Purchase Price:僅相依於 Item Purchased (部分相依) ❌結果:刪除顧客不影響商品價格;新增商品無需虛擬顧客。
前提:滿足 2NF。定義:非主鍵屬性**不傳遞相依**於候選鍵 (即:非主鍵 → 非主鍵 → 候選鍵 鏈條不得存在)。
Item_Price 表擴充: Item | Price | Supplier | Supplier_Phone Shirt | $40 | ABC Co. | 555-1234
問題:Supplier_Phone 相依於 Supplier,而 Supplier 相依於 Item → 傳遞相依 ❌
| 異常類型 | 1NF 解決 | 2NF 解決 | 3NF 解決 |
|---|---|---|---|
| 插入異常 | 無重複群組可插入 | 可單獨插入商品價格 | 可單獨插入供應商資訊 |
| 刪除異常 | - | 刪顧客不丟商品價格 | 刪商品不丟供應商電話 |
| 更新異常 | - | 改價格只改一列 | 改供應商電話只改一列 |
掌握 1NF→2NF→3NF 三步拆解法,資料模型不再臃腫、異常全消,奠定高效能、可擴展系統的堅實基石。