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