第一範式,第二範式,第三範式,BCNF範式理解

引用自 http://www.javashuo.com/article/p-uywfwoac-cq.htmlhtml

基礎知識
實體:現實世界中客觀存在並能夠被區別的事物。好比「一個學生」、「一本書」、「一門課」等等。值得強調的是這裏所說的「事物」不單單是看得見摸得着的「東西」,它也能夠是虛擬的,好比說「老師與學校的關係」。數據庫

屬性:教科書上解釋爲:「實體所具備的某一特性」,因而可知,屬性一開始是個邏輯概念,好比說,「性別」是「人」的一個屬性。在關係數據庫中,屬性又是個物理概念,屬性能夠看做是「表的一列」。函數

元組:表中的一行就是一個元組。.net

份量:元組的某個屬性值。在一個關係數據庫中,它是一個操做原子,即關係數據庫在作任何操做的時候,屬性是「不可分的」。不然就不是關係數據庫了。htm

碼:表中能夠惟一肯定一個元組的某個屬性(或者屬性組),若是這樣的碼有不止一個,那麼你們都叫候選碼,咱們從候選碼中挑一個出來作老大,它就叫主碼。blog

全碼:若是一個碼包含了全部的屬性,這個碼就是全碼。get

主屬性:一個屬性只要在任何一個候選碼中出現過,這個屬性就是主屬性。基礎

非主屬性:與上面相反,沒有在任何候選碼中出現過,這個屬性就是非主屬性。引用

外碼:一個屬性(或屬性組),它不是碼,可是它別的表的碼,它就是外碼。總結

第一範式
第一範式列不能再分。

第二範式
第二範式創建在第一範式的基礎上,非主屬性徹底依賴於碼。
簡單說:消除部分依賴。

(什麼是碼?) 表中能夠惟一肯定一個元組的某個屬性(或者屬性組),若是這樣的碼有不止一個,那麼你們都叫候選碼,咱們從候選碼中挑一個出來作老大,它就叫主碼。注意碼能夠包含多個屬性。

要理解第二第三範式須要理解徹底函數依賴、部分函數依賴、傳遞函數依賴。

徹底函數依賴
定義:設X,Y是關係R的兩個屬性集合,X’是X的真子集,存在X→Y,但對每個X’都有X’!→Y,則稱Y徹底函數依賴於X。

好比經過學號->姓名

部分函數依賴
定義:設X,Y是關係R的兩個屬性集合,存在X→Y,若X’是X的真子集,存在X’→Y,則稱Y部分函數依賴於X。

須要借用知乎劉慰教師的例子用一下,本身也理解了很長時間。

 

碼用(學號+課程),爲何要加課程呢?由於不一樣課程成績是經過學號查不出來的。

不過用(學號+課程)看成碼是否是有些問題?

(學號+課程)->姓名,可是學號->姓名

(學號+課程)->系名,可是學號->系名

(學號+課程)->系主任,可是學號->系主任

這個就是部分依賴,說實話我看定義一臉懵逼。

要是上面那張表符合第二範式。須要將表拆分爲兩張表。

一張是 學號、課程、分數表

另一張是 學號、姓名、系名、系主任表

 

傳遞函數依賴
設X,Y,Z是關係R中互不相同的屬性集合,存在X→Y(Y !→X),Y→Z,則稱Z傳遞函數依賴於X。

https://blog.csdn.net/rl529014/article/details/48391465

採用這位大佬的例子
在關係R(學號 ,宿舍, 費用)中,(學號)->(宿舍),宿舍!=學號,(宿舍)->(費用),費用!=宿舍,因此符合傳遞函數的要求

第三範式
知足第二範式的條件下不存在傳遞函數依賴。

要知足第三範式,在分紅兩張表的時候第二張表仍是有問題?

學號->系名,系名->系主任 傳遞依賴。

須要將系名和系主任另外新建一張表。

 

總結:
第一範式:簡單說 列不能再分

第二範式:簡單說 創建在第一範式基礎上,消除部分依賴

第三範式:簡單說 創建在第二範式基礎上,消除傳遞依賴。

碼:表中能夠惟一肯定一個元組的某個屬性(或者屬性組),若是這樣的碼有不止一個,那麼你們都叫候選碼,咱們從候選碼中挑一個出來作老大,它就叫主碼。

主屬性:一個屬性只要在任何一個候選碼中出現過,這個屬性就是主屬性。

非主屬性:與上面相反,沒有在任何候選碼中出現過,這個屬性就是非主屬性。

BCNF範式
https://www.2cto.com/database/201404/290140.html

BCNF是3NF的改進形式

一個知足BCNF的關係模式的條件:

  1.全部非主屬性對每個碼都是徹底函數依賴。

  2.全部的主屬性對每個不包含它的碼,也是徹底函數依賴。

  3.沒有任何屬性徹底函數依賴於非碼的任何一組屬性。

 

如上表

(倉庫名,管理員)->(物品名,數量)

(管理員,物品名)->(倉庫名,數量)

可是(倉庫名)->(管理員) 不知足第二條

因此須要改爲兩種表:

第一張:倉庫名,管理員

第二張:倉庫名,物品名,數量

相關文章
相關標籤/搜索