關係數據庫設計中的四種範式

基本概念

碼:

碼是數據系統中的基本概念。所謂碼就是能唯一標識實體的屬性,是整個實體集的性質,而不是單個實體的性質。它包括超碼,候選嗎,主碼。

候選碼

(又稱候選碼,候選關鍵字,碼 ,candidate key):

設K是一個R(U)中的屬性或屬性集合(注意可以是屬性集合,也即多個屬性的組合),若K完全函數確定U,則K爲R的候選鍵(Candidate key);

通俗地說就是,能夠確定全部屬性的某個屬性或某組屬性,稱爲候選鍵。若候選鍵多於一個,則選定其中一個作爲主鍵。

主屬性:

包含在任何一個候選鍵中的屬性,叫做主屬性(Prime attribute),不包含在任何候選鍵中的屬性稱爲非主屬性或非鍵屬性或非關鍵字段。

函數依賴:

設R(U)是屬性集U上的關係模式。X,Y是U的子集。若對於R(U)的任意一個可能的關係r,r中不可能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不相等,則稱X函數確定Y或者Y函數依賴於X。記爲X->Y。

通俗來講就是,確定屬性X之後就可以確定Y,Y=f(X)。

部分/完全函數依賴:

在R(U)中,如果Y函數依賴於X,並且對於X的任何一個真子集X',都有Y不函數依賴於X', 則稱Y對X完全函數依賴。否則稱Y對X部分函數依賴。

傳遞函數依賴:

在R(U)中,如果X->Y, Y->Z, 則稱Z對X傳遞函數依賴。

下面通過一個例子來理解關係數據庫中1、2、3NF。

關係模型:(學號,姓名,系名,系主任,課名,分數)

第一範式(1NF):

數據庫表的每一個屬性都是不可分解的。

該關係模型符合第一範式。碼爲:(學號,課名)

但是存在以下幾個問題:

1、數據冗餘,一個學生可以選擇多節課,在存儲的過程中會有大量的重複數據(學號,姓名等)。

2、系名、系主任不能獨立存在。在刪除所有同一個系的學生信息之後,該系的信息將消失;在插入一個新的系的時候,由於沒有學生,所以插入操作不能進行。

3、學生在轉系的時候,需要修改每一條與該學生相關的數據。(系名,系主任)

因此我們需要更加規範的設計。

第二範式(2NF):

解決的關鍵就是,在1NF的基礎上,消除非主屬性對碼的部分函數依賴。

可以看到(學號,課名)決定了(分數)是完全函數依賴,(學號)決定了(姓名,系名,系主任)是部分函數依賴;

改進之後的關係模型爲:(學號,課名,分數)、(學號,姓名,系名,系主任)

我們在來看存在的那三個問題:

1、有改進。在選課之後,重複的數據減少(只有學號)。

2、無改進。

3、有改進,學生的系信息只有一條,所以只需要修改一次。

換個說法就是,2NF要求數據表裏的所有非主屬性都要和該數據表的主鍵有完全依賴關係。所有非主屬性都依賴於R的任意候選碼。

第三範式(3NF):

解決第二範式遺留的問題關鍵在於,系名可以單獨的決定系主任,也就是說非主屬性之間存在函數依賴導致了。

改進之後的關係模型:(學號,課名,分數)、(學號,姓名,系名)、(系名,系主任)

那麼問題2,就已經解決了。

所以3NF就是指表中的所有數據元素不但要能惟一地被主關鍵字所標識,而且它們之間還必須相互獨立,不存在其他的函數關係。

BCNF:

eg:假設倉庫管理關係表爲StorehouseManage(倉庫ID, 存儲物品ID, 管理員ID,數量),且有一個管理員只在一個倉庫工作;一個倉庫可以存儲多種物品。

主屬性:倉庫ID, 存儲物品ID, 管理員ID;非主屬性:數量。候選碼爲(倉庫ID,存儲物品ID)、( 存儲物品ID, 管理員ID)。

顯然,非主屬性依賴於任意候選碼,且非主屬性之間不存在函數依賴,符合第三範式。

但是存在的問題是:

1、先新增加一個倉庫,但尚未存放任何物品,是否可以爲該倉庫指派管理員? ——不可以,因爲物品名也是主屬性,根據實體完整性的要求,主屬性不能爲空。

2、某倉庫被清空後,需要刪除所有與這個倉庫相關的物品存放記錄,會帶來什麼問題? ——倉庫本身與管理員的信息也被隨之刪除了。

3、如果某倉庫更換了管理員,會帶來什麼問題? ——這個倉庫有幾條物品存放記錄,就要修改多少次管理員信息。

原因是:存在主屬性對碼的部分函數依賴。在此例中就是存在主屬性(倉庫名)對於碼(管理員,物品名)的部分函數依賴。

改進之後的關係模型是(倉庫ID,管理員ID)、(倉庫ID, 存儲物品ID,數量)

所以BCNF意味着在關係模式中每一個決定因素都包含候選鍵,在3NF的基礎上,消除主屬性對碼的部分函數依賴。

BCNF範式排除了任何屬性(不光是非主屬性,2NF和3NF所限制的都是非主屬性)對候選鍵的傳遞依賴與部分依賴。

參考鏈接:

https://blog.csdn.net/gui951753/article/details/79609874#第一範式

https://www.cnblogs.com/ybwang/archive/2010/06/04/1751279.html


 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章