吳集林 莫穎均
摘要:數(shù)據(jù)庫邏輯設(shè)計的重點是將關(guān)系模式進(jìn)行規(guī)范化,消除不合適的函數(shù)依賴。本文以注記的形式闡述了幾種關(guān)系范式之間的關(guān)系,給出了幾個判斷關(guān)系范式的條件,并從鍵碼的定義出發(fā)給出了求解鍵碼的方法,也從鍵碼出發(fā),利用函數(shù)依賴圖,給出了關(guān)系模式規(guī)范化的圖形方法,這種方法可以一步到位寫出分解后的關(guān)系模式,學(xué)生容易理解和操作。
關(guān)鍵詞:數(shù)據(jù)庫設(shè)計;關(guān)系范式;鍵碼;模式分解
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)27-0017-03
1 概述
數(shù)據(jù)庫設(shè)計的一個核心是數(shù)據(jù)庫的邏輯設(shè)計,主要是以關(guān)系規(guī)范化理論為基礎(chǔ),設(shè)計出數(shù)據(jù)庫中較為合理的關(guān)系模式。關(guān)系模式如果沒有規(guī)范化,可能會造成數(shù)據(jù)冗余、插入異常、修改異常、刪除異常[2],而建立一個好的數(shù)據(jù)庫,就需要克服這四個方面的問題。但是關(guān)系規(guī)范化理論對于學(xué)生來講既是一個重點,也是一個難點,其關(guān)鍵是如何對關(guān)系模式進(jìn)行分解,達(dá)到某一范式的要求,學(xué)生對這個方面的內(nèi)容很難掌握透徹,已有一些文獻(xiàn)對這個問題進(jìn)行討論[3-8],其中有的論文[3]~[5]只是用一個實際例子對教材上的內(nèi)容進(jìn)行詳細(xì)的介紹,幫助學(xué)生加深理解教材上的內(nèi)容,并無自己的新的思想,有的論文[6-7]雖然給出了自己的算法,但算法對初學(xué)者來說算法難以理解、記憶,可操作性不強(qiáng),在文獻(xiàn)[8]中提出了基于函數(shù)依賴的模式分解方法來消除部分依賴和傳遞依賴,并用文字對如何規(guī)范成第2NF和3NF的算法進(jìn)行了詳細(xì)的說明,比前面幾種文獻(xiàn)容易理解得多。本文結(jié)合自己的教學(xué)經(jīng)驗,以注記的形式對幾種關(guān)系范式的概念給出了幾點說明,給出了幾個判斷關(guān)系范式的條件,并從鍵碼的定義出發(fā)給出了求解鍵碼的一種簡單方法,也從鍵碼出發(fā),利用函數(shù)依賴圖,給出了關(guān)系模式規(guī)范化的圖形方法,這種方法可以一步到位寫出分解后的關(guān)系模式,經(jīng)過教學(xué)實踐發(fā)現(xiàn)效果很好。
2 鍵碼的求法
除1NF以外,幾乎每一種范式的條件都跟鍵碼有關(guān),因此對關(guān)系進(jìn)行規(guī)范以前,必須知道該關(guān)系的鍵碼,下面先給出鍵碼的定義,然后給出求解鍵碼的一種方法。
定義 如果一個或多個屬性{[A1,A2,......An]}滿足如下條件:則稱該集合為關(guān)系R的鍵碼:(1)這些屬性函數(shù)決定該關(guān)系的所有其他屬性;(2) {[A1,A2,......An]}的任何真子集都不能函數(shù)決定R的所有其他屬性。
根據(jù)鍵碼的定義,可得出如下注記:(1)鍵碼是函數(shù)決定U的所有屬性的最小的屬性集;(2)若某屬性只出現(xiàn)在函數(shù)依賴的左邊,則它是任一鍵碼的成員,我們稱之為L類屬性;(3)若某屬性只出現(xiàn)在函數(shù)依賴的右邊,則它一定不是鍵碼的成員,我們稱之為R類屬性;(4)若某屬性在任何函數(shù)依賴的左右兩邊都沒出現(xiàn),則它肯定是任一鍵碼的成員,我們稱之為N類屬性;(5)若某屬性既出現(xiàn)函數(shù)依賴的左邊,又出現(xiàn)在函數(shù)依賴的右邊,則它可能是鍵碼的成員,也可能不是,我們稱之為LR類屬性。我們利用這些注記,先考慮L類和N類屬性,然后逐步加上LR類屬性,通過求屬性封閉集的方法來求鍵碼。
設(shè){X1,X2,X3,X4,…}為屬性集,記{X1,X2,X3,X4,…}+為{X1,X2,X3,X4,…}中任一屬性子集決定的屬性集。
例1 假設(shè)關(guān)系模式R(A,B,C,D),函數(shù)依賴有A→B,B→C,B→D求鍵碼。
解:因為A只出現(xiàn)在函數(shù)依賴的左邊,所以A必是任一健碼的成員,A+={A,B,C,D},故A為唯一的鍵碼。
例2 假設(shè)關(guān)系模式R(A,B,C,D,E),函數(shù)依賴有AB→C,C→D,D→A,求鍵碼。
解:因為B只出現(xiàn)在函數(shù)依賴的左邊,E在函數(shù)依賴中沒出現(xiàn),所以BE包含在關(guān)系的鍵碼中,而{B,E}[+]={B,E},{B,E,A}[+]={B,E,C}[+]={B,E,D}[+]={A,B,C,D,E},故函數(shù)的鍵碼為BEA、BED、BEC。
3 關(guān)系范式的幾個注記
關(guān)系模式根據(jù)其規(guī)范化程度的高低,從低至高分為第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC范式(BCNF)、第四范式(4NF)等等。然而根據(jù)教材給出的定義,3NF、BCNF、4NF定義中的前提是第一范式,也就是教材上給出第x范式的定義中的前提并在不是第x-1范式的基礎(chǔ)上定義的,下面對這一點進(jìn)行了說明,說明了滿足X范式的一定滿足X-1范式,另外給出了幾個注記,說明了這幾種關(guān)系范式之間的關(guān)系。
注記1 3NF必是2NF
關(guān)于這一點一些教材上給出了相似的證明[1][2],假設(shè)R滿足第三范式,R不滿足第二范式,設(shè)A是關(guān)系模式R的一個非主屬性,K是R的鍵碼,且K→A是部分依賴,則A必函數(shù)依賴于K的某個真子集K1,即K1→A,而K→K1,于是A傳遞依賴于K,與R為第三范式矛盾
注記2 若關(guān)系模式的鍵碼只含一個主屬性,則它一定滿足2NF
因為鍵碼只有一個屬性,它決定非主屬性的函數(shù)依賴是完全依賴,故此關(guān)系模式是第二范式
注記3 滿足BCNF的關(guān)系模式必滿足3NF
因為在3NF中的定義有:非主屬性對鍵碼不存在傳遞依賴,而BCNF中的定義有:任何屬性對鍵碼不存在傳遞依賴,而任何屬性包括主屬性與非主屬性,故BCNF范式比3NF范式的條件要強(qiáng),BCNF必是3NF
注記4 下列兩種描述都可作為BC范式的定義:1)屬于第一范式,且每個非平凡依賴的左邊必須包含鍵碼 2)屬于第一范式,且每個屬性都不傳遞依賴于鍵碼
證明:先證1)?2)
如果R屬于第一范式,且每個非平凡依賴的左邊必須包含鍵碼
反設(shè)屬性集A是鍵碼,屬性C由A傳遞決定,則存在屬性集B,使得A→B,B→C, 若B是鍵碼,而A也是鍵碼,于是A→B,B→A,C跟A的關(guān)系不是傳遞決定,于是B必不包含鍵碼,B→C的左邊不包含鍵碼,與假設(shè)矛盾;
再證2)?1)
如果R屬于第一范式,且每個屬性都不傳遞依賴于鍵碼
反設(shè)存在不包含鍵碼的屬性集A,A→B,設(shè)關(guān)系的鍵碼為C,則C→A,而A→B,則存在傳遞依賴C→B,與假設(shè)條件矛盾。
注記5 若R滿足第三范式,且只有一個鍵碼,則R為BC范式
證明:反設(shè)R不是BC范式,設(shè)存在不包含鍵碼的屬性集B,B→C,若C為非主屬性,設(shè)A為唯一的鍵碼,顯然A→B,于是C傳遞依賴于鍵碼A,與第三范式的條件矛盾;若C為主屬性,于鍵碼A可寫成(A-C,C),而B→C,于是(A-C,B)也是鍵碼,與條件中只有一個鍵碼相矛盾。
注記6 若關(guān)系R滿足第三范式,且到少有兩個鍵碼A、B,A中存在真子集A1,B中存在子集B1,A1→B1,[]則R必不是BC范式
證明:條件中的A1→B1左邊不包含鍵碼,故它不是BC范式
注記7 4NF必是BCNF
一個關(guān)系是4NF的前提是:屬于第一范式,且每個非平凡多值依賴的決定因素都必須包含鍵碼,而BCNF范式有一個等價定義:屬于第一范式,且每個非平凡依賴的左邊必須包含鍵碼,而非平凡多值依賴是非平凡依賴的推廣形式,于是BC范式是4NF的特殊情況,所以4NF必是BCNF
4 關(guān)系規(guī)范化的過程
關(guān)系規(guī)范化的過程,指的是將原有模式進(jìn)行分解,消除不合適的函數(shù)依賴(部分依賴和傳遞依賴),達(dá)到關(guān)系模式的逐步規(guī)范化,其基本步驟如下:
(1) 設(shè)原關(guān)系模式為R(U),將U中的每個原子屬性提升為一般屬性,使得每個屬性不可再分,達(dá)到1NF的要求。
(2) 對1NF進(jìn)行投影分解,消除關(guān)系模式中非主屬性對鍵碼的部分依賴,規(guī)范成2NF
(3) 對2NF進(jìn)行投影分解,消除關(guān)系模式中非主屬性對鍵碼的傳遞依賴, 規(guī)范成3NF
(4) 對3NF進(jìn)行投影分解,消除關(guān)系模式中主屬性對鍵碼的傳遞依賴, 規(guī)范成BC范式
關(guān)系的范式還有4NF,5NF,一般情況下我們只要求達(dá)到3NF或BCNF即可,因此,因此本文只討論如何BCNF及以下的模式的規(guī)范。
5 用函數(shù)依賴圖進(jìn)行關(guān)系的規(guī)范化
函數(shù)依賴圖是一個以鍵碼為中心,體現(xiàn)給定關(guān)系模式中函數(shù)依賴的模型圖。從圖上可以清楚地看出存在的函數(shù)依賴、部分函數(shù)依賴、傳遞函數(shù)依賴,從中可以比較直觀地發(fā)現(xiàn)模式中存在的不合適的函數(shù)依賴,從而為進(jìn)行模式的規(guī)范化打下基礎(chǔ)。由于一般情況下只要求關(guān)系模式滿足3NF或BCNF的要求即可,本文我們只討論怎樣規(guī)范成第三范式(3NF)或BCNF。
在函數(shù)依賴圖中,對于屬性集X、Z,如果X→Z,又存在屬性集Y使得X→Y→Z,稱X傳遞決定Z,此時Y稱為中途點。否則稱X→Z為直接決定
下面舉例說明如何利用函數(shù)依賴圖進(jìn)行關(guān)系模式的規(guī)范化,設(shè)有教師任課關(guān)系模式TDC(TNO,TNAME,TITLE,ADDR,DNO,DNAME,LOC,CNO,CNAME,LEVEL,CREDIT)
其中各屬性分別表示教師編號,教師姓名,教師職稱,家庭地址,所在系編號,所在系名稱,所在系的地址,任課課程編號,課程名稱,教學(xué)水平,學(xué)分?,F(xiàn)將它規(guī)范成BCNF
第一步,求出關(guān)系模式中的鍵碼
根據(jù)實際情況,TDC蘊含的函數(shù)依賴有(TNO→TNAME,TNO→TITLE,TNO→ADDR,TNO→DNO,DNO→DNAME,DNO→LOC,CNO→CNAME,CNO→CREDIT, (TNO,CNO) →LEVEL)
出現(xiàn)在函數(shù)依賴左邊的屬性為TNO與CNO,而{TNO,CNO}+={ TNO,TNAME,TITLE,ADDR,DNO,DNAME,LOC,CNO,CNAME,LEVEL,CREDIT }
所以關(guān)系模式TDC的鍵碼為(TNO,CNO),并且是唯一的鍵碼
第二步,以鍵碼為中心,做出函數(shù)依賴圖
第三步,消除關(guān)系模式中非主屬性對主屬性的部分函數(shù)依賴,將鍵碼的每個子集與完全直接決定的屬性轉(zhuǎn)化成一個關(guān)系模式,這樣就可消除非主屬性對鍵碼的部分依賴。例如由圖1可以看出由TNO完全直接決定的屬性有TNAME、TITLE、ADDR、DNO,由CNO完全直接決定的屬性有CNAME、CREDIT,由(TNO、CNO)完全直接決定的屬性有LEVEL,所以得到三個模式,分別取名為T(TNO,TNAME,TITLE,ADDR,DNO),C(CNO,CNAME、CREDIT),TC(TNO、CNO,LEVEL)
第四步,消除關(guān)系模式中非主屬性對主屬性的傳遞依賴,從每一個中途點出發(fā),將每一個中途點與它直接決定的屬性合成一個模式,從而消除非主屬性對鍵碼的傳遞依賴。例如上面的圖中DNO是中途點,它直接決定的屬性為{DNAME, LOC},于是得到關(guān)系模式D(DNO,DNAME,LOC)。至此原關(guān)系模式TDC規(guī)范成四個關(guān)系模式T(TNO,TNAME,TITLE,ADDR,DNO),D(DNO,DNAME,LOC),C(CNO,CNAME、CREDIT),TC(TNO、CNO,LEVEL),這四個模式都為3NF,另外這四個關(guān)系模式中每個模式都只有唯一的鍵碼,根據(jù)上面的注記5,它們都已滿足BCNF,可以驗證分解后的四個關(guān)系模式符合模式分解的兩個原則:無損連接與保持依賴,這里就不再詳細(xì)說明。
6 結(jié)束語
本文分析了數(shù)據(jù)庫幾種主要關(guān)系范式之間關(guān)系,給出了鍵碼的求法,并以鍵碼為中心,利用函數(shù)依賴圖,給出了關(guān)系模式規(guī)范化的圖解方法,此方法清楚、簡單,不需要過多的文字分析,可以一步到位寫出結(jié)果,學(xué)生易于掌握。
參考文獻(xiàn):
[1] 史嘉權(quán).數(shù)據(jù)庫系統(tǒng)教程[M].北京:清華大學(xué)出版社,2001(7):119,121,122-129.
[2] 劉世峰.數(shù)據(jù)庫基礎(chǔ)與應(yīng)用[M].北京:中央開放大學(xué)出版社,2004(1):51-68.
[3] 陳元勛.關(guān)系數(shù)據(jù)庫在關(guān)系數(shù)據(jù)庫設(shè)計中的應(yīng)用[J].丹東紡專學(xué)報,2004(3):56-57.
[4] 李展宗.關(guān)系數(shù)據(jù)庫設(shè)計規(guī)范化的理解[J].福建電腦,2005(7):75-77.
[5] 丁智斌,石浩磊.關(guān)系數(shù)據(jù)庫設(shè)計與規(guī)范化[J].計算機(jī)與數(shù)字工程,2005(2):114-116.
[6] 周煒,周敏剛.關(guān)系數(shù)據(jù)庫二、三范式判別方法[J].航空航天技術(shù),2006(4):24-26.
[7] 李忠嘩.關(guān)系數(shù)據(jù)庫模式分解算法及應(yīng)用[J].張家口師專學(xué)報,2002(3):55-56.
[8] 馬雪英.基于函數(shù)依賴的模式分解方法 [J].計算機(jī)應(yīng)用與軟件,2004(4):31-33.
[通聯(lián)編輯: ]