學習資源: codedata - Database normalization
- 降低資料重複性
- 避免資料更新異常
在實務上,BCNF被視為大部分應用程式所需的最高階正規形式
- 第1正規形式 (1NF)
- 第2正規形式 (2NF)
- 第3正規形式 (3NF)
- BCNF正規形式 (BCNF)
- 第4正規形式 (4NF)
- 第5正規形式 (5NF)
資料庫正規化實作 - 練習
第1正規形式 (first normal form, 1NF)
- 「若且唯若關聯表中的每一個屬性其值皆為基元值 (Atomic Value)」
- 每一個欄位只能有一個基元值(Atomic)即單一值
- 沒有任何兩筆以上的資料是完全重覆
- 資料表中有主鍵, 而其他所有的欄位都相依於「主鍵」
- 非正規形資料因同一欄位存在複數值,會發生無法進行演算的問題
_做法
將重複的資料項分別儲存到不同的記錄中, 並加上適當的主鍵
第2正規形式 (second normal form, 2NF)
- 分割資料表;亦即將「部分功能相依」的欄位「分割」出去,再另外組成「新的資料表」
- 「若且唯若關聯表中,所有非鍵值屬性皆完全功能相依於主鍵」
- 非Key值完全從屬於候補Key值
- 換言之,「部分功能相依」只有當「主鍵」是由「多個欄位」組成時才會發生(亦即複合主鍵),也就是當某些欄位只與「主鍵中的部分欄位」有「相依性」, 而與另一部分的欄位沒有相依性
_做法
- 檢查是否存在「部分功能相依」
- 將「部分功能相依」的欄位分割出去,再另外組成新的資料表
第3正規形式 (third normal form, 3NF)
- 分割資料表;亦即將「遞移相依」或「間接相依」的欄位「分割」出去,再另外組成「新的資料表」
- 「一個關聯表為第三正規化表格,若且唯若該關聯表中,不存在非鍵值屬性遞移相依於主鍵」
- 非Key值推移從屬於候補Key值
_做法
- 檢查是否存在「遞移相依」
- 將「遞移相依」的欄位「分割」出去,再另外組成「新的資料表」
BCNF正規形式 (!Boyce/Codd normal form; BCNF)
- 適用時機: 如果資料表的「主鍵」是由「多個欄位」組成的, 則必須再執行Boyce-Codd正規化
- 規則: 「主鍵」中的各欄位不可以相依於其他非主鍵的欄位
- BCNF去除了屬性間的不必要的函式依賴,「任何屬性(包括非主屬性和主屬性)都不能被非主屬性所決定」
- 任何一個BCNF必然滿足
- 所有非主屬性都完全函式依賴於每個候選鍵
- 所有主屬性都完全函式依賴於每個不包含它的候選鍵
- 沒有任何屬性完全函式依賴於非候選鍵的任何一組屬性
第4正規形式 (fourth normal form, 4NF)
- 「符合BCNF,再除去所有的多值相依 (Multi-Valued Dependency)」
- 多值相依: 關聯表R中有3個欄位以上, R(A,B,C), 主鍵為ABC, 而A對應B時, B有 多個值相對應﹔A對應C時, C有多個值相對應, B和C 無關
第5正規形式 (fifth normal form, 5NF)
- 「符合4NF,且沒有合併相依 (Join Dependency)」
- 合併相依: 如果表格T可以透過其子集而重建,那麼表格T就是具有合併相依