數據庫範式:掀起你的蓋頭來(2)
2.2 第二範式2NF
2NF可以如下描述:不存在屬於部分主鍵的屬性。
什麼情況下會出現屬於部分主鍵的屬性呢?這個沒有通用的原則,我們隻能舉一個例子來說明。
例如:成績表Score主鍵是StudentID和CourseID,另外還有兩個屬性:一個是成績Grade,一個是StudentName。這裏的Grade就是完全由兩個主鍵決定的(標準術語叫做“完全依賴”),而StudentName就隻是StudentID的屬性(標準術語叫做“部分依賴”),因此這個設計就不符合2NF。
可能有人會問:那我就把StudentID作為主鍵可不可以?當然是可以的,但這樣一來CourseID就又不符合2NF了,因為CourseID不是StudentID的屬性。
說了半天了,都是說我們要遵守範式,但是不遵守範式究竟有什麼問題呢?
簡單的說就是兩個問題:冗餘(存儲、操作)、異常(插不進、刪多了)
(1)冗餘
一個學生選了很多課,這樣StudentName就要重複很多次,因為重複很多次,所以哪天學生改名了,所有的StudentName記錄都要更新。
(2)異常
插不進:剛來一個學生,還沒有選課(假設所有的課都要選),那麼他的StudentName就沒有地方記錄
刪多了:假如學生畢業的,所有的課都學完了,那麼所有的記錄都刪除,這樣學生的名字最後也沒有地方記錄了。
2.3 第三範式3NF
3NF可以這樣描述:屬性不遞歸依賴於主鍵。
什麼叫遞歸依賴呢?簡單的就是"A → B → C",那麼C就是遞歸依賴(所謂依賴,簡單的講就是“有關係”了)於A了。
注意:在數據庫中,存在這樣的關係要求A是主鍵、B和C不是主鍵。
下麵還是給一個簡單的例子:
假定學生關係表為Student(學號, 姓名, 年齡, 所在學院, 學院地點, 學院電話),關鍵字為單一關鍵字"學號",因為存在如下決定關係:
(學號) → (姓名, 年齡, 所在學院, 學院地點, 學院電話)
這個數據庫是符合2NF的,因為每個學生的這些信息都和學生本人是有關係的,也就是說由學號來決定,但是不符合3NF,因為存在如下關係:
(學號) → (所在學院) → (學院地點, 學院電話)
即存在非關鍵字段"學院地點"、"學院電話"對關鍵字段"學號"的遞歸依賴。
它也會存在數據冗餘、更新異常、插入異常和刪除異常的情況,大家可以根據2NF樣例中的分析方法分析。
2.4 其它範式
還有一堆其它範式:BCNF,甚至變態的4NF、5NF
但幾乎所有的大俠、大蝦、專家都說3NF就足夠了,沒有必要搞那麼多了,所以我也就不想追究了,大家若有興趣可以自己研究一下。
當然,不是說別人說沒用我就不管了,最主要的原因,還是在於範式並不是一個包打天下的絕妙武器,也不是數據庫設計的靈丹妙藥,也是有自己的局限性的,我們在下一篇文章裏麵詳細闡述。
最後更新:2017-04-02 00:06:43