洪煒
摘要:數(shù)據(jù)庫的設計對軟件系統(tǒng)的運行起著非常重要的作用,合理的關系模式設計能夠提高數(shù)據(jù)庫的運行性能。在數(shù)據(jù)庫設計中規(guī)范化設計理論是設計者常常遵循的原則,但是一味的追求關系模式范式的級別,滿足了形式上的規(guī)范化往往會在實際使用中犧牲了運行效率,而適當?shù)牟捎藐P系模式設計的反規(guī)范化手段,采用增加冗余列、增加派生列、重新組表和分割表等反規(guī)范化技術,合理處理好數(shù)據(jù)庫的完整性,能夠讓數(shù)據(jù)庫的設計更加合理,運行效率更高,更能滿足實際應用的需要。該文以園林專業(yè)教學資源庫數(shù)據(jù)庫為例,闡述了反規(guī)范化技術在設計中的應用。
關鍵詞:范式;反規(guī)范化;數(shù)據(jù)庫設計;教學資源庫系統(tǒng)
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)33-7957-03
數(shù)據(jù)庫的設計在B/S結構系統(tǒng)開發(fā)中占著舉足輕重的地位,數(shù)據(jù)庫設計直接關系到程序運行的效率和軟件系統(tǒng)運行的效果。數(shù)據(jù)庫原理是每一位軟件設計人員必須具備的專業(yè)基礎知識,在數(shù)據(jù)庫原理中較強調(diào)數(shù)據(jù)庫設計的關系規(guī)范化理論,但是在實際應用中,因為需求、實用和性能等方面的原因,數(shù)據(jù)庫設計的反規(guī)范化常常應用,會在遵守范式的基礎上適當使用反規(guī)范化的數(shù)據(jù)庫設計。
1 關系數(shù)據(jù)庫設計的范式理論
范式是符合某一種級別的關系模式的集合,設計數(shù)據(jù)庫需要遵循一定的設計規(guī)則,在關系數(shù)據(jù)庫的設計中,這種規(guī)則就是范式,滿足不同程度要求的關系模式分別屬于不同的范式。范式有很多種,關系數(shù)據(jù)庫的規(guī)范化設計理論把關系應滿足的規(guī)范要求分為幾級, 第一范式((1NF))是關系模式應滿足的最低要求,滿足了第一范式的關系才能稱為規(guī)范化的關系,第二范式(2NF)建立在第一范式的基礎上,第三范式(3NF)建立在第二范式的基礎上, 還有BCNF,4NF,5NF[1],范式級別越高逐步消除了關系中因數(shù)據(jù)依賴而引起的各種問題,關系的規(guī)范化程度不斷得到提高,3NF已經(jīng)能在很大程度上消除了由函數(shù)依賴引起的數(shù)據(jù)存儲異常的問題,如果關系模式滿足了BCNF就能完成消除因函數(shù)依賴關系而引起的存儲異常和數(shù)據(jù)冗余問題,在數(shù)據(jù)庫設計中3NF 、BCNF應用得最廣泛。關系模式的規(guī)范化就是將一個滿足第一級范式要求的關系,通過關系模式的分解,把一個關系模式轉(zhuǎn)換為若干個滿足高一級范式要求的關系模式,逐步消除因為數(shù)據(jù)依賴帶來的各種問題。
2 關系模式的范化設計
關系模式的拆解是為了達到更高級別的規(guī)范化程度,但是有的時候盲目的最求范式的要求,往往會破壞一些必不可少的函數(shù)依賴,反而會在使用過程中不方便,這時候就要考慮關系模式的反規(guī)范化設計,放棄數(shù)據(jù)冗余問題的解決。反規(guī)范能夠減少數(shù)據(jù)庫操作過程中的連接操作、減少索引和外碼數(shù)量,提高數(shù)據(jù)查詢操作的速度,也可以減少關系表的數(shù)量,但是不合理的反規(guī)范化會帶來數(shù)據(jù)的完整性問題,會降低數(shù)據(jù)修改的速度。因此對關系模式反規(guī)范化設計時要平衡利弊,仔細分析數(shù)據(jù)庫設計的合理性和實際性能需求。
2.1 第一范式(1NF)
在關系模式R中,如果每個屬性都是不可再分的原子項,則關系模式R滿足第一范式[2]。例如:在園林專業(yè)教學資源庫,課件制作人信息關系中有制作人的聯(lián)系電話,一個人的聯(lián)系電話也可能不止一個電話號碼,規(guī)范化的過程可以把制作人聯(lián)系電話分為辦公室電話和手機號碼,調(diào)整后新的關系滿足了1NF,1NF是關系模式的最低要求,也是必須要滿足的要求。
2.2 第二范式(2NF)
如果關系模式R是1NF且其中的所有非主屬性都完全函數(shù)依賴于關鍵詞, 則稱關系R是屬于第二范式的[2]。園林專業(yè)教學資源庫中學生通過選修資源庫中的課程后,經(jīng)過網(wǎng)絡學習,學滿課時后可以進行課程考核,有這樣一個選課關系:課件學習(學號、課件代號、成績、學分)關系的主碼是學號和課件代號,學分與非主碼課程號存在函數(shù)依賴關系。這個關系在實際使用中就會存在數(shù)據(jù)冗余、修改異常、插入異常和刪除異常的問題,如果一門課程有多名學生選修,該課程的學分就會在表中多次被記錄,導致存儲數(shù)據(jù)冗余;如果某一門課程的學分調(diào)整了,表中該課程的所有學分要被修改,修改遺漏了一條記錄就會出現(xiàn)同一門課程的學分不一致的情況;沒有被學生選修的課程或新開的課程就無法記錄課程的學分;刪除學生選課信息的同時也會把課程的學分刪除,課程的學分信息不能正常保存。導致這些問題的原因是學分沒有完全依賴于主碼(學號、課程號),把學分從選課表中分離出來,放到課程表中就可以解決這些問題,可以通過選課關系中外碼課程號聯(lián)系,在需要使用的時候連接操作獲取需要的信息。
2.3 第三范式(3NF)
如果關系模式R是2NF且其中的所有非主屬性都不傳遞依賴于碼,則稱關系R是屬于第三范式的[2]。學生關系(學號、姓名、班級代號、班級名稱),該關系的主碼是學號,能夠滿足2NF的要求,但是由于班級名稱與學號存在傳遞函數(shù)依賴關系,不能滿足3NF的要求。這個關系存在數(shù)據(jù)冗余、修改異常、插入異常和刪除異常的問題,解決的方法是將班級名稱從學生關系中分離,拆分成兩個關系:學生(學號、姓名、班級代號)和班級(班級代號、班級名稱),兩個關系通過學生表中班級代號作為外碼進行關聯(lián)。
2.4 BCNF
如果關系模式R的所有屬性(包括主屬性和非主屬性)都不傳遞依賴于R的任何候選關鍵詞,那么稱關系R是屬于BCNF的。或者說關系模式R中,如果每個決定因素都包含關鍵詞(而不是被關鍵詞所包含),則R是BCNF[2]。如果學生關系中記錄有學生的省份證號碼,仍然定義學生學號是主碼,那這個關系就不能滿足BCNF,因為身份證號與其它屬性存在著函數(shù)依賴關系,存在非主屬性之間的函數(shù)依賴關系,要想讓關系滿足BCNF就需要把身份證號碼從學生關系中分離。但是在實際應用中沒有進行分離處理,分離后新建一個關系反而增加了數(shù)據(jù)的存儲量,身份證號在該系統(tǒng)中使用頻率不高,只是作為一個屬性在學生表中記錄。
2.5 關系模式拆分原則
一個關系模式采用不同的分解方法可以得到不同關系模式集合,根據(jù)實際應用的需要拆分關系模式的方法不同。最小冗余的要求必須以分拆分后數(shù)據(jù)庫的關系模式表達設計要求的數(shù)據(jù)庫所有信息為前提,在此前提下綜合考慮使用更少的存儲空間,數(shù)據(jù)庫的完整性,滿足實際應用需求。在實際應用中,未必數(shù)據(jù)庫所有的關系模式都要達到某一個級別的范式, 有時為了應用方便會故意保留冗余而方便查詢,特別是對不經(jīng)常更新、查詢頻率較高的數(shù)據(jù),在進行關系模式設計往往不盲目的進行拆分。
3 反規(guī)范化設計
把關系模式的規(guī)范化(normalization)設計滿足高一級范式降低為低范式級別,使得關系模式滿足低一級的關系范式稱為關系模式的非規(guī)范化(denormalization), 在不影響數(shù)據(jù)庫信息完整性的基礎上,這樣設計的數(shù)據(jù)庫系統(tǒng)更加實用,滿足某些方面的性能要求。
實際應用中完全根據(jù)理論的規(guī)范化要求設計數(shù)據(jù)庫的關系模式,雖然能夠得形式上較完美的數(shù)據(jù)庫關系模式,但是這種形式上簡單化的處理,往往給使用帶來不方便之處,更有可能會導致數(shù)據(jù)庫系統(tǒng)運行效率降低。這時我們可以從實際應用出發(fā)采用反規(guī)范化設計, 根據(jù)需要降低關系模式的范式級別,不使用規(guī)范化設計的代價是用來保持冗余數(shù)據(jù)一致性的額外開銷[ 3] 。關系模式的反規(guī)范化設計主要采用增加冗余、分割關系、合并關系等技術,在使用中遇到下列情況會考慮使用反規(guī)范化技術,如:為了避免進行連接查詢對大量數(shù)據(jù)做笛卡爾積;關系中某些屬性使用頻率特別頻繁,而其它屬性幾乎很少使用;需要進行計算操作或復制查詢等。
4 園林技術專業(yè)教學資源庫設計
園林技術專業(yè)教學資源庫數(shù)據(jù)庫設計的實體、關系較多,該文圍繞課件、制作人和學生實體設計數(shù)據(jù)庫的數(shù)字模型,對其它實體及關系不做分析。
從該E-R圖看共有五個實體,每個實體有各自的屬性,實體與實體之間有著聯(lián)系,其中課件與學生之間的聯(lián)系還會有學習后的測試成績屬性,這就構成了以課件為中心的園林專業(yè)教學資源庫中課件制作人、課件和學生之間的關系。
4.2 概念模型設計轉(zhuǎn)換成關系模式
根據(jù)E-R圖轉(zhuǎn)換成關系模式的規(guī)則可生成6個關系模式,分別是:
單位(單位代號、名稱、單位性質(zhì)、地址、郵編、單位聯(lián)系人、聯(lián)系電話、傳真等)
制作人(制作人代號、姓名、專業(yè)、職稱、所在單位代號等)
課件(課件代號、名稱、文件類型、文件大小、上傳時間、內(nèi)容簡介、課件等)
學生(學生代號、姓名、出生年月、聯(lián)系電話、家庭住址、郵編、專業(yè)信息等)
課件制作(制作人代號,課件代號,制作人序號等)
學生課件學習(課件代號、學生代號、學習時長、測試成績等)
這6個關系模式按照規(guī)范化數(shù)據(jù)庫設計理論,都能夠滿足BCNF的要求,解決了因函數(shù)依賴產(chǎn)生的問題,從數(shù)據(jù)庫設計理論上來說是合理的。
4.3 關系模式存在的問題
以上關系模式雖然滿足的范式級別較高,最大限度的解決了數(shù)據(jù)冗余、插入異常、刪除異常、修改異常等問題,但是在實際使用中存在著一些不便之處。
1)每個課件可能會有多人制作,但是在應用中第一制作人的信息使用頻率要遠遠高于其他制作人,把所有制作人的信息存放在一個表中,在對第一制作人的查詢中是在大量無效數(shù)據(jù)中進行查詢。
2)經(jīng)常查詢某一課件的第一制作人姓名、第一制作人所在單位等信息需要將單位、制作人、課件三個表進行連接查詢,大量的數(shù)據(jù)做笛卡爾積,降低查詢效率。
3)關系模式中的一些信息在系統(tǒng)中使用率較低,但是為了以后的大數(shù)據(jù)分析又不得不保留這些屬性,這些屬性列的數(shù)據(jù)直接影響整個系統(tǒng)的運行效率。
4.4 反規(guī)范化設計的常用技術
隨著計算機硬件的發(fā)展,存儲的成本越來越低,在數(shù)據(jù)的設計中適當考慮數(shù)據(jù)冗余對整個系統(tǒng)的成本不會影響太大,因此在進行反規(guī)范化設計之前更多的是要考慮好冗余和性能的平衡,對常用表的大小、常用的連接查詢關系進行處理。常用的非規(guī)范化技術有增加冗余列、增加派生列、重新組表和分割表[3]。
1)增加冗余列是在關系模式中增加其它關系模式中的列,為了避免在查詢中進行連接查詢操作。例如在查詢制作人信息時,制作人姓名和制作人所在單位的名稱是必不可少的字段,這兩個字段分布在制作人和單位兩個關系中,程序在應用時要將兩個表進行連接,而連接操作直接影響到查詢操作的效率。如果在制作人關系中增加單位名稱屬性列,此類查詢就不需要進行兩個表的連接操作了。
2)增加派生列是指增加的列來自其它表中的數(shù)據(jù), 由其它表中的數(shù)據(jù)計算生成,在程序應用中避免對表中大量數(shù)據(jù)查詢和使用統(tǒng)計函數(shù)。例如在課件被學生學習的時長,如果在課件表中增加時長記錄字段,就不需要通過學生課件學習表中學習時長進行統(tǒng)計了。
3)重新組表指將兩個或多個表的部分字段放在同一個關系中,查詢操作時就不必對兩個或多個關系進行連接操作了,從而提高查詢效率。這樣可提高性能, 但是這樣可能對數(shù)據(jù)的維護帶來很多的麻煩,而且也損壞了數(shù)據(jù)的獨立性,因此在本系統(tǒng)中沒有采用這種方法,筆者也建議盡量不使用這種反規(guī)范化的方法。
4)分割表是指將一個關系模式拆分成兩個或兩個以上關系模式,表的分割包括水平分割和垂直分割。
水平分割是將表中的部分元組在另一個相同表結構或部分屬性列構成的關系中存儲,這些元組中的信息往往是經(jīng)常被使用的,而另一些元組的信息幾乎很少使用。例如制作人關系中的第一制作人信息,使用頻率要比其他參與制作人信息使用頻率要高得多,而一個課件的第一制作人只有一個,其他制作人可能會有多個,每次在進行查詢時,如果只在第一制作人信息表中進行查詢,這樣效率將會提高很多。因此在系統(tǒng)中將制作人關系拆分成兩個關系模式,分別是第一制作人和其他制作人,這樣沒有破壞數(shù)據(jù)庫信息的完整性,同時在進行查詢操作時也大大提高了數(shù)據(jù)庫的性能。
垂直分割是指將一個關系模式中的部分元數(shù)單獨組成一個新的關系模式,這些元數(shù)的使用頻率遠遠高于其它元數(shù)。例如學生信息表中的學生學號、姓名、專業(yè)等信息的使用頻率較高,而家庭住址、郵編等信息使用頻率較低,為了提高查詢效率,將家庭住址、郵編等信息從關系模式中分離出來,重新組成另一個關系模式,為學生信息表瘦身。
4.5 完整性維護
反規(guī)范化調(diào)高了數(shù)據(jù)庫的查詢效率,但是會給數(shù)據(jù)庫的完整性維護帶來新的任務,需要采用一定的技術手段來確保數(shù)據(jù)庫的完整性,常用的方法有批處理維護、應用邏輯和觸發(fā)器。批處理維護是定期運行批處理操作,將相關列的數(shù)據(jù)信息進行同步,但是這種方法不是對數(shù)據(jù)進行實時更新;另一種方法是應用程序?qū)崿F(xiàn),通過定義事務的形式對所有數(shù)據(jù)進行同步操作,這種方法有一定的風險,可能會導致遺漏,但是能實時同步信息;還有一種方式方法是使用觸發(fā)器,把工作交給DBMS去完成,這種方法既解決了實時的問題, 又避免了遺漏,在本系統(tǒng)中就采用了這種方法。
5 結論
數(shù)據(jù)庫關系模式的規(guī)范化設計與反規(guī)范化設計在數(shù)據(jù)庫的設計中并不是兩個完全對立的。規(guī)范化設計可以避免關系的一些異常問題,能讓關系模式的邏輯關系更清晰,確保數(shù)據(jù)庫的完整性,反規(guī)范化設計可以提高數(shù)據(jù)庫的運行性能,回避查詢操作時的連接操作,減少外鍵和索引的數(shù)量。在實際應用中采用反規(guī)范化設計,要根據(jù)應用需求進行平衡,讓設計的數(shù)據(jù)庫既能實現(xiàn)信息的完整性又能滿足運行的高性能,這樣才能體現(xiàn)反規(guī)范化設計的意義。
參考文獻:
[1] (美)弗羅斯特.數(shù)據(jù)庫設計與開發(fā)[M].北京:清華大學出版社,2007.
[2] 李紅.數(shù)據(jù)庫原理與應用[M].北京:高等教育出版社,2011.
[2] 錢宗斌,王艷兵.利用范式優(yōu)化關系數(shù)據(jù)庫中的數(shù)據(jù)結構[J].電腦知識與技術,2011(25).