摘要:關(guān)系數(shù)據(jù)庫(kù)模式設(shè)計(jì)的好壞直接影響到整個(gè)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的性能,應(yīng)遵循關(guān)系規(guī)范化理論,而派生屬性是數(shù)據(jù)庫(kù)中的衍生數(shù)據(jù),是一種特殊屬性。闡述了派生屬性的四種類型,并用實(shí)例詳細(xì)分析了其存儲(chǔ)方式、修改方法及方法的好處,即不分解有派生屬性的第二范式關(guān)系,運(yùn)用表觸發(fā)器修改計(jì)算方法簡(jiǎn)單的派生屬性,運(yùn)用存儲(chǔ)過(guò)程修改計(jì)算方法復(fù)雜的派生屬性,既避免修改異常,又不會(huì)降低數(shù)據(jù)庫(kù)修改的效率。
關(guān)鍵詞:派生屬性;關(guān)系模式;關(guān)系規(guī)范化;數(shù)據(jù)庫(kù)設(shè)計(jì)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2012)28-6652-03
隨著信息系統(tǒng)在各行各業(yè)的蓬勃發(fā)展,數(shù)據(jù)庫(kù)的應(yīng)用也越來(lái)越廣泛,數(shù)據(jù)庫(kù)設(shè)計(jì)的優(yōu)劣是直接影響整個(gè)信息系統(tǒng)性能好壞的重要因素之一。在關(guān)系數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)設(shè)計(jì)階段,人們以關(guān)系規(guī)范化理論為指導(dǎo),即關(guān)系是要滿足一定要求的,滿足不同程度要求的為不同范式[1]。
關(guān)系規(guī)范化理論最早是E.F.Codd 在1971 年提出的,后又有人做了擴(kuò)充,它按照屬性間的不同依賴程度分為第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC 范式(BCNF)、第四范式(4NF)和第五范式(5NF)。這些范式其實(shí)就是一些確定關(guān)系模式的規(guī)則,而且這些規(guī)則是按層次遞進(jìn)分等級(jí)的,通過(guò)將低級(jí)范式的關(guān)系進(jìn)行分解,使其變成高級(jí)范式的關(guān)系。一般普遍認(rèn)為,在實(shí)際數(shù)據(jù)庫(kù)應(yīng)用中,只需將關(guān)系模式分解到3NF[2-6]。
1 關(guān)系規(guī)范化
定義1(第一范式) 若一個(gè)關(guān)系R的每個(gè)分量(屬性)是不可分的數(shù)據(jù)項(xiàng),則稱此關(guān)系R是第一范式的,記為R∈1NF。
實(shí)際上1NF是關(guān)系模式的基本要求,不滿足1NF則不能稱之為關(guān)系。
在給出更高級(jí)范式定義之前,必須先有函數(shù)依賴的概念,它是關(guān)系模式中屬性之間的一種數(shù)據(jù)依賴關(guān)系,文獻(xiàn)[1]中給出了其詳細(xì)定義,在此不再贅述。
定義2(第二范式) 若關(guān)系R∈1NF,且每個(gè)非主屬性完全函數(shù)依賴于碼,則稱R是第二范式的,記為R∈2NF。
定義3(第三范式) 若關(guān)系R∈2NF,且不存在非主屬性對(duì)碼的傳遞函數(shù)依賴,則稱R是第三范式的,記為R∈3NF。
把1NF的關(guān)系分解到2NF,再分解到3NF,實(shí)際上是關(guān)系模式規(guī)范化的過(guò)程,目的是要消除1NF、2NF關(guān)系的數(shù)據(jù)冗余、數(shù)據(jù)插入/刪除/修改異常等缺陷,且關(guān)系模式的分解應(yīng)遵循“保持函數(shù)依賴”和“無(wú)損連接性”的原則,這樣才能保證關(guān)系中的函數(shù)依賴和信息的不丟失,且在減小數(shù)據(jù)冗余度的同時(shí)不會(huì)降低數(shù)據(jù)更新的性能[7]。
關(guān)系規(guī)范化的基本思想就是逐步消除數(shù)據(jù)依賴中不合適的部分,使關(guān)系模式達(dá)到某種程度的分離,即“一事一地”的模式設(shè)計(jì)原則。其過(guò)程可由圖1表示。
圖1 關(guān)系規(guī)范化過(guò)程
文獻(xiàn)[8]通過(guò)實(shí)例闡述了關(guān)系規(guī)范化的方法,文獻(xiàn)[9]討論了關(guān)系規(guī)范化的自動(dòng)實(shí)現(xiàn)。
2 派生屬性
一個(gè)關(guān)系模式是由一些屬性所組成,屬性之間存在著一些函數(shù)依賴。
在實(shí)際數(shù)據(jù)庫(kù)應(yīng)用中,存在一些特殊的屬性,它們的值是由其他屬性的值計(jì)算而得到(比如各種統(tǒng)計(jì)值),這樣的屬性稱為派生屬性或派生列。
很多文獻(xiàn)在討論關(guān)系規(guī)范化時(shí)并沒(méi)有涉及派生屬性,文獻(xiàn)[10]雖然討論了派生屬性,但并沒(méi)有對(duì)派生屬性的類型、處理方法等進(jìn)行深入細(xì)致的研究。
實(shí)際上,派生屬性是數(shù)據(jù)庫(kù)中的一種衍生數(shù)據(jù),根據(jù)其值的生成方式可以分為四種類型:
1) 由單個(gè)屬性派生而出;
2) 由多個(gè)屬性派生而出;
3) 由其他屬性的多個(gè)值派生而出;
4) 由其他表屬性的多個(gè)值派生而出。
關(guān)系PROVINCE是關(guān)于全國(guó)省級(jí)行政區(qū)的二維表,其中:
AREA_ML是第(1)種派生屬性,P_DENSITY是第(2)種派生屬性,P_PERCENT是第(3)種派生屬性。根據(jù)其語(yǔ)義及函數(shù)依賴的定義,此關(guān)系有函數(shù)依賴:
PNAME → POPU
PNAME → AREA_KM
AREA_KM → AREA_ML
(POPU, AREA_KM) → P_DENSITY
POPU → P_PERCENT
顯然,此關(guān)系的碼為PNAME,非主屬性為:POPU,AREA_KM,AREA_ML,P_DENSITY,P_PERCENT, 關(guān)系中存在著非主屬性對(duì)碼的傳遞函數(shù)依賴。根據(jù)上述關(guān)系范式的定義,有PROVINCE∈2NF,但PROVINCE∈3NF。
那么應(yīng)該如何處理有派生屬性的2NF的關(guān)系呢?
3 派生屬性的處理
關(guān)系數(shù)據(jù)庫(kù)中的派生屬性是衍生數(shù)據(jù),對(duì)它們的處理有四種方式:
?。?)在數(shù)據(jù)庫(kù)表中不存儲(chǔ)派生屬性,而由應(yīng)用程序在查詢數(shù)據(jù)庫(kù)時(shí)臨時(shí)計(jì)算;
?。?)在數(shù)據(jù)庫(kù)表中不存儲(chǔ)派生屬性,創(chuàng)建包含派生屬性的視圖;
?。?)將有派生屬性的2NF的關(guān)系進(jìn)一步分解為3NF;
?。?)保持有派生屬性的2NF的關(guān)系不變。
第(1)、(2)種方式節(jié)省存儲(chǔ)空間,且可以保證數(shù)據(jù)庫(kù)中的關(guān)系都是3NF的,但是對(duì)于派生屬性的計(jì)算方法比較復(fù)雜,且數(shù)據(jù)庫(kù)表比較龐大的情況下,在查詢時(shí)臨時(shí)計(jì)算會(huì)消耗大量系統(tǒng)資源和時(shí)間,特別是目前存儲(chǔ)設(shè)備越來(lái)越便宜,應(yīng)該以空間換時(shí)間。在這種情況下,第(1)、(2)種方式是不可取的。
第(3)種方式對(duì)有派生屬性的2NF的關(guān)系進(jìn)行不必要的分解,違反了“一事一地”的關(guān)系模式設(shè)計(jì)原則,且分解后得到許多關(guān)系表,當(dāng)進(jìn)行查詢操作時(shí)就必須使用更多的連接語(yǔ)句,導(dǎo)致數(shù)據(jù)查詢效率降低。
從語(yǔ)義上來(lái)說(shuō),派生屬性與碼是緊密相聯(lián)系的,要遵循“一事一地”的設(shè)計(jì)原則,就不應(yīng)該將有派生屬性的2NF關(guān)系再分解,第(4)種方式是最合適的選擇。
上面提到對(duì)2NF關(guān)系的修改操作會(huì)產(chǎn)生異常,為了避免修改異常及保持?jǐn)?shù)據(jù)的一致性、完整性,必須對(duì)派生屬性值的修改作限制,即不允許用戶及應(yīng)用程序直接修改派生屬性值。
對(duì)派生屬性值的修改(包括插入新元組時(shí)派生屬性值的生成)有兩種方式:
(1)使用表觸發(fā)器對(duì)派生屬性值進(jìn)行修改;
(2)使用存儲(chǔ)過(guò)程對(duì)派生屬性值進(jìn)行修改。
第(1)種方式的修改是即時(shí)的,只適用于計(jì)算方法比較簡(jiǎn)單的派生屬性,否則將大大增加對(duì)表修改的時(shí)間,影響修改效率;第(2)種方式的修改比較靈活,可以是定時(shí)的,也可以是手動(dòng)的,對(duì)派生屬性計(jì)算方法比較復(fù)雜的情況適用。
另外,上述第(4)種派生屬性是比較復(fù)雜的,它是由其他表屬性的多個(gè)值派生而出,如圖3是關(guān)于某銀行某年的客戶帳戶關(guān)系。
圖3 關(guān)系表CA和CUSTOMER
這兩個(gè)關(guān)系都是3NF的,CUSTOMER中的AVG_AM是由CA中的AMOUNT派生而出:
CUSTOMER.AVG_AM = (∑CA.AMOUNT)/ 12 WHERE CUSTOMER.CNO = CA.CNO
對(duì)于這樣復(fù)雜的派生屬性的修改應(yīng)使用存儲(chǔ)過(guò)程進(jìn)行。
綜上所述:
1) 派生屬性應(yīng)事先計(jì)算并存儲(chǔ)在數(shù)據(jù)庫(kù)中,這是“以空間換時(shí)間”的策略;
2) 對(duì)于前三種類型的派生屬性,保持相應(yīng)2NF的關(guān)系不變;
3) 對(duì)于簡(jiǎn)單派生屬性的修改可用表觸發(fā)器進(jìn)行,對(duì)于復(fù)雜派生屬性的修改可用存儲(chǔ)過(guò)程進(jìn)行,這樣既避免修改異常,又不會(huì)使修改成為系統(tǒng)效率的瓶頸。
4 結(jié)束語(yǔ)
關(guān)系數(shù)據(jù)庫(kù)的派生屬性是一種衍生數(shù)據(jù),對(duì)其處理的好壞影響著數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的效率。文中從關(guān)系規(guī)范化理論出發(fā),用實(shí)例詳細(xì)闡述了派生屬性的類型、存儲(chǔ)方式、修改方法及方法的好處,對(duì)于關(guān)系數(shù)據(jù)庫(kù)的模式設(shè)計(jì)、提高數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)性能具有重要意義。
參考文獻(xiàn):
[1] 王珊,薩師煊.數(shù)據(jù)庫(kù)系統(tǒng)概論[M].4版.北京:高等教育出版社,2006.
[2] 鄒瓊.淺談數(shù)據(jù)庫(kù)設(shè)計(jì)中范式的應(yīng)用[J].湖北經(jīng)濟(jì)學(xué)院學(xué)報(bào), 2011,8(11):170-171.
[3] 柯白楊.關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)中的范式及其應(yīng)用[J].福建電腦,2007(3):89-90,108.
[4] 田進(jìn)華,楊志強(qiáng).關(guān)系規(guī)范化理論在數(shù)據(jù)庫(kù)設(shè)計(jì)中的重要性[J].電腦知識(shí)與技術(shù),2009,5(24):6616-6617,6624.
[5] 李榮芳.關(guān)系規(guī)范化理論及反規(guī)范化設(shè)計(jì)在數(shù)據(jù)庫(kù)中的運(yùn)用[J].計(jì)算機(jī)與信息技術(shù), 2007(21):89,99.
[6] 高麗燕,宋雪亞.范式在關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)中的應(yīng)用[J].電腦知識(shí)與技術(shù),2011,7(5):973-974.
[7] 于思江,王小兵.模式分解保持函數(shù)依賴的意義[J].電子技術(shù),2010,23(12):99-101.
[8] 董玉杰,劉海波.基于規(guī)范化理論的關(guān)系模式優(yōu)化策略研究[J].北京電子科技學(xué)院學(xué)報(bào),2010,18(2):34-40.
[9] 林要華.關(guān)系模式分解成3NF自動(dòng)實(shí)現(xiàn)[J].福建電腦,2006(10):101-102.
[10] 數(shù)據(jù)庫(kù)設(shè)計(jì)中的規(guī)范化與派生屬性處理[J].計(jì)算機(jī)工程與應(yīng)用,1997(9):1-