【資料庫基礎】關係資料庫規範化理論之正規化
因為在寫專案時與同伴關於資料庫到底建多少張表,每張表應包含哪些屬性產生分歧,所以又好好研究了一下關係型資料庫在設計時應該遵守怎樣的規則以提高資料庫效能。
在閱讀本篇文章前讀者須掌握關係資料庫結構基礎及函式依賴與鍵的定義。
可直戳以下目錄空降相關知識點↓↓↓
首先要明確關係模型可能存在的異常有:資料冗雜,更新異常,插入異常,刪除異常。所有正規化存在的意義不過是為了消除這些異常。滿足最低要求的一級叫做第一正規化(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.