數(shù)據(jù)庫設(shè)計
目錄
1.什么是數(shù)據(jù)庫設(shè)計[1]
數(shù)據(jù)庫設(shè)計是指對于一個給定的應(yīng)用環(huán)境,構(gòu)造最優(yōu)的數(shù)據(jù)庫模式,建立數(shù)據(jù)庫及其應(yīng)用系統(tǒng),使之能夠有效地存儲數(shù)據(jù),滿足各種用戶的應(yīng)用需求。
2.數(shù)據(jù)庫設(shè)計的任務(wù)[2]
數(shù)據(jù)庫設(shè)計的任務(wù)是根據(jù)應(yīng)用系統(tǒng)業(yè)務(wù)信息需求、處理需求及數(shù)據(jù)庫的支持環(huán)境,設(shè)計出數(shù)據(jù)模式(包括外模式、邏輯模式及內(nèi)模式)以及相應(yīng)的應(yīng)用程序。
數(shù)據(jù)庫設(shè)計有兩個最重要的目標(biāo),即滿足應(yīng)用功能需求和良好的數(shù)據(jù)庫性能。滿足應(yīng)用功能需求,主要是指把用戶當(dāng)前應(yīng)用需求以及可預(yù)知的將來應(yīng)用需求所需要的數(shù)據(jù)及其聯(lián)系能全部準(zhǔn)確地存放在數(shù)據(jù)庫中,在滿足用戶性能要求的前提下根據(jù)用戶需嗄對數(shù)據(jù)進(jìn)行增、刪、改、查等操作。良好的數(shù)據(jù)庫性能是指數(shù)據(jù)庫應(yīng)有良好的存儲結(jié)構(gòu),良好的數(shù)據(jù)完整性、數(shù)據(jù)一致性以及安全性等。
3.數(shù)據(jù)庫設(shè)計的內(nèi)容[2]
根據(jù)設(shè)計任務(wù),數(shù)據(jù)庫設(shè)計一般包括數(shù)據(jù)庫的結(jié)構(gòu)設(shè)計和行為設(shè)計兩方面內(nèi)容.?dāng)?shù)據(jù)庫結(jié)構(gòu)設(shè)計是指系統(tǒng)整體邏輯模式與子模式的設(shè)計,是對數(shù)據(jù)的分析設(shè)計;數(shù)據(jù)咋的行為設(shè)計是指施加在數(shù)據(jù)庫上的動態(tài)操作的設(shè)計.是對應(yīng)用系統(tǒng)功能的設(shè)汁。在設(shè)汁的過程中,應(yīng)該把對數(shù)據(jù)庫的結(jié)構(gòu)設(shè)計和行為設(shè)計兩方面緊密結(jié)合起米,將這兩方面的需求分析,抽象、設(shè)計及實現(xiàn)在各個階段同時進(jìn)行、互相參照、互相補充.不斷完善。
數(shù)據(jù)庫設(shè)計結(jié)果不是唯一的,針對同一個業(yè)務(wù)需求,不同的設(shè)計者可能沒汁出不同的數(shù)據(jù)庫模式.同時.由于在設(shè)計的過程中各種需求和制約因素的存存,數(shù)據(jù)庫的設(shè)計往往很難達(dá)到非常滿意的效果。經(jīng)常是滿足某方面的需要而降低另一方面的要求.因此需要設(shè)計者在各種因素中權(quán)衡取舍.從某種意義上說,數(shù)據(jù)庫設(shè)計技術(shù)也是一門藝術(shù)。
4.數(shù)據(jù)庫設(shè)計的方法[3]
1.直觀設(shè)計法
直觀設(shè)計法其實算不上什么方法,主要是指在數(shù)據(jù)庫設(shè)計的初始階段,數(shù)據(jù)庫設(shè)計人員根據(jù)自己的經(jīng)驗和水平,運用一定的技巧進(jìn)行數(shù)據(jù)庫的設(shè)計,這種方法缺乏科學(xué)理論和工程方法的支持,很難保證設(shè)計的質(zhì)量。
2.規(guī)范設(shè)計法
為改變設(shè)計人員直觀、僅憑經(jīng)驗的做法,人們又開始運用軟件工程的思想來設(shè)計數(shù)據(jù)庫,提出了各種設(shè)計準(zhǔn)則和規(guī)程,對數(shù)據(jù)庫進(jìn)行規(guī)范化設(shè)計。目前常用的規(guī)范設(shè)計法大多起源于“新奧爾良法”(1978年10月來自歐美國家的主要數(shù)據(jù)庫專家在美國的新奧爾良市討論數(shù)據(jù)庫設(shè)計的問題,并提出了相應(yīng)的工作規(guī)范,因此得名),將數(shù)據(jù)庫設(shè)計分為:需求分析、概念設(shè)計、邏輯設(shè)計和物理設(shè)計4個階段。
3.計算機(jī)輔助設(shè)計法
計算機(jī)輔助設(shè)計法是指在數(shù)據(jù)庫設(shè)計的某些過程中模擬某一規(guī)范設(shè)計方法,通過人機(jī)交互實現(xiàn)部分設(shè)計,在這一過程中需要有相關(guān)知識和經(jīng)驗的人的支持。
4.自動化設(shè)計法
用來幫助設(shè)計數(shù)據(jù)庫或數(shù)據(jù)庫應(yīng)用軟件的工具稱為自動化設(shè)計工具,例如:OracleDesigner、PowerDesigner等,它可以自動并加速完成設(shè)計數(shù)據(jù)庫系統(tǒng)的任務(wù)。用自動化設(shè)計工具完成設(shè)計數(shù)據(jù)庫系統(tǒng)任務(wù)的方法稱為自動化設(shè)計法。
5.數(shù)據(jù)庫設(shè)計的原則[4]
1.要善于識別與正確處理多對多的關(guān)系
若兩個實體之間存在多對多的關(guān)系,則應(yīng)消除這種關(guān)系。消除的辦法是,在兩者之間增加第三個實體。這樣,原來一個多對多的關(guān)系,現(xiàn)在變?yōu)閮蓚€一對多的關(guān)系。要將原來兩個實體的屬性合理地分配到三個實體中去。這里的第三個實體,實質(zhì)上是一個較復(fù)雜的關(guān)系,它對應(yīng)一張基本表。一般來講,數(shù)據(jù)庫設(shè)計工具不能識別多對多的關(guān)系,但能處理多對多的關(guān)系。
2.索引(Index)的使用原則
創(chuàng)建索引一般有以下兩個目的,即維護(hù)被索引列的唯一性和提供快速訪問表中數(shù)據(jù)的策略。大型數(shù)據(jù)庫有兩種索引,即簇索引和非簇索引,一個沒有簇索引的表是按堆結(jié)構(gòu)存儲數(shù)據(jù),所有的數(shù)據(jù)均添加在表的尾部,而建立了簇索引的表,其數(shù)據(jù)在物理上會按照簇索引鍵的順序存儲。一個表只允許有一個簇索引,因此根據(jù)B樹的結(jié)構(gòu)可以認(rèn)為添加任何一種索引均能提高按索引列查詢的速度,但會降低插入、更新、刪除操作的性能,尤其是當(dāng)填充因子較大時。所以對索引較多的表進(jìn)行頻繁的插入、更新、刪除操作時,建表和索引時應(yīng)設(shè)置較小的填充因子,以便在各數(shù)據(jù)頁中留下較多的自由空間,減少頁分割及重新組織的工作。
3.?dāng)?shù)據(jù)的一致性和完整性
為了保證數(shù)據(jù)庫的一致性和完整性,設(shè)計人員往往會設(shè)計過多的表間關(guān)聯(lián)(Relation),盡可能地降低數(shù)據(jù)的冗余。表間關(guān)聯(lián)是一種強制性措施,建立后,對父表(Parent Table)和子表(ChiLdTable)的插入、更新、刪除操作均要占用系統(tǒng)的開銷。另外,最好不要用Identify屬性字段作為主鍵與子表關(guān)聯(lián)。如果數(shù)據(jù)冗余低,數(shù)據(jù)的完整性容易得到保證,但增加了表間連接查詢的操作。
為了提高系統(tǒng)的響應(yīng)時間,合理的數(shù)據(jù)冗余也是必要的。使用規(guī)則(Rule)和約束(Check)來防止系統(tǒng)操作人員誤輸人造成的數(shù)據(jù)的錯誤是設(shè)計人員的另一種常用手段,但是,不必要的規(guī)則和約束也會占用系統(tǒng)的不必要開銷。需要注意的是,約束對數(shù)據(jù)的有效性驗證要比規(guī)則快。所有這些,設(shè)計人員在設(shè)計階段應(yīng)根據(jù)系統(tǒng)操作的類型、對數(shù)據(jù)訪問的頻度加以均衡考慮。
4.事務(wù)的陷阱
事務(wù)是能一次性完成的一組操作。這些操作是單個的操作,數(shù)據(jù)庫能夠保證這組操作要么全部都完成,要么一點都不做。正是大型數(shù)據(jù)庫的這一特性,使得數(shù)據(jù)的完整性得到了極大的保證。
5.通俗地理解3個范式
通俗地理解3個范式,對于數(shù)據(jù)庫設(shè)計大有好處。在數(shù)據(jù)庫設(shè)計中,為了更好地應(yīng)用3個范式,就必須通俗地理解3個范式。第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解。第二范式:2NF是對記錄的唯一性約束,要求記錄有唯一標(biāo)識,即實體的唯一性。第三范式:3NF是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。
沒有冗余的數(shù)據(jù)庫設(shè)計可以做到。但是,沒有冗余的數(shù)據(jù)庫未必是最好的數(shù)據(jù)庫,有時為了提高運行效率,就必須降低范式標(biāo)準(zhǔn),適當(dāng)保留冗余數(shù)據(jù)。具體做法是,在概念數(shù)據(jù)模型設(shè)計時遵守第三范式,降低范式標(biāo)準(zhǔn)的工作放到物理數(shù)據(jù)模型設(shè)計時考慮。降低范式就是增加字段,允許冗余。
6.正確認(rèn)識數(shù)據(jù)冗余
主鍵與外鍵在多表中的重復(fù)出現(xiàn),不屬于數(shù)據(jù)冗余。這個概念必須清楚,事實上有許多人還不清楚。非鍵字段的重復(fù)出現(xiàn),才是數(shù)據(jù)冗余。而且是一種低級冗余,即重復(fù)性的冗余。高級冗余不是字段的重復(fù)出現(xiàn),而是字段的派生出現(xiàn)。
7.?dāng)?shù)據(jù)類型的選擇
數(shù)據(jù)類型的合理選擇對于數(shù)據(jù)庫的性能和操作具有很大的影響,有關(guān)這方面的書籍也有不少的闡述,這里主要介紹幾點經(jīng)驗。
Identify字段不要作為表的主鍵與其他表關(guān)聯(lián),這將會影響到該表的數(shù)據(jù)遷移。
Text和Image字段屬指針型數(shù)據(jù),主要用來存放二進(jìn)制大型對象(BLOB)。這類數(shù)據(jù)的操作比其他數(shù)據(jù)類型要慢,因此要避開使用。但是在某些場合使用二進(jìn)制對象字段來存儲不定長度的海量數(shù)據(jù)又是一個不錯的選擇。
8.信息隱藏
信息隱藏是軟件工程最重要的基本原則之一。簡單地說就是信息的作用域越小越好,只有需要直接使用它的模塊才能看到它。數(shù)據(jù)庫的透明度越大越好。使數(shù)據(jù)庫黑盒化,即透明度高的方法很多,除了設(shè)計上的局部化處理外,還可以利用DBMS的觸發(fā)器、存儲過程、函數(shù)等,把數(shù)據(jù)庫中無法簡化的復(fù)雜表關(guān)系封裝到黑盒子中,隱藏起來,特別是放到服務(wù)器端,其優(yōu)越性更是多方面的。
6.數(shù)據(jù)庫設(shè)計的特點[5]
數(shù)據(jù)庫設(shè)計的工作量大且比較復(fù)雜,是一項數(shù)據(jù)庫工程,也是一項軟件工程。數(shù)據(jù)庫設(shè)計的很多階段都可以對應(yīng)于軟件工程的階段,軟件工程的某些方法和工具同樣也適合于數(shù)據(jù)庫工程。但由于數(shù)據(jù)庫設(shè)計是與用戶的業(yè)務(wù)需求緊密相關(guān)的,因此,它還有很多自己的特點。
1.綜合性
數(shù)據(jù)庫設(shè)計涉及的范圍很廣,包含了計算機(jī)專業(yè)知識及業(yè)務(wù)系統(tǒng)的專業(yè)知識,同時它還要解決技術(shù)及非技術(shù)兩方面的問題。
非技術(shù)問題包括組織機(jī)構(gòu)的調(diào)整,經(jīng)營方針的改變,管理體制的變更等。這些問題都不是設(shè)計人員所能解決的,但新的管理信息系統(tǒng)要求必須有與之相適應(yīng)的新的組織機(jī)構(gòu)、新的經(jīng)營方針、新的管理體制,這就是一個較為尖銳的矛盾。另一方面,由于同時具備數(shù)據(jù)庫和業(yè)務(wù)兩方面知識的人很少,因此,數(shù)據(jù)庫設(shè)計者一般都需要花費相當(dāng)多的時間去熟悉應(yīng)用業(yè)務(wù)系統(tǒng)知識,這一過程有時很麻煩,可能會使設(shè)計人員產(chǎn)生厭煩情緒,從而影響系統(tǒng)的最后成功。而且,由于承擔(dān)部門和應(yīng)用部門是一種委托雇傭關(guān)系,在客觀上存在著一種對立的勢態(tài),當(dāng)在某些問題上意見不一致時會使雙方關(guān)系比較緊張。這在MIS(管理信息系統(tǒng))中尤為突出。
2.結(jié)構(gòu)設(shè)計與行為設(shè)計相分離
結(jié)構(gòu)設(shè)計是指數(shù)據(jù)庫的模式結(jié)構(gòu)設(shè)計,包括概念結(jié)構(gòu)、邏輯結(jié)構(gòu)和存儲結(jié)構(gòu);行為設(shè)計是指應(yīng)用程序設(shè)計,包括功能組織、流程控制等方面的設(shè)計。在傳統(tǒng)的軟件工程中,比較注重處理過程的設(shè)計,不太注重數(shù)據(jù)結(jié)構(gòu)的設(shè)計。在一般的應(yīng)用程序設(shè)計中只要可能就盡量推遲數(shù)據(jù)結(jié)構(gòu)的設(shè)計,這種方法對于數(shù)據(jù)庫設(shè)計就不太適用。
數(shù)據(jù)庫設(shè)計與傳統(tǒng)的軟件工程的做法正好相反。數(shù)據(jù)庫設(shè)計的主要精力首先是放在數(shù)據(jù)結(jié)構(gòu)的設(shè)計上,比如數(shù)據(jù)庫的表結(jié)構(gòu)、視圖等。
7.數(shù)據(jù)庫設(shè)計的一般步驟[6]
1.確定創(chuàng)建數(shù)據(jù)庫的目的
設(shè)計數(shù)據(jù)庫和用戶的需求息息相關(guān)。首先,要明確創(chuàng)建數(shù)據(jù)庫的目的以及如何使用,用戶希望從數(shù)據(jù)庫得到什么信息,由此可以確定需要什么樣的表和定義哪些字段;其次,要與用戶進(jìn)行交流,集體討論需要數(shù)據(jù)庫解決的問題,并描述需要數(shù)據(jù)庫完成的各項功能。
2.確定數(shù)據(jù)庫中需要的表
一個數(shù)據(jù)庫可能是由若干個表組成的,所以確定表是數(shù)據(jù)庫設(shè)計過程中最重要的環(huán)節(jié)。在設(shè)計表時,應(yīng)該按以下設(shè)計原則對信息進(jìn)行分類。
(1)每個表最好只包含關(guān)于一個主題的信息。
(2)同一個表中不允許出現(xiàn)同名字段。
(3)表間不應(yīng)有重復(fù)信息。
(4)當(dāng)一個表中的字段信息太多時,可根據(jù)使用頻率將其分解為兩個表。
3.確定字段
確定表的過程實際上就是定義字段的過程,字段是表的結(jié)構(gòu),記錄是表的內(nèi)容。所以確定字段是設(shè)計數(shù)據(jù)庫不可缺少的環(huán)節(jié)。在定義每個表字段時,注意以下幾點。
(1)主題相關(guān)。將所有原始字段信息分配至各個表中,使每個字段直接與表的主題相關(guān)。
(2)信息獨立。字段信息不包含能夠使用推導(dǎo)和計算得出的數(shù)據(jù)信息。
(3)方便維護(hù)。除主鍵字段外,兩個不同表之間不能包含其他的相同字段。
4.確定主鍵
為了連接保存在不同表中的信息,使多表協(xié)同工作,在Access數(shù)據(jù)庫的表中必須要確定主鍵。主鍵是表中能夠唯一確定一個記錄的字段或字段集合。如“學(xué)號”字段可以作為“學(xué)生”表和“學(xué)生其他情況”表中的主鍵,而“學(xué)號”和“課程代碼”兩個字段可以共同承擔(dān)“成績”表中的主鍵責(zé)任。
5.確定表之間的關(guān)系
因為已經(jīng)將信息分配到各個表中,并且定義了主鍵字段,若想將保存在不同表中的相關(guān)信息重新組合到一起,必須定義表與表之間的關(guān)系,不同表之間確立了關(guān)系,才能進(jìn)行相互訪問。
6.確定各個表的使用數(shù)據(jù)
表的結(jié)構(gòu)設(shè)計達(dá)到設(shè)計要求后,就可針對各個表分別準(zhǔn)備要存放的數(shù)據(jù)了,即常說的表中記錄內(nèi)容。
7.確定數(shù)據(jù)的使用場所和管理手段
利用Access2003數(shù)據(jù)庫提供的查詢、報表、窗體等高級工具,根據(jù)實際使用要求,考慮在數(shù)據(jù)庫中創(chuàng)建哪些查詢,設(shè)計哪些打印報表,規(guī)劃輸入數(shù)據(jù)窗體與顯示結(jié)果窗體的設(shè)計風(fēng)格等具體應(yīng)用。