iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

網頁服務開發之路系列 第 23

Day23. MySQL: 資料庫正規化 Database normalization

學習資源: codedata - Database normalization

  1. 降低資料重複性
  2. 避免資料更新異常

在實務上,BCNF被視為大部分應用程式所需的最高階正規形式

  1. 第1正規形式 (1NF)
  2. 第2正規形式 (2NF)
  3. 第3正規形式 (3NF)
  4. BCNF正規形式 (BCNF)
  5. 第4正規形式 (4NF)
  6. 第5正規形式 (5NF)

資料庫正規化實作 - 練習

第1正規形式 (first normal form, 1NF)

  1. 「若且唯若關聯表中的每一個屬性其值皆為基元值 (Atomic Value)」
    1. 每一個欄位只能有一個基元值(Atomic)即單一值
    2. 沒有任何兩筆以上的資料是完全重覆
    3. 資料表中有主鍵, 而其他所有的欄位都相依於「主鍵」
  2. 非正規形資料因同一欄位存在複數值,會發生無法進行演算的問題

_做法

將重複的資料項分別儲存到不同的記錄中, 並加上適當的主鍵

第2正規形式 (second normal form, 2NF)

  1. 分割資料表;亦即將「部分功能相依」的欄位「分割」出去,再另外組成「新的資料表」
  2. 「若且唯若關聯表中,所有非鍵值屬性皆完全功能相依於主鍵」
    1. 非Key值完全從屬於候補Key值
  3. 換言之,「部分功能相依」只有當「主鍵」是由「多個欄位」組成時才會發生(亦即複合主鍵),也就是當某些欄位只與「主鍵中的部分欄位」有「相依性」, 而與另一部分的欄位沒有相依性

_做法

  1. 檢查是否存在「部分功能相依」
  2. 將「部分功能相依」的欄位分割出去,再另外組成新的資料表

第3正規形式 (third normal form, 3NF)

  1. 分割資料表;亦即將「遞移相依」或「間接相依」的欄位「分割」出去,再另外組成「新的資料表」
  2. 「一個關聯表為第三正規化表格,若且唯若該關聯表中,不存在非鍵值屬性遞移相依於主鍵」
  3. 非Key值推移從屬於候補Key值

_做法

  1. 檢查是否存在「遞移相依」
  2. 將「遞移相依」的欄位「分割」出去,再另外組成「新的資料表」

BCNF正規形式 (!Boyce/Codd normal form; BCNF)

  1. 適用時機: 如果資料表的「主鍵」是由「多個欄位」組成的, 則必須再執行Boyce-Codd正規化
  2. 規則: 「主鍵」中的各欄位不可以相依於其他非主鍵的欄位
  3. BCNF去除了屬性間的不必要的函式依賴,「任何屬性(包括非主屬性和主屬性)都不能被非主屬性所決定」
  4. 任何一個BCNF必然滿足
    1. 所有非主屬性都完全函式依賴於每個候選鍵
    2. 所有主屬性都完全函式依賴於每個不包含它的候選鍵
    3. 沒有任何屬性完全函式依賴於非候選鍵的任何一組屬性

第4正規形式 (fourth normal form, 4NF)

  1. 「符合BCNF,再除去所有的多值相依 (Multi-Valued Dependency)」
    1. 多值相依: 關聯表R中有3個欄位以上, R(A,B,C), 主鍵為ABC, 而A對應B時, B有 多個值相對應﹔A對應C時, C有多個值相對應, B和C 無關

第5正規形式 (fifth normal form, 5NF)

  1. 「符合4NF,且沒有合併相依 (Join Dependency)」
  2. 合併相依: 如果表格T可以透過其子集而重建,那麼表格T就是具有合併相依

上一篇
Day22. MySQL: 效率
下一篇
Day24. HTTP 通訊協定 Part1
系列文
網頁服務開發之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言