第一範式(1NF):元組的分量不可再分; 第一範式(1NF):元組的分量不可再分; 第二範式(2NF):所有分量唯一決定主鍵碼,不允許部分依賴; 第三範式(3NF):不允許傳遞依賴。 1. 第一範式(1NF) 強調的是列的原子性,即列不能夠再分成其他幾列。 考慮這樣一個表:【聯繫人】(姓名,性別,電 ...
-
第一範式(1NF):元組的分量不可再分;
- 第二範式(2NF):所有分量唯一決定主鍵碼,不允許部分依賴;
- 第三範式(3NF):不允許傳遞依賴。
- 巴斯-科德範式(BCNF)
- 第四範式(4NF)
- 第五範式(5NF,又稱完美範式)。
1. 第一範式(1NF)
強調的是列的原子性,即列不能夠再分成其他幾列。
考慮這樣一個表:【聯繫人】(姓名,性別,電話)
如果在實際場景中,一個聯繫人有家庭電話和公司電話,那麼這種表結構設計就沒有達到 1NF。要符合 1NF 我們只需把列(電話)拆分,即:【聯繫人】(姓名,性別,家庭電話,公司電話)。1NF 很好辨別,但是 2NF 和 3NF 就容易搞混淆。
2.第二範式( 2NF )
所謂第二範式,是指所有的非主屬性都完全依賴於關鍵字。從這個定義可以看出,第二範式不存在非主屬性對於部分候選關鍵字的部分依賴,不過允許非主屬性之間存在著傳遞依賴。
下麵是第二範式的優化實例:
假定選課關係表為SelectCourse(學號,姓名,年齡,課程名稱,成績,學分),關鍵字為組合關鍵字(學號,課程名稱),因為存在如下決定關係:
(學號,課程名稱) → (姓名,年齡,成績,學分)
這個資料庫表不滿足第二範式,因為存在如下決定關係:
(課程名稱) → (學分)
(學號) → (姓名,年齡)
即存在組合關鍵字中的欄位決定非關鍵字的情況。
由於不符合2NF,這個選課關係表會存在如下問題:
(1) 數據冗餘:
同一門課程由n個學生選修,"學分"就重覆n-1次;同一個學生選修了m門課程,姓名和年齡就重覆了m-1次。
(2) 更新異常:
若調整了某門課程的學分,數據表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。
(3) 插入異常:
假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入資料庫。
(4) 刪除異常:
假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分信息也被刪除了。很顯然,這也會導致插入異常。
把選課關係表SelectCourse改為如下三個表:
學生:Student(學號,姓名,年齡);
課程:Course(課程名稱,學分);
選課關係:SelectCourse(學號,課程名稱,成績)。
這樣的資料庫表是符合第二範式的, 消除了數據冗餘、更新異常、插入異常和刪除異常。
另外,所有單關鍵字的資料庫表都符合第二範式,因為不可能存在組合關鍵字。
3、第三範式(3NF)
所謂第三範式,是指每一個非主屬性既不部分依賴於也不傳遞依賴於關鍵字,也就是在第二範式的基礎上消除傳遞依賴(A>B>C)。
假定學生關係表為Student(學號,姓名,年齡,所在學院,學院地點,學院電話),關鍵字為單一關鍵字"學號",因為存在如下決定關係:
(學號) → (姓名,年齡,所在學院,學院地點,學院電話)
這個資料庫是符合2NF的,但是不符合3NF,因為存在如下決定關係:
(學號) → (所在學院) → (學院地點,學院電話)
即存在非關鍵欄位"學院地點"、"學院電話"對關鍵欄位"學號"的傳遞函數依賴。
它也會存在數據冗餘、更新異常、插入異常和刪除異常的情況,讀者可自行分析得知。
把學生關係表分為如下兩個表:
學生:(學號,姓名,年齡,所在學院);
學院:(學院,地點,電話)。
這樣的資料庫表是符合第三範式的,消除了數據冗餘、更新異常、插入異常和刪除異常。
參考:https://www.cnblogs.com/xiaxianfei/p/5454707.html