摘 要:規(guī)范化問題是關(guān)系數(shù)據(jù)理論的重點(diǎn)和難點(diǎn),僅從理論上作出解釋,很難使學(xué)生理解,本文提出通過一個(gè)完整的實(shí)例,采用逐步深入的方法解決關(guān)系模式中存在的問題,使學(xué)生加深對規(guī)范化理論的理解。
關(guān)鍵詞:數(shù)據(jù)依賴;規(guī)范化;范式
中圖分類號:G64
文獻(xiàn)標(biāo)識碼:B
文章編號:1672,5913f2008)O1-0051-03
1 問題的提出
我們建立一個(gè)描述學(xué)校教務(wù)的數(shù)據(jù)庫,該數(shù)據(jù)庫涉及的對象包括學(xué)生的學(xué)號(sno)、學(xué)生姓名(sname)、所在系(sdept)、系主任姓名(Mname)、教師姓名(Tname)、課程號(cno)、成績(Grade)。假設(shè)用一個(gè)單一的關(guān)系模式來表示,則該關(guān)系模式的屬性集合為:
U={Sno,Sname,Sdept,Mname,Tname,Cno,Grade}
從這個(gè)關(guān)系模式中,我們可以看出存在以下問題:
(1)數(shù)據(jù)冗余太大
比如:Sdept,Mname等列中數(shù)據(jù)項(xiàng)重復(fù)出現(xiàn),這將浪費(fèi)大量的存儲(chǔ)空間。
(2)更新異常(update Anomalies)
由于數(shù)據(jù)冗余,當(dāng)更新數(shù)據(jù)庫中的數(shù)據(jù)時(shí)必然造成麻煩,例如,張一改
換了系,從計(jì)算機(jī)系調(diào)到自動(dòng)化系,則需從整個(gè)關(guān)系中逐一找到其對應(yīng)的元組進(jìn)行修改,若漏改一處則造成數(shù)據(jù)矛盾。
(3)插入異常(InsertionAnomalies)
在StudentI表中,主碼是由學(xué)號和課程號組合而成的,兩者取值都不允許是空值。這樣,若有一新學(xué)生來報(bào)道,會(huì)由于他沒有選修任何一門課程而無法將其信息插入表中,這樣就形成了插入異常。如果一個(gè)系新成立,尚無學(xué)生,就無法把這個(gè)系及其系主任的信息存入數(shù)據(jù)庫,這樣也形成了插入異常。
(4)刪除異常(Deletion Anomalies)
在Studentl表中,若刪除張三,則整個(gè)元組不復(fù)存在,連同自動(dòng)化系主任吳總這一信息也會(huì)一并刪掉,這樣會(huì)引起信息丟失。
關(guān)系數(shù)據(jù)庫規(guī)范化理論是用來研究如何將一個(gè)“不好”的關(guān)系模型轉(zhuǎn)化為一個(gè)“好”的關(guān)系模型。其基本思想是通過合理的分解關(guān)系模式來消除其中不合適的數(shù)據(jù)依賴。以解決數(shù)據(jù)冗余、更新異常、插入異常、刪除異常問題。
2 函數(shù)依賴
函數(shù)依賴是數(shù)據(jù)依賴的重要組成部分,1NF,2NF,3NF,BCNF就是在函數(shù)依賴范疇內(nèi)實(shí)現(xiàn)分離。函數(shù)依賴的定義:設(shè)R(u)是屬性集u上的關(guān)系模式。x,Y是的u子集。若對于R(u)的任意一個(gè)可能的關(guān)系r,r中不可能存在兩個(gè)元組在x上的屬性值相等,而在Y上的屬性值不等,則稱x函數(shù)確定Y或Y函數(shù)依賴于X,記作X->Y。
在R(u)中,如果x可以推導(dǎo)出Y,并且對于x的任何一個(gè)真子集x’,都有x’不可以推導(dǎo)出Y,則稱Y對x的完全函數(shù)依賴。本例可以看出的完全函數(shù)依賴為:(學(xué)號,課程名)——成績。
在R(u)中,如果x可以推導(dǎo)出Y,但Y不完全函數(shù)依賴于x,則稱Y對x部分函數(shù)依賴。本例可以看出的完全函數(shù)依賴為:學(xué)號——姓名,系。
在R(U)中,如果x可以推導(dǎo)出Y,Y不屬于X,Y可以推導(dǎo)出Z,則稱x對z的傳遞函數(shù)依。本例可以看出的傳遞函數(shù)依賴:學(xué)號——系——系主任。
3 規(guī)范化
規(guī)范化的基本思想是逐步消除數(shù)據(jù)依賴中不合適的部分,是模式中的各關(guān)系模式達(dá)到某種程度的分離,就是實(shí)現(xiàn)概念的單一化,關(guān)系模式的規(guī)范化過程是通過對關(guān)系模式的分解來實(shí)現(xiàn)的,把底一級的關(guān)系模式分解為若干個(gè)高一級的關(guān)系模式。關(guān)系數(shù)據(jù)庫規(guī)范化理論認(rèn)為,一個(gè)關(guān)系數(shù)據(jù)庫中的每一個(gè)關(guān)系都必須滿足一定的約束條件,稱為范式。范式分為六個(gè)等級,一級比一級要求嚴(yán)格,一個(gè)較低范式的關(guān)系,可以通過關(guān)系的無損分解轉(zhuǎn)換為若干較高級范式關(guān)系的集合,這一過程就叫做關(guān)系規(guī)范化。
3. 1 1NF
在一個(gè)關(guān)系中,各字段均是不可再分的基本數(shù)據(jù)項(xiàng),且不存在重復(fù)字段,則稱該關(guān)系滿足第一范式。第一范式的關(guān)系是從關(guān)系的基本性質(zhì)而來的,任何關(guān)系都必須遵守。我們從表1中就可以看出第一范式不是一個(gè)好的關(guān)系,其原因就是關(guān)系模式存在數(shù)據(jù)冗余、更新異常、插入異常、刪除異常等問題。尋求解決這些問題的方法,這就是規(guī)范化的目的。
3.2 2NF
若R∈1NF,且每一個(gè)非主屬性都完全依賴于碼,則R∈2NF。
將1NF轉(zhuǎn)化為2NF,其實(shí)質(zhì)是采用投影分解法,將一個(gè)1NF的關(guān)系無損分解為幾個(gè)2NF的關(guān)系。分解方式為:將部分函數(shù)依賴(學(xué)號——姓名,系)單獨(dú)提取出來,把表分解為Student2和SGrade,分別如表2、表3。
分析Student2,其中仍然存在以下問題:
(1)數(shù)據(jù)冗余大。計(jì)算機(jī),王總各重復(fù)了兩次。
(2)更新異常。若計(jì)算機(jī)更換主任,則必須重復(fù)修改計(jì)算機(jī)每個(gè)學(xué)生對應(yīng)的主任的名字,若漏改一處則造成數(shù)據(jù)矛盾。
(3)插入異常。如果新開設(shè)一個(gè)系,會(huì)因?yàn)闆]有招生而不能插入相應(yīng)的信息。
(4)刪除異常。若刪除張三,則整個(gè)元組不復(fù)存在,連同自動(dòng)化系方面的信息一并刪掉,這樣會(huì)引起信息丟失。
存在以上問題的原因就是學(xué)生信息表中存在傳遞函數(shù)依賴:學(xué)號——系——主任。
3.3 3NF
關(guān)系模式R中若不存在這樣的碼x,屬性組Y及非主屬性z使得x->Y,Y->z成立,則稱R∈3NF。
要想使Student2滿足第三范式,就是消去掉表中的傳遞函數(shù)依賴,方法仍是對表的無損分解。分解方式為:將傳遞函數(shù)依賴單獨(dú)提取出來,把表分解為Student3和Sdeptxx,分別表4、表5。
分析Student3,仍然存在數(shù)據(jù)冗余問題。計(jì)算機(jī)重復(fù)了兩次。
分析SGrade,雖然滿足3NF,但仍然存在以下問題:(1)數(shù)據(jù)冗余大。趙一任C001這一信息重復(fù)了兩次。(2)更新異常。若趙一所帶的英語課程更換教師,則必須重復(fù)修改其所帶班級每個(gè)學(xué)生對應(yīng)的任課教師的名字,若漏改一處則造成數(shù)據(jù)矛盾。(3)插入異常。如果新來了一個(gè)英語老師,會(huì)因?yàn)闆]有學(xué)生選課而不能插入相應(yīng)的信息。(4)刪除異常。若刪除S002號的C003成績,則整個(gè)元組不復(fù)存在,連同周一是C003的任課教師的信息一并刪掉,這樣會(huì)引起信息丟失。存在以上問題的原因就是學(xué)生成績表SGrade中存在作為非主碼的“任課教師”是決定因素。
4 結(jié)論
我們通過一個(gè)實(shí)例來很好地說明了INF到2NF,2NF到3NF的規(guī)范化過程,可以根據(jù)規(guī)范化理論把3NF分解到BCNF,4NF等更高的關(guān)系模式。從理論上講范式越高,規(guī)范化的程度就越高,關(guān)系模式就越好,但是,關(guān)系數(shù)據(jù)庫一定的冗余是必要的,因?yàn)楸黻P(guān)聯(lián)時(shí)用的就是冗余列:另外,提高范式級別同時(shí)對數(shù)據(jù)庫訪問時(shí)間效率有時(shí)會(huì)有影響的,因?yàn)?,表之間的關(guān)聯(lián)是要花費(fèi)時(shí)間的,所以我們在進(jìn)行關(guān)系模式分解的時(shí)候,要根據(jù)實(shí)際應(yīng)用情況而定,以滿足一般程序設(shè)計(jì)的要求為標(biāo)準(zhǔn),權(quán)衡考慮數(shù)據(jù)冗余、更新異常、插入異常、刪除異常問題。