關係數據庫規範化理論之範式

因爲在寫項目時與同伴關於數據庫到底建多少張表,每張表應包含哪些屬性產生分歧,所以又好好研究了一下關係型數據庫在設計時應該遵守怎樣的規則以提高數據庫性能。

在閱讀本篇文章前讀者須掌握關係數據庫結構基礎及函數依賴與鍵的定義。
可直戳以下目錄空降相關知識點↓↓↓


首先要明確關係模型可能存在的異常有:**數據冗雜,更新異常,插入異常,刪除異常。**所有範式存在的意義不過是爲了消除這些異常。滿足最低要求的一級叫做第一範式(1NF),在第一範式的基礎上提出了第二範式(2NF),在第二範式的基礎上又提出了第三範式(3NF),以後又提出了BCNF範式,4NF,5NF。範式的等級越高,應滿足的約束條件也越嚴格。規範的每一級別都依賴於它的前一級別。

首先我們給出一張數據表,該表涵蓋我們所要記錄的所有屬性
該關係模式爲:
SLC(Sno,Sname,Sdept(所在系),Loca(住處),Cno(課程號),Grade(成績))
Sno | Sname |Sdept|Loca|Cno|Grade
-------- | —
03001 | 甲|網絡工程|A|C1|95
03001 | 甲|網絡工程|A|C2|88
04001 | 乙|計算機科學與技術|B|C2|93
04001 | 乙|計算機科學與技術|B|C4|75
03002 | 丙|網絡工程|A|C1|77
02001 | 丁|網絡工程|A|C5|82
02002 | 戊|計算機科學與技術|B|C2|87

第一範式(1NF)

如果關係模式R中的所有屬性都是不可分的數據項,則稱R屬於第一範式,記爲R∈1NF。

對數據表進行分析,可知其每個屬性都不可再分,既滿足1NF,但由於只有屬性Grade對鍵(Sno,Cno)是完全函數依賴,而其他非主屬性都是對鍵的部分函數依賴,也正是因爲關係中存在部分函數依賴,導致數據操作中必然會存在異常,故需要運用投影運算將關係模式SLC進行分解,轉向更高一級範式。

第二範式(2NF)

若關係模式R∈1NF,且每個非主屬性都完全依賴於R的鍵,則R∈2NF。

關係SLC中,Sno、Cno爲主屬性,Sname,Sdept,Loca,Grade均爲非主屬性,Grade對鍵是完全函數依賴,其餘非主屬性對鍵均爲部分函數依賴,所以SLC∉2NF。
爲消除關係模式SLC中的部分函數依賴,我們採用投影分解法,將部分函數依賴從SLC中分解出來,得到以下兩個關係模式:
SC:(Sno,Cno)->[f]Grade
SL:(Sno->[f]Sname, Sno->[f]Sdept, Sno->[f]Loca)
分解後關係模式SC和SL的非主屬性對鍵都是完全函數依賴,所以SC∈2NF,SL∈2NF。

滿足2NF後我們再分析對數據進行操作時可能出現的異常問題是否得到有效解決:
①插入異常:
【已解決】若學生未選課,仍能將相關信息插入表SL中。
【未解決】若某系還未進行招生,即Sno爲空時,該系相關信息無法插入。
②刪除異常:
【已解決】即使刪除SC表中某個學生的全部選課信息,但表SL中仍有其其餘信息存在。
【未解決】若某系所有學生畢業,刪除全部學生信息的同時,該系的相關信息也被刪除了。
③更新異常:
【已解決】因爲學生的選課信息與基本信息分別存儲在兩張表中,基本信息在SL表中只保存了一次,所以當學生的基本信息(如姓名)產生變化時,Sname的值只需要修改一次,減少了數據冗雜。
【未解決】若某系改名,則要對每個學生記錄中的Sdept進行修改。
④數據冗雜
【未解決】一個系中有多個學生,對每個學生記錄,相關的Sdept和Loca都要儲存一次。

因此SL仍不是一個好的關係模式,需要對其進行進一步分解,轉化爲更高一級的範式。

第三範式(3NF)

對於關係模式R,每一個非主屬性鍵既不部分函數依賴於鍵,也不傳遞函數依賴於鍵,則R∈3NF。

關係模式SC中非主屬性Grade既不部分函數依賴於鍵,也不傳遞函數依賴於鍵,所以SC∈3NF,但在關係模式SL中,由於Sno->Sdept, Sdept->Loca, Sdept-(×)>Sno,所以Sno->[t]Loca,所以SL∉3NF。因此仍要對SL進行投影分解,得到以下兩個關係模式
S(Sno,Sname,Sdept)
L(Sdept,Loca)
現在關係模式S和L中既不存在部分函數依賴,也不存在傳遞函數依賴,所以S∈3NF,L∈3NF。

通常情況下,數據庫的設計滿足3NF即已達到標準,此時所有異常問題都能得到解決,但由於3NF只是規定了非主屬性對鍵的依賴關係,沒有限制主屬性對鍵的依賴關係,若存在主屬性對鍵的部分函數依賴和傳遞函數依賴關係,同樣會出現數據冗雜,插入異常,更新異常,刪除異常等問題,因此我們引入BC範式。

BC範式(BCNF)

關係模式R∈1NF,若X->Y,且Y∉X時X必爲鍵(),則R屬於BCNF。即在關係模式R中,若每一個決定因素都爲鍵,則R一定屬於BCNF。

對於滿足BCNF的關係模式,具有以下性質:
①所有非主屬性都完全函數依賴於每個候選鍵。
②所有主屬性都完全函數依賴於每個不包含它的鍵。
③沒有任何屬性完全函數依賴於非鍵的任何一組屬性。

簡單來說,相比3NF,BCNF更爲嚴格的一點就是要求R的每一個屬性都不部分函數依賴於候選鍵且不傳遞函數依賴於候選鍵
若R∈BCNF則R一定∈3NF,但反之不一定成立。

例如對關係模式S(Sno,Sname,Sdept),S∈3NF,同時S中Sno是唯一的決定性因素,因此S∈BCNF。

再例如,有一個關係模式City(Cname,Street,Code),其中Cname表示城市名,Street表示街道名,Code表示街道所在地區的郵政編碼,其上所具有的函數依賴關係爲:
(Cname,Street)->Code, Code->Cname
候選鍵爲(Cname,Street)和(Code,Street),不存在非主屬性,故City∈3NF,但決定因素Code不是鍵,所以City∉BCNF。

再舉一例,有一個關係模式STJ(S,T,J),其中S表示學生,T表示教師,J表示課程,每個教師只講授一門課程,每門課程可由多個教師講授,某一學生選定某門課程,就對應一個確定的教師,因此可得如下函數依賴:
(S,J)->T,(S,T)->J,T->J
(S,J)和(S,T)都是候選鍵,所以該關係中的S、T、J均爲主屬性,不存在非主屬性鍵,也就不存在非主屬性對鍵的部分函數依賴和傳遞函數依賴,STJ∈3NF,但STJ∉BCNF,因爲在T->J中,T是決定因素,但T不是鍵。

對於關係模式STJ,我們可舉一條實例分析不是BCNF的關係模式將會存在怎樣的異常問題
學生S |教師T|課程J
-------- | —
甲 | 教授A|大學語文
乙 | 教授A|大學語文
丙 | 教授B|大學語文
丁 | 教授B|大學語文
乙 | 教授C|大學英語
乙 | 教授D|大學英語
乙 | 教授E|C語言

數據冗雜:每個教師只講授一門課程,但選修了該門課程的多個學生記錄中都要存儲教師信息。
插入異常:若學生還沒有選課,則教師及課程的信息無法錄入,因爲主屬性此時爲空。
更新異常:當課程改名後,所有選修了該課程的學生紀錄需要逐條修改屬性J的值,容易造成數據的不一致,破壞數據庫完整性。
刪除異常:若選修了某門課程的所有學生畢業,在刪除所有學生信息的同時,有關課程的信息也被刪除了。
因此,將該關係模式分解爲以下兩個關係模式:ST(S,T)和TJ(T,J),他們間存在的函數依賴爲S->T,T->J
此時關係模式ST和TJ均達到BCNF,從而解決上述提到的異常。

一個關係模式如果達到了BCNF,那麼在函數依賴範疇內,它就已經實現了徹底的分離,消除數據操作中可能出現的異常。

多值依賴與第四範式(4NF)

###①多值依賴

在關係模式中,函數依賴不能表示屬性值之間的一對多聯繫,這些屬性之間有些雖然沒有直接關係,但存在間接的關係,把沒有直接聯繫、但有間接的聯繫稱爲多值依賴的數據依賴。
簡單來說,在函數依賴中,X與Y是否存在函數依賴關係,只需考察X,Y的兩組屬性,與別的屬性無關。而在多值依賴中,X與Y是否存在多值依賴還需看屬性Z。
數學定義: 設R(U)是一個屬性集合U上的一個關係模式,X, Y, 和Z是U的子集,並且Z=U-X-Y,多值依賴X->->Y成立當且僅當對R的任一個關係r,r在(X,Z)上的每個值對應一組Y的值,這組值僅僅決定於X值而與Z值無關。
平凡的多值依賴與非平凡的多值依賴:
若X->->Y,而Z爲空集,則稱X->->Y爲平凡的多值依賴;若Z不爲空,則稱其爲非平凡的多值依賴。
多值依賴的缺點在於數據冗雜太大。

舉例:有這樣一個關係 <倉庫管理員,倉庫號,庫存產品號> ,假設一個產品只能放到一個倉庫中,但是一個倉庫可以有若干管理員,那麼對應於一個 <倉庫管理員,庫存產品>有一個倉庫號,而實際上,這個倉庫號只與庫存產品號有關,與管理員無關,就說這是多值依賴。

多值依賴具有以下性質:
①對稱性:若X->->Y,則X->->Z,其中Z=U-X-Y
②傳遞性:若X->->Y,Y->->Z,則X->->Z-Y
③合併性:若X->->Y,X->->Z,則X->->YZ
④分解性:若X->->Y,X->->Z,則X->->(Y∩Z),X->->Z-Y,X->->Y-Z均成立,也就是說兩個相交的屬性子集均多值依賴於另一個屬性子集,則這兩個屬性子集因相交而分割成的3部分也都多值依賴於該屬性子集。
**⑤函數依賴可以看作是多值依賴的特例。**若X->Y,則X->->Y,因爲,當X->Y時,對X的每一個取值x,Y有一個確定的值y與之相對應,所以X->->Y。

那麼若想上例中的關係模式消除多值依賴,作模式分解,使子模式的Z=Ø,僅有平凡多值依賴,即子模式爲R1(倉庫號,倉庫管理員),R2(倉庫號,庫存產品號)
###②第四範式4NF
在多值依賴的基礎上我們引入第四範式的概念

設關係R(X,Y,Z),其中X,Y,Z是成對的、不相交屬性的集合。若存在非平凡多值依賴,則意味着對R中的每個屬性Ai(i=1,2…n)存在有函數依賴 X->Ai(X必包含鍵)。那麼R∈4NF。
第四範式限制關係模式的屬性之間不允許出現非平凡且非函數依賴的多值依賴。因爲對於每一個非平凡的多值依賴X->->Y,X都含有鍵,所以X->Y,故4NF所允許的非平凡的多值依賴實際上就是函數依賴。
若關係屬於4NF,則它必屬於BCNF;而屬於BCNF的關係不一定屬於4NF

在上述關係模式 <倉庫管理員,倉庫號,庫存產品號>中,鍵是(倉庫管理員,倉庫號,庫存產品號),倉庫號->->倉庫管理員,倉庫號->->庫存產品號,但倉庫號並不是一個鍵,因此該關係不是4NF,而分解成R1(倉庫號,倉庫管理員),R2(倉庫號,庫存產品號)後,雖然仍存在倉庫號->->倉庫管理員,倉庫號->->庫存產品號,但他們是平凡的多值依賴,所以R1∈4NF,R2∈4NF。

如果只考慮函數依賴,則BCNF的關係模式規範程度已經達到最高
如果考慮多值依賴,那麼4NF的關係模式規範化程度最高
另外還有其他數據依賴如連接依賴,多值依賴是連接依賴的一種特殊情況。在消除4NF關係模式中存在的連接依賴後則可進一步達到5NF,這裏不再贅述。

關係模式的規範化步驟

(1)取原始的1NF關係投影,消去非主屬性對鍵的部分函數依賴,從而產生一組2NF關係。
(2)取2NF關係的投影,消去非主屬性對鍵的傳遞函數依賴,產生一組3NF關係。
(3)取這些3NF的投影,消去決定因素不是鍵的函數依賴。產生一組BCNF關係。
(4)取這些BCNF關係的投影,消去其中不是函數依賴的非平多值依賴,產生一組4NF關係。

總結

規範化程度越高,分解就越細,所得關係的數據冗雜就越小,異常情況也就越少,但同時也增大了系統對數據檢索的開銷,降低了數據檢索的效率。系統只有對這些細分的關係進行自然連接,才能獲取所需的信息,而連接操作所需的系統資源和開銷是比較大的,因此,規範化程度越高的關係模式並非是最好的。
規範化應滿足的基本原則是由低到高,逐步規範,權衡利弊,適可而止。通常以滿足第三範式爲基本要求。

參考文獻:孟彩霞. 數據庫系統原理與應用[M]. 人民郵電出版社: 2008.

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