資料庫設計三正規化的舉例說明
前言
資料庫課本上都把正規化寫到五正規化了,但是實際應用中,滿足三正規化已經足夠了,五正規化太多餘了。
三種正規化是條件遞增的聯絡(即後一個正規化是在前一個條件滿足的情況下引入新的條件)。
例如
正規化 |
滿足條件 |
一正規化(1NF) |
條件a |
二正規化(2NF) |
條件a,條件b |
三正規化(3NF) |
條件a,條件b,條件c |
下面詳細解釋一下
第一正規化(1nf)
滿足條件:
- 原子性,即資料庫表裡的欄位都是不可分割的
例如下面學生表的設計明顯不滿足要求,年級專業是可以再分的,就不能偷懶放在一塊
學號 |
姓名 |
年齡 |
年級專業 |
201511216776 |
王玉偉 |
20 |
15級軟工 |
符合第一正規化的做法為
學號 |
姓名 |
年齡 |
年級 |
專業 |
201511216776 |
王玉偉 |
20 |
15級 |
軟工 |
第二正規化(2nf)
滿足條件:
- 原子性,即資料庫表裡的欄位都是不可分割的
- 表中必須有主鍵
- 其他非主屬性必須完全依賴主鍵(不能依賴主鍵一部分,這是針對聯合主鍵說的)
針對條件三解釋一下(假設學號為主鍵)
我們以學號為主鍵的時候,確保該學生別的欄位都完全依賴學號,不能出現下面這種課程名不依賴學號而依賴課程號的設計。
學號 |
姓名 |
年齡 |
課程名 |
課程號 |
201511216776 |
王玉偉 |
20 |
英語 |
20003 |
符合第二正規化的做法
學號 |
姓名 |
年齡 |
201511216776 |
王玉偉 |
20 |
課程名 |
課程號 |
英語 |
20003 |
解釋一下聯合主鍵中的要求
下面是我之前設計的一個表,學號sno與課程號cno做聯合主鍵,而第二正規化要求的完全依賴,下表並沒有做到從這個表中可以看出,姓名依賴學號,課程名依賴課程號,但是這都是依賴了一部分,只有成績對學號和課程號都依賴,因此是不符合第二正規化的
符合第二正規化的設計為(即拆成三個表,只展示一下表的欄位)
Sno |
Cno |
grade |
Cno |
cname |
Sno |
sname |
第三正規化(3nf)
滿足條件:
- 原子性,即資料庫表裡的欄位都是不可分割的
- 表中必須有主鍵
- 其他非主屬性必須完全依賴主鍵(不能依賴主鍵一部分,這是針對聯合主鍵說的)
- 非表中主鍵欄位完全直接依賴主鍵,不能是傳遞依賴
例如下表,學院依賴於主鍵學號,但是學院地址 依賴於學院,這樣對主鍵就是不是直接依賴(這裡可能會有人疑問地址也是能拆成省市區的欄位,這裡不拆也是可以的,因為表示的就是地址欄位)
學號 |
姓名 |
年齡 |
年級 |
學院 |
學院地址 |
201511216776 |
王玉偉 |
20 |
15級 |
計算機學院 |
內蒙古呼和浩特市賽罕區 |
符合第三正規化的做法(刪去有間接依賴的欄位)
學號 |
姓名 |
年齡 |
年級 |
學院 |
201511216776 |
王玉偉 |
20 |
15級 |
計算機學院 |