數據庫的規範化(上一篇博客有寫到)的程度不一樣,便有了這麼多種範式。數據庫範式是數據庫設計必不可少的知識,沒有對範式的理解,就沒法設計出高效率、優雅的數據庫,甚至設計出錯誤誤的數據庫。課本中的定義比較抽象,不太直觀,也不易理解,記是確定記不住的。數據庫
關係數據庫
經常使用範式
關係數據庫知道了,再來理解範式。範式是關係數據庫關係模式規範化的標準,從規範化的寬鬆到嚴格,分爲不一樣的範式,一般使用的有第一範式。第二範式、第三範式及BC範式。範式是創建在函數依賴基礎上的。數據庫設計
函數依賴
若是一個表中某一個字段Y的值是由另一個字段或一組字段X的值來肯定的,就稱爲Y函數依賴於X。函數
函數依賴
定義
設X,Y是關係R的兩個屬性集合,當任什麼時候刻R中的任意兩個元組中的X屬性值相同時,則它們的Y屬性值也相同,則稱X函數決定Y,或Y函數依賴於X。3.平凡函數依賴當關系中屬性集合Y是屬性集合X的子集時(Y⊆X),存在函數依賴X→Y,即一組屬性函數決定它的全部子集,這種函數依賴稱爲平凡函數依賴。4.非平凡函數依賴當關系中屬性集合Y不是屬性集合X的子集時,存在函數依賴X→Y,則稱這種函數依賴爲非平凡函數依賴。5.徹底函數依賴設X,Y是關係R的兩個屬性集合,X’是X的真子集,存在X→Y,但對每個X’都有X’!→Y,則稱Y徹底函數依賴於X。6.部分函數依賴設X,Y是關係R的兩個屬性集合,存在X→Y,若X’是X的真子集,存在X’→Y,則稱Y部分函數依賴於X。7.傳遞函數依賴設X,Y,Z是關係R中互不相同的屬性集合,存在X→Y(Y !→X),Y→Z,則稱Z傳遞函數依賴於X。屬性關係
屬性之間有三種關係,但並非每一種關係都存在函數依賴。設R(U)是屬性集U上的關係模式,X、Y是U的子集:● 若是X和Y之間是1:1關係(一對一關係),如學校和校長之間就是1:1關係,則存在函數依賴X → Y和Y →X。● 若是X和Y之間是1:n關係(一對多關係),如年齡和姓名之間就是1:n關係,則存在函數依賴Y → X。●若是X和Y之間是m:n關係(多對多關係),如學生和課程之間就是m:n關係,則X和Y之間不存在函數依賴。案例分析
編輯spa
例: Student(Sno, Sname, Ssex, Sage, Sdept)設計
假設不容許重名,則有:blog
Sno → Ssex, Sno → Sage , Sno → Sdept,博客
Sno ←→ Sname, Sname → Ssex, Sname → Sageit
Sname → Sdeptclass
但Ssex -\→ Sage效率
若 X → Y,而且 Y → X, 則記爲 X ←→ Y。
若 Y 不函數依賴於 X, 則記爲 X -\→ Y。
在關係模式R(U)中,對於U的子集X和Y,
1.若是 X → Y,但 Y 不爲 X 的子集,則稱 X → Y 是非平凡的函數依賴
例:在關係SC(Sno, Cno, Grade)中,
非平凡函數依賴: (Sno, Cno) → Grade。
2.若 X → Y,但 Y 爲 X 的子集, 則稱 X → Y 是平凡的函數依賴
平凡函數依賴: (Sno, Cno) → Sno ,(Sno, Cno) → Cno。
3.若 x → y 而且,存在 x 的真子集 x1,使得 x1 → y, 則 y 部分依賴於 x。
例:學生表(學號,姓名,性別,班級,年齡)關係中,
部分函數依賴:(學號,姓名)→ 性別,學號 → 性別,因此(學號,姓名)→ 性別 是部分函數依賴。
4.若 x → y 而且,對於 x 的任何一個真子集 x1,都不存在 x1 → y 則稱y徹底依賴於x。
例:成績表(學號,課程號,成績)關係中,
徹底函數依賴:(學號,課程號)→ 成績,學號 -\→ 成績,課程號 -\→ 成績,因此(學號,課程號)→ 成績 是徹底函數依賴。
5.若x → y而且y → z,而y -\→ x,則有x → z,稱這種函數依賴爲傳遞函數依賴。
例:關係S1(學號,系名,系主任),
學號 → 系名,系名 → 系主任,而且系名 -\→ 學號,系主任 -\→ 系名,因此學號 → 系主任爲傳遞函數依賴。
- (學生,課程)是一個碼,課程卻決定了教材,這就叫作不徹底依賴,或者說部分依賴。
出現了這種狀況,就不知足第二範式了。
解決辦法:分解。進行投影分解:
3NF
若是關係模式R是2NF,且關係模式R(U,F)中的 全部非主屬性對任何候選關鍵字都不存在傳遞依賴,則稱關係R是屬於第三範式。第三範式(3NF);符合2NF,而且,消除傳遞依賴。上圖中符合2NF ,但存在傳遞依賴(老師——>老師職稱。一個老師必定能肯定一個老師職稱)。解決辦法:分解。投影分解:其餘範式
第四範式:要求把同一表內的多對多關係刪除。第五範式:從最終結構從新創建原始結構。BC範式(BCNF):符合3NF,而且,主屬性不依賴於主屬性。若關係模式R屬於第一範式,且每一個屬性都不傳遞依賴於鍵碼,則R屬於BC範式。