MySQL 三大正規化

AaronLee發表於2019-10-28

一般地,在進行資料庫設計時,應遵循三大原則,也就是我們通常說的三大正規化,即第一正規化要求確保表中每列的原子性,也就是不可拆分;第二正規化要求確保表中每列與主鍵相關,而不能只與主鍵的某部分相關(主要針對聯合主鍵),主鍵列與非主鍵列遵循完全函式依賴關係,也就是完全依賴;第三正規化確保主鍵列之間沒有傳遞函式依賴關係,也就是消除傳遞依賴。

第一正規化

第一正規化(1NF)要求資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值。
若某一列有多個值,可以將該列單獨拆分成一個實體,新實體和原實體間是一對多的關係。
在任何一個關聯式資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關聯式資料庫。
第一正規化是最基本的正規化。如果資料庫表中的所有欄位值都是不可分解的原子值,就說明該資料庫表滿足了第一正規化。

第一正規化的合理遵循需要根據系統的實際需求來定。比如某些資料庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個資料庫表的欄位就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行儲存,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了資料庫的第一正規化

MySQL 三大正規化

第二正規化

滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。
第二正規化要求實體中沒一行的所有非主屬性都必須完全依賴於主鍵;即:非主屬性必須完全依賴於主鍵。
完全依賴:主鍵可能由多個屬性構成,完全依賴要求不允許存在非主屬性依賴於主鍵中的某一部分屬性。
若存在哪個非主屬性依賴於主鍵中的一部分屬性,那麼要將發生部分依賴的這一組屬性單獨新建一個實體,並且在舊實體中用外來鍵與新實體關聯,並且新實體與舊實體間是一對多的關係。
第二正規化在第一正規化的基礎之上更進一層。第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個資料庫表中,一個表中只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中。

比如要設計一個訂單資訊表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為資料庫表的聯合主鍵,如下表所示。

訂單資訊表

MySQL 三大正規化

這樣就產生一個問題:這個表中是以訂單編號和商品編號作為聯合主鍵。這樣在該表中商品名稱、單位、商品價格等資訊不與該表的主鍵相關,而僅僅是與商品編號相關。所以在這裡違反了第二正規化的設計原則。

而如果把這個訂單資訊表進行拆分,把商品資訊分離到另一個表中,把訂單專案表也分離到另一個表中,就非常完美了

第三正規化

滿足第三正規化必須先滿足第二正規化。
第三正規化要求:實體中的屬性不能是其他實體中的非主屬性。因為這樣會出現冗餘。即:屬性不依賴於其他非主屬性。
如果一個實體中出現其他實體的非主屬性,可以將這兩個實體用外來鍵關聯,而不是將另一張表的非主屬性直接寫在當前表中。
第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。

比如在設計一個訂單資料表的時候,可以將客戶編號作為一個外來鍵和訂單表建立相應的關係。而不可以在訂單表中新增關於客戶其它資訊(比如姓名、所屬公司等)的欄位。

MySQL 三大正規化

相關文章