資料庫設計三大正規化

thamsyangsw發表於2014-02-08

 

資料庫設計三大正規化

資料庫三正規化的意義:

      這也是為了資料庫設計做準備,對於表設計而言,我們需求何種程度的設計,這完全取決你資料的規模,好比你建房子,要是建個一兩層,基本上不需要什麼設計,直接開工就行,要是建個這樣的房子還找設計公司的話,這無疑是大材小用,浪費;但是,對建一座大廈來說,不做規劃,不請教不諮詢設計公司,後果難以想象了。

      當然,為了設計結構合理的資料庫,必須遵循一定的規則,在關聯式資料庫中這種規則就稱為正規化,正規化是符合某一種設計要求的總結。

1.第一正規化(1NF):確保每列保持原子性即列不可分

第一正規化是最基本的正規化。如果資料庫表中的所有欄位值都是不可分解的原子值,就說明該資料庫滿足第一正規化。

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

上圖所示的使用者資訊遵循第一正規化的要求,這樣對使用者使用城市進行分類的時候就非常方便,也提高了資料庫的效能。

 

2.第二正規化(2NF):屬性完全依賴於主鍵(屬性都是該物件擁有的)

第二正規化在第一正規化的基礎上更進一層,第二正規化需要確保資料庫表中每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個資料庫表中,一個表中只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中。

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

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

利用物件之間的關係設計表,確認表的個數:而如果把這個訂單資訊表進行拆分,把商品資訊分離到另一個表中,把訂單專案表也分離到另一個表中,就非常完美了,如下圖。

這裡這樣設計,在很大程度上減小了資料庫的冗餘,如果要獲取訂單的商品資訊,使用商品編號到商品資訊表中查詢即可。

3.第三正規化(3NF):屬性和主鍵不能間接相關(減少資料冗餘,這樣就可以通過主外來鍵進行表之間連線)

第三正規化:資料不能存在傳遞關係,即每個屬性都跟主鍵有直接關係而不是間接關係。像:a-->b-->c  屬性之間含有這樣的關係,是不符合第三正規化的。第三正規化是對第二正規化的細化。

    比如在設計一個訂單資料表的時候,可以將客戶編號作為一個外來鍵和訂單表建立相應的關係,而不可以在訂單表中新增關於客戶其他資訊(比如姓名、所屬公司)的欄位,如下面這兩個表所示的設計就是一個滿足第三正規化的資料庫表。

這樣在查詢訂單資訊的時候,就可以使用客戶編號來引用客戶資訊表中的記錄,也不必再訂單資訊表中多次輸入客戶資訊的內容,減小了資料冗餘。

例子:兒子的玩具車與玩具槍和爸爸是間接關係,應該拆為 兩個表,通過兒子將兩個表關聯起來:

    

 因為上表的玩具車與玩具槍屬於兒子,因此不符合第三正規化,對上表進行拆分

    

相關文章