1. 程式人生 > >資料庫設計三正規化的舉例說明

資料庫設計三正規化的舉例說明

前言

       資料庫課本上都把正規化寫到五正規化了,但是實際應用中,滿足三正規化已經足夠了,五正規化太多餘了。

三種正規化是條件遞增的聯絡(即後一個正規化是在前一個條件滿足的情況下引入新的條件)。

例如

 正規化

滿足條件

一正規化(1NF)

條件a

二正規化(2NF)

條件a,條件b

三正規化(3NF)

條件a,條件b,條件c

下面詳細解釋一下

第一正規化(1nf)

滿足條件:

  1. 原子性,即資料庫表裡的欄位都是不可分割的

例如下面學生表的設計明顯不滿足要求,年級專業是可以再分的,就不能偷懶放在一塊

學號

姓名

年齡

年級專業

201511216776

王玉偉

20

15級軟工

符合第一正規化的做法為

學號

姓名

年齡

年級

專業

201511216776

王玉偉

20

15級

軟工

第二正規化(2nf)

滿足條件:

  1. 原子性,即資料庫表裡的欄位都是不可分割的
  2. 表中必須有主鍵
  3. 其他非主屬性必須完全依賴主鍵(不能依賴主鍵一部分,這是針對聯合主鍵說的)

針對條件三解釋一下(假設學號為主鍵)

    我們以學號為主鍵的時候,確保該學生別的欄位都完全依賴學號,不能出現下面這種課程名不依賴學號而依賴課程號的設計。

學號

姓名

年齡

課程名

課程號

201511216776

王玉偉

20

英語

20003

符合第二正規化的做法

學號

姓名

年齡

201511216776

王玉偉

20

課程名

課程號

英語

20003

解釋一下聯合主鍵中的要求

       下面是我之前設計的一個表,學號sno與課程號cno做聯合主鍵,而第二正規化要求的完全依賴,下表並沒有做到從這個表中可以看出,姓名依賴學號,課程名依賴課程號,但是這都是依賴了一部分,只有成績對學號和課程號都依賴,因此是不符合第二正規化的

符合第二正規化的設計為(即拆成三個表,只展示一下表的欄位)

Sno

Cno

grade

Cno

cname

Sno

sname

第三正規化(3nf)

滿足條件:

  1. 原子性,即資料庫表裡的欄位都是不可分割的
  2. 表中必須有主鍵
  3. 其他非主屬性必須完全依賴主鍵(不能依賴主鍵一部分,這是針對聯合主鍵說的)
  4. 非表中主鍵欄位完全直接依賴主鍵,不能是傳遞依賴

例如下表,學院依賴於主鍵學號,但是學院地址 依賴於學院,這樣對主鍵就是不是直接依賴(這裡可能會有人疑問地址也是能拆成省市區的欄位,這裡不拆也是可以的,因為表示的就是地址欄位)

學號

姓名

年齡

年級

學院

學院地址

201511216776

王玉偉

20

15級

計算機學院

內蒙古呼和浩特市賽罕區

符合第三正規化的做法(刪去有間接依賴的欄位)

學號

姓名

年齡

年級

學院

201511216776

王玉偉

20

15級

計算機學院