定義:符合某一種級別的關系模式的集合,表示一個關系內部各屬性之間的聯系的合理化程度。
關系模式的范式主要有4種,即第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF范式。滿足這些范式條件的關系模式可以在不同程度上避免冗余問題、插入問題、更新問題和刪除問題。
符合高一級范式的設計,必定符合第一級范式。如符合2NF,必定符合1NF。
把一個給定關系模式轉化為某種范式的過程稱為關系范式的規范化過程,簡稱規范化。
- 第一范式(1NF)
關系模式R中每個屬性的值域都是不可分的簡單數據項的集合,則稱這個關系模式為第一范式關系模式1NF。
在任何一個關系數據庫系統中,第一范式都是一個最基本的要求。
- 第二范式(2NF)
定義:關系模式R是1NF的前提下,每一個非主鍵屬性都完全函數地依賴於R的鍵,則R成為第二范式關系模式2NF。
例如,關系模式TaobaoPucharsedLog(s_id#, date, buyer_id#, buyer_name, buyer_age, seller_id#, seller_age, goods_id#, goods_name, amount), 其中的鍵為s_id, buyer_id, seller_id, goods_id四個。就其中的 seller_name 屬性來說,它僅僅依賴於鍵 seller_id, 和其他鍵沒有關系,即非主鍵屬性 seller_name 部分地依賴於鍵{s_id#, buyer_id#, seller_id#, goods_id#},因此TaobaoPucharsedLog關系不符合2NF定義,不是2NF,這將導致三個問題:
(1)插入異常。插入時必須給定鍵值,如果鍵值的一部分為空,則導致數據無法插入。
(2)刪除異常。刪除某個信息,整個元組就不能存在了,也必須跟着刪除,從而丟失了其他信息,產生了刪除異常,即不應刪除的信息也刪除了。
(3)修改復雜。如果一個商品被購買了k次,goods_name就得重復存儲k次,存儲冗余大。此外,當數據更新時必須毫無遺漏地修改k條記錄中全部goods_name信息,造成修改的復雜化。
- 第三范式(3NF)
--
定義:如果關系模式是2NF,而且它的任意一個非鍵屬性都不傳遞地依賴於任何候選鍵,則R成為第三范式關系模式3NF。
意思就是說,不得存在傳遞式依賴,比如對於一個數據庫,里面的元素有son, person, father, grand_father,依賴關系是son->person, person->father, father->grand_father, 明顯有一個鏈式的傳遞,而3NF中禁止此類依賴的出現。
解決方式是將依賴關系分解,分解后的關系模式中不再存在傳遞依賴:
son->personson->fatherson->grand_father
滿足於3NF的依賴,可以避免查詢路徑過長導致詢問時間過長或更新異常。對於上面的例子來說,想查詢某個son的grandgrandgrand....father是誰,按照非3NF的依賴需要進行多次查詢,而3NF只需要進行一次查詢,效率大大提高。
- BCNF范式(Boyce Codd Normal Form)
--
BCNF是由Boyce和Codd提出來的,比3NF更進一步。通常認為BCNF是增強的3NF,有時也直接被成為3NF。
定義:設關系模式R是1NF。如果對於R的每個函數依賴X->Y,X必為候選鍵,則R是BCNF范式。
BCNF是比第三范式更嚴格的一個范式,它要求關系模型中所有的屬性(包括非鍵屬性和鍵屬性)都不傳遞地依賴於任何候選鍵。也就是說:
(1)所有非鍵屬性都完全函數依賴於每個候選鍵。
(2)所有鍵屬性都完全函數依賴於每個不包含它的候選鍵。
(3)沒有任何屬性完全函數依賴於非鍵的任何一組屬性。
例如:在關系模式SJP(S, J, P)中,S學生,J課程,P名次。每個學生每門課程都有一個確定的名次,每門課程每一名次都只有一個學生。可以得到函數依賴:{S,J}->P和{J,P}->S。顯然,{S,J}與{J,P}都是候選鍵。這兩個候選鍵各由兩個屬性組成,而且相交。這個關系模式中顯然沒有屬性對候選鍵的傳遞依賴或部分依賴,SJP是3NF,同時也是BCNF。
參考文獻
[1] 李建中 王珊.數據庫系統原理(第二版).電子工業出版社.2004
