引用自 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.沒有任何屬性徹底函數依賴於非碼的任何一組屬性。
如上表
(倉庫名,管理員)->(物品名,數量)
(管理員,物品名)->(倉庫名,數量)
可是(倉庫名)->(管理員) 不知足第二條
因此須要改爲兩種表:
第一張:倉庫名,管理員
第二張:倉庫名,物品名,數量