關聯資料表正規化(Normalization)--初論

正規化的理論很…文言文,當初在學習時可以說「有看沒有懂」,但多看一些例子加實作後,發現也沒有那麼難,但理論的基礎又很重要,所以我們先來聊聊這些文言文。

關聯表正規化

正規化最重要的就是處理「主鍵」與「屬性」間的「Functional Depedencies, FD, 功能相依」,它是一種由上而下(Top-Down)的分析法,依照正規化的層度不同,共分為1NF ~ 5 NF(Normal Form)共六種,我沒寫錯共六種,在3 NF ~ 4 NF之間有一個特別的NF稱BCNF(Boyce-Codd Normal Form),所以共六種。

在進行正規化之中,由1 NF進行到2 NF,一步步往下進行,而且2 NF一定滿足前一個1 NF的條件,同理,BCNF一定滿足1,2,3 NF的條件一般而言,最少要進行到3 NF或BCNF,如有特別的情況才會進行之後4, 5 NF

1NF --> 2NF --> 3NF --> BCNF --> 4NF --> 5NF

正規化的簡易定義

原始的正規化定義寫的非常數學及文言,我用盡量用白話一點來說:

  • 第一正規化(1 NF, First Normal Form):屬性只包含單元值(Atom Value)。
  • 第二正規化(2 NF, Second Normal Form):滿足1NF且關聯表沒有「部份相依(PFD, Partial Functional Depedencies)」。(去除非鍵屬性的部份相依)
  • 第三正規化(3 NF, Third Normal Form):滿足2NF且關聯表沒有「移遞相依(TDF, Transitive Functional Depedencies)」。(去除非鍵屬性的遞移相依)
  • Boyce-Codd正規化(BCNF, Boyce-Codd Normal Form):廣義的3 NF,關聯表有屬多個複合候選鍵,需要刪除候選鍵之間的功能相依。

第四、第五正規化一般不常見,時間充足的話,再介紹。

FD, Functional Depedencies 功能相依

先解決什麼是「功能相依」,後面你在來頭看就知道什麼是部份相依、移遞相依、候選鍵之間相依。

功能相依:在設計Schema時,描述屬性之間的關係就是「功能相依」,一個功能相依就是指兩個屬性集合間的限制條件。

功能相依定義:
若且唯若R中的X資料值可唯一決定Y的資料值時,稱Y功能相依於X。記成「X --> Y」或念成「X功能決定Y」。


以我們之前例子來說明:

A個人資料表(身份證字號, 姓, 名, 性別, 出生, 連絡電話)
B員工資料表(員工編號, 身份證字號, 抬頭, 部門, 電子郵件, 分機)

個人資料表中的身份證字號可以決定你的姓、名、性別…等,所以姓名等功能相依於身份證字號。員工資料表亦同,身份證字號、抬頭、部門…功能相依於員工編號

那以我們的「ChinaArea(省級, 一級, 二級, 區域, 行政區)」來看:
  • 省級 --> 一級
  • 省級 --> 二級
  • 省級 --> 區域
  • 一級 --> 二級
  • 一級 --> 區域
  • 二級 --> 區域
  • 區域 --> 行政區
大概會有以下的功能相依,也就是說這個ChinaArea有層層的關係,省級可以決定一級、二級、區域、行政區;一級可以決定二級、區域、行政區;區域可以決定行政區。

找出功能相依後,我們大概就能找出:
  • 不必要屬性
    一些不該屬於此關係表屬性。
  • 主鍵或候選鍵
    如果關聯表的所有屬性都是相依於一個或一組屬性來決定,那這個一個或一組屬性就是主鍵或候選鍵。
不必要的屬性,是指不應該在此資料表的屬性,我們修改一下個人資料表(身份證字號, 姓, 名, 性別, 出生, 連絡電話, 分機),在個人資料中,身份證字號並無法決定這個人的分機號碼,所以身份證字號與分機並無相依關係,即無「身份證字號 --> 分機」的關係,而分機屬性放入員工資料表就非常合適,一般家庭不太可能使用有分機的電話系統,而「員工編號 --> 分機」是非常合情合理的。

這裡算是前半部結束,從了解異常,了解Keys,了解NF有1到3/BCNF,了解功能相依,這樣我們才能繼續下去走正規化的路。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。