數(shù)據(jù)庫(kù)建模實(shí)踐指南重點(diǎn)課件_第1頁(yè)
數(shù)據(jù)庫(kù)建模實(shí)踐指南重點(diǎn)課件_第2頁(yè)
數(shù)據(jù)庫(kù)建模實(shí)踐指南重點(diǎn)課件_第3頁(yè)
數(shù)據(jù)庫(kù)建模實(shí)踐指南重點(diǎn)課件_第4頁(yè)
數(shù)據(jù)庫(kù)建模實(shí)踐指南重點(diǎn)課件_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第3章數(shù)據(jù)庫(kù)建模實(shí)踐指南 1本章導(dǎo)讀數(shù)據(jù)庫(kù)設(shè)計(jì)既是信息系統(tǒng)建設(shè)必備的基礎(chǔ),又是軟件工程實(shí)踐的主要內(nèi)容,所以計(jì)算機(jī)及軟件專業(yè)方向的大學(xué)生、研究生和軟件工程師,都要特別重視數(shù)據(jù)庫(kù)設(shè)計(jì)。數(shù)據(jù)庫(kù)設(shè)計(jì)雖然是一個(gè)理論問(wèn)題,但更主要的是一個(gè)實(shí)踐問(wèn)題。本章的特點(diǎn)是,將數(shù)據(jù)庫(kù)設(shè)計(jì)的理論與實(shí)踐緊密相結(jié)合,并通過(guò)大量案例,來(lái)說(shuō)明數(shù)據(jù)庫(kù)設(shè)計(jì)中需要解決的各種問(wèn)題。本章的具體內(nèi)容,表面上沒(méi)有包括數(shù)據(jù)庫(kù)設(shè)計(jì)中的“正確處理多對(duì)多關(guān)系和合理進(jìn)行列變行”的兩大技巧,但是這兩大技巧卻蘊(yùn)涵在許多實(shí)例之中。學(xué)習(xí)本章的難度系數(shù),比學(xué)習(xí)Rational Rose還要大得多。幸好本章的文字語(yǔ)句通俗易懂,圖形表格全面細(xì)致,這就給讀者帶來(lái)了很大

2、方便。 2本章對(duì)讀者的要求 要 求具 體 內(nèi) 容了 解1)為什么要建立規(guī)范化理論2)第一范式、第二范式、第三范式3)數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)的優(yōu)點(diǎn)4)數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)的缺點(diǎn) 理 解1)關(guān)系數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)理論的實(shí)質(zhì),就是在數(shù)據(jù)庫(kù)設(shè)計(jì)中實(shí)現(xiàn)屬性原子化、主鍵原子化、實(shí)體原子化2)數(shù)據(jù)庫(kù)設(shè)計(jì)評(píng)價(jià)3)數(shù)據(jù)庫(kù)建模經(jīng)典案例分析 掌 握1)數(shù)據(jù)庫(kù)設(shè)計(jì)方法與技巧2)對(duì)象關(guān)系映射 3數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范化理論及其反思 1972年,EFCodd博士提出了規(guī)范化理論來(lái)指導(dǎo)數(shù)據(jù)庫(kù)的設(shè)計(jì),從而開(kāi)辟了數(shù)據(jù)庫(kù)史上新的一頁(yè)。規(guī)范化是通過(guò)一系列的測(cè)試,來(lái)檢查設(shè)計(jì)的關(guān)系(二維表)是否符合某一范式的要求。后來(lái)隨著時(shí)間的發(fā)展,越來(lái)越多的范式被提出

3、,如圖3-1所示。這些范式是嵌套的,就是說(shuō),一個(gè)范式是在另一個(gè)范式之上再做進(jìn)一步的約束而形成的。但是,很少有人對(duì)這些范式及研究范式的人提出過(guò)疑問(wèn)、進(jìn)行過(guò)反思。 4表3-2 圖書(shū)出版社對(duì)應(yīng)表:出現(xiàn)了冗余,冗余會(huì)帶來(lái)插入刪除更改異常圖書(shū)編號(hào)書(shū)名作者出版社編號(hào)出版社名稱出版社地址出版社電話B0001實(shí)用軟件工程趙池龍C900電子工業(yè)出版社北京市海淀區(qū)萬(wàn)壽0002計(jì)算機(jī)算法設(shè)計(jì)與分析王曉東C900電子工業(yè)出版社北京市海淀區(qū)萬(wàn)壽0003程序設(shè)計(jì)語(yǔ)言編譯原理陳火旺C901國(guó)防工業(yè)出版社北京市海淀區(qū)紫竹院南0004javas

4、cript到j(luò)sp范例程序設(shè)計(jì)沈建男C902中國(guó)青年出版社北京市東四十二條010-840155885范式 第一范式(First Normal Form,1NF):表的每個(gè)列包含且只包含一個(gè)值。任何符合關(guān)系定義的數(shù)據(jù)表都在第一范式中。實(shí)際上,第一范式就是要求表中的每一列必須是單值,數(shù)組和重復(fù)的組都不能作為列的值。第二范式(Second Normal Form,2NF):一個(gè)第一范式的表中,每個(gè)非主鍵列都可以從主鍵列得到。 第三范式(Third Normal Form,3NF):一個(gè)第二范式表中的所有非主鍵列的值,能且只能從主鍵列中得到。 第三范式已經(jīng)解決了大部分日常使用中會(huì)出現(xiàn)的操作異常,剩下的

5、是那些不常出現(xiàn)的操作問(wèn)題,要解決這些問(wèn)題,需要更高的范式進(jìn)行約束。 6數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)的優(yōu)點(diǎn) 規(guī)范化設(shè)計(jì)為數(shù)據(jù)庫(kù)提供了許多的好處,下面列舉了一些主要的優(yōu)點(diǎn):l 大大改進(jìn)數(shù)據(jù)庫(kù)的整體組織l 減少了數(shù)據(jù)冗余l(xiāng) 增強(qiáng)了數(shù)據(jù)的一致性l 增加數(shù)據(jù)庫(kù)設(shè)計(jì)的靈活性規(guī)范化處理數(shù)據(jù)庫(kù)設(shè)計(jì),能減少?gòu)挠脩?、開(kāi)發(fā)人員到數(shù)據(jù)庫(kù)管理員的工作量,使他們能把更多的精力投入到其他工作中。數(shù)據(jù)冗余的有效控制,能簡(jiǎn)化數(shù)據(jù)結(jié)構(gòu),節(jié)省數(shù)據(jù)的存儲(chǔ)空間。由于重復(fù)數(shù)據(jù)的減少,數(shù)據(jù)的不一致性也大大改善,同時(shí)也減輕應(yīng)用程序?yàn)榱司S護(hù)數(shù)據(jù)的一致性而所花費(fèi)的代價(jià)。這樣在進(jìn)行業(yè)務(wù)擴(kuò)充與改造時(shí),數(shù)據(jù)庫(kù)的修改也變得相對(duì)容易。 7數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)的缺點(diǎn) 對(duì)數(shù)

6、據(jù)庫(kù)設(shè)計(jì)進(jìn)行一定程度的規(guī)范化,的確能優(yōu)化數(shù)據(jù)庫(kù)的操作,但不必要的規(guī)范化卻會(huì)帶來(lái)不必要的麻煩,降低性能,類似的例子還有很多,例如多表聯(lián)合查詢的查詢速度要比單表查詢慢,有時(shí)為了處理事務(wù)與數(shù)據(jù)查詢,規(guī)范化的數(shù)據(jù)庫(kù)比非規(guī)范化的數(shù)據(jù)庫(kù)要占用更多的CPU,內(nèi)存和I/O等等。規(guī)范化的目的,只是為了提升數(shù)據(jù)庫(kù)的性能。當(dāng)發(fā)現(xiàn)規(guī)范化后反而造成了不必要的開(kāi)銷,從而降低了數(shù)據(jù)庫(kù)的性能,此時(shí),你應(yīng)該退一步,相應(yīng)降低范式的級(jí)別,才會(huì)看到海闊天空的世界。 8關(guān)系數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)理論的反思 反思1:應(yīng)該讓數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)的理論,從數(shù)學(xué)家的書(shū)本中或課堂上解放出來(lái),變成軟件分析師或設(shè)計(jì)師的強(qiáng)大設(shè)計(jì)武器。這里的解放方法,就是要通俗

7、理解各級(jí)范式。所謂通俗理解,就是從工程應(yīng)用上去理解,從數(shù)據(jù)庫(kù)設(shè)計(jì)上去理解,而不要從抽象的數(shù)學(xué)上(函數(shù)依賴、多值依賴、連接依賴等)去理解。反思2:應(yīng)該知道,數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)理論的目標(biāo)或?qū)嵸|(zhì),就是要在數(shù)據(jù)庫(kù)設(shè)計(jì)中實(shí)現(xiàn)“三化”,即“屬性原子化、主鍵原子化、實(shí)體原子化”,或者說(shuō)是“列原子化、鍵原子化、表原子化”。在這“三化”中,最難的是“實(shí)體原子化”,第三范式以上的各級(jí)范式,實(shí)質(zhì)上都是為了解決“實(shí)體原子化”的問(wèn)題。試問(wèn):如果一開(kāi)始就用這“三化”思想來(lái)指導(dǎo)數(shù)據(jù)庫(kù)設(shè)計(jì),那么不就完全符合了各級(jí)范式的標(biāo)準(zhǔn)了嗎?是的,當(dāng)然是這樣。反思3:要辯證地看待“三化”思想。在實(shí)際設(shè)計(jì)中,為了提高數(shù)據(jù)庫(kù)的運(yùn)行性能,有時(shí)要進(jìn)

8、行一定程度的反規(guī)范化設(shè)計(jì),即適當(dāng)增加冗余,達(dá)到以空間換時(shí)間的目的。這就叫做理論聯(lián)系實(shí)際、實(shí)事求是。 9關(guān)系數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)理論的實(shí)質(zhì) 理解了這三個(gè)反思,你就能將深?yuàn)W的數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)理論,變成通俗易懂的數(shù)據(jù)庫(kù)設(shè)計(jì)實(shí)踐指南。理解了這三個(gè)反思,你就能搖身一變,成為一個(gè)企業(yè)派的數(shù)據(jù)庫(kù)分析與設(shè)計(jì)專家。通過(guò)上述討論,我們得出如下定理?!径ɡ?-1】 關(guān)系數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)理論的實(shí)質(zhì),就是在數(shù)據(jù)庫(kù)設(shè)計(jì)中實(shí)現(xiàn)屬性原子化、主鍵原子化、實(shí)體原子化。由此可見(jiàn),從軟件工程師的角度來(lái)看,關(guān)系數(shù)據(jù)庫(kù)規(guī)范化設(shè)計(jì)的理論,歸根到底就是一句話:“屬性原子化、主鍵原子化、實(shí)體原子化,再加上適當(dāng)?shù)臄?shù)據(jù)冗余”,即“三個(gè)原子化加上適當(dāng)?shù)?/p>

9、冗余”。只要記住這句話,軟件工程師在關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)中就不會(huì)迷失方向。 10數(shù)據(jù)庫(kù)設(shè)計(jì)評(píng)價(jià) (1)描述事務(wù)。使用這一種方法,要求將每個(gè)事務(wù)的需求描述存檔,檢查模型是否提供了事務(wù)處理所需要的所有信息(實(shí)體,關(guān)系和其他屬性)。例如我們?nèi)砸詧D書(shū)館信息管理系統(tǒng)為例,現(xiàn)在要求查詢讀者當(dāng)前所借閱圖書(shū)的列表,這樣,就要求數(shù)據(jù)庫(kù)中存有讀者信息,借閱信息并且這兩個(gè)實(shí)體間要有聯(lián)系才能完成這樣一個(gè)操作。(2) 使用事務(wù)路徑使用這一種方法,需要設(shè)計(jì)人員對(duì)業(yè)務(wù)相當(dāng)?shù)氖煜?,熟悉整個(gè)業(yè)務(wù)的流程,包括一些細(xì)節(jié)的東西,然后在腦海中模擬程序的執(zhí)行路徑,預(yù)測(cè)得到在執(zhí)行的過(guò)程中需要使用數(shù)據(jù)庫(kù)中的哪些元素,這對(duì)設(shè)計(jì)人員有較高的要求。2性

10、能評(píng)價(jià)。性能評(píng)價(jià)主要涉及開(kāi)銷問(wèn)題,包括查詢開(kāi)銷、報(bào)表生成開(kāi)銷、事務(wù)更新開(kāi)銷、內(nèi)外存占用的開(kāi)銷等等,性能評(píng)價(jià)與優(yōu)化密不可分,要在性能上得到提升,需要對(duì)包括數(shù)據(jù)庫(kù)管理系統(tǒng)、數(shù)據(jù)庫(kù)表的設(shè)計(jì)等多方面進(jìn)行優(yōu)化。 11數(shù)據(jù)庫(kù)設(shè)計(jì)方法與技巧 數(shù)據(jù)庫(kù)是信息系統(tǒng)的核心,數(shù)據(jù)庫(kù)設(shè)計(jì)的優(yōu)劣直接影響信息系統(tǒng)的成敗,良好的數(shù)據(jù)庫(kù)設(shè)計(jì)不僅能支撐信息系統(tǒng)順利完成業(yè)務(wù)邏輯,同時(shí)也為程序員代碼的編寫(xiě)提供了便利。數(shù)據(jù)庫(kù)設(shè)計(jì)不是一蹴而就的事情,而是需要進(jìn)行設(shè)計(jì)、評(píng)價(jià)、再設(shè)計(jì)、再評(píng)價(jià)的過(guò)程,其中知識(shí)和經(jīng)驗(yàn)的積累是必不可少的東西。關(guān)于數(shù)據(jù)庫(kù)設(shè)計(jì)的方法與技巧,除了實(shí)用軟件工程(第二版),趙池龍等人編著,電子工業(yè)出版社,2006一書(shū)中介紹

11、的“要善于識(shí)別與正確處理多對(duì)多關(guān)系”、“要學(xué)會(huì)列變行技巧”之外,還有以下一些數(shù)據(jù)庫(kù)設(shè)計(jì)的知識(shí)和經(jīng)驗(yàn),希望能給讀者一些啟示。 12方法與技巧1:客戶是上帝 無(wú)論何時(shí)何地,客戶的需求總是放在第一位的,我們?cè)O(shè)計(jì)數(shù)據(jù)庫(kù),也是為滿足需求而做的。不要憑空想象,不要理所當(dāng)然。 一切為了客戶,客戶就是上帝,這些觀念不但在日常的商業(yè)消費(fèi)行為中滲透,也應(yīng)在數(shù)據(jù)庫(kù)設(shè)計(jì)中灌輸。 13方法與技巧2:主鍵的選取 在一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,所有的數(shù)據(jù)都是存儲(chǔ)在表里的,而現(xiàn)代的數(shù)據(jù)庫(kù)設(shè)計(jì)要求每一個(gè)表都有一個(gè)主鍵,我們建議使用一個(gè)與實(shí)體無(wú)關(guān)的無(wú)任何實(shí)際意義的序列號(hào)來(lái)充當(dāng),這樣的設(shè)計(jì)可以提高數(shù)據(jù)庫(kù)的可移植性。怎樣實(shí)現(xiàn)系統(tǒng)自動(dòng)生成序列號(hào)

12、呢?下面給出兩種實(shí)現(xiàn)方法:(1) 數(shù)據(jù)庫(kù)生成機(jī)制。有些關(guān)系數(shù)據(jù)庫(kù)提供某種序列號(hào)生成機(jī)制,如Microsoft SQL Server提供的一個(gè)Identity的屬性,允許每一個(gè)表內(nèi)可以有一個(gè)Identity列。Oracle提供了Sequence對(duì)象,可以提供序列鍵值,這樣一來(lái)實(shí)現(xiàn)非常方便。但其他一些數(shù)據(jù)庫(kù)引擎則沒(méi)有相應(yīng)的機(jī)制,例如Sybase就沒(méi)有類似的功能。甚者,有些商業(yè)化的系統(tǒng)(如Vignette Story Server)需要支持幾種主要的數(shù)據(jù)庫(kù)。那么,這樣的系統(tǒng)就不能使用Microsoft SQL Server或Oracle那樣的特有的機(jī)制,而是必須使用某種具有一般性的機(jī)制。因此,我們不

13、推薦使用這種序列號(hào)生成機(jī)制,除非你能保證在系統(tǒng)的生命周期里始終遠(yuǎn)行在同一種數(shù)據(jù)庫(kù)管理系統(tǒng)上。(2) 程序生成機(jī)制??梢允褂靡粋€(gè)表,在其內(nèi)部設(shè)有兩個(gè)列,一個(gè)列存放鍵名,一個(gè)列存放鍵值。程序使用SQL語(yǔ)句自動(dòng)管理鍵值。 14方法與技巧3:發(fā)現(xiàn)西瓜 在與本書(shū)配套的教材(參考文獻(xiàn)1)中,專門(mén)有一章節(jié)介紹了數(shù)據(jù)庫(kù)設(shè)計(jì)中的技巧與藝術(shù),除了講述了要善于識(shí)別與正確處理兩個(gè)實(shí)體之間的多對(duì)多關(guān)系、要學(xué)會(huì)“列變行”的設(shè)計(jì)技巧之外,還重點(diǎn)論述了“西瓜理論與西瓜方法”。所謂“西瓜理論與西瓜方法”,其實(shí)質(zhì)就是要求設(shè)計(jì)人員能夠分清主次,抓住主要矛盾,分清問(wèn)題的主要方面與次要方面,以主要帶動(dòng)次要,從而設(shè)計(jì)出滿足用戶需求的數(shù)據(jù)

14、庫(kù)。那么,怎樣才能發(fā)現(xiàn)主要矛盾與次要矛盾,分清問(wèn)題的主要方面與次要方面,也即是找到大西瓜呢?在這種尋找中,知識(shí)和經(jīng)驗(yàn)是最重要的,但在我們看來(lái),還是有一些方法可以遵循。 15方法與技巧4:樹(shù)型結(jié)構(gòu) 我們?cè)陂_(kāi)發(fā)系統(tǒng)的時(shí)候,都會(huì)遇到樹(shù)型結(jié)構(gòu)這一類的問(wèn)題,例如一些明顯的主從結(jié)構(gòu)、各大網(wǎng)站上常見(jiàn)的細(xì)分類別、應(yīng)用系統(tǒng)的組織結(jié)構(gòu)、Web系統(tǒng)的菜單樹(shù)等?,F(xiàn)在我們使用數(shù)據(jù)庫(kù)對(duì)這些信息進(jìn)行存儲(chǔ),以下給出兩種數(shù)據(jù)庫(kù)的設(shè)計(jì)方案。 16(1)方案1: 17(2)方案2: 18方法與技巧5:權(quán)限管理設(shè)計(jì) 在開(kāi)發(fā)管理信息系統(tǒng)的時(shí)候,很多時(shí)候都會(huì)涉及到用戶的權(quán)限管理的問(wèn)題,雖然目前許多大、中型的數(shù)據(jù)庫(kù)管理系統(tǒng)已經(jīng)幫助我們解決

15、了多用戶多權(quán)限的管理問(wèn)題,但我們不能依賴數(shù)據(jù)庫(kù)管理系統(tǒng)級(jí)別的權(quán)限設(shè)置,究其主要原因有兩個(gè):(1) 那些大、中型后臺(tái)數(shù)據(jù)庫(kù)系統(tǒng)軟件所提供的多用戶及其權(quán)限設(shè)置都是針對(duì)數(shù)據(jù)庫(kù)的共有屬性,并不一定能完全滿足某些特例的需求。(2) 不要過(guò)多的依賴后臺(tái)數(shù)據(jù)庫(kù)系統(tǒng)軟件的某些特殊功能,多種大、中型后臺(tái)數(shù)據(jù)庫(kù)系統(tǒng)軟件之間并不完全兼容。否則一旦日后需要轉(zhuǎn)換數(shù)據(jù)庫(kù)平臺(tái)或后臺(tái)數(shù)據(jù)庫(kù)系統(tǒng)軟件版本升級(jí),之前的架構(gòu)設(shè)計(jì)很可能無(wú)法重用。因此,我們有必要自行設(shè)計(jì)一套能適應(yīng)以后使用的權(quán)限管理的數(shù)據(jù)庫(kù)設(shè)計(jì)方案。 19圖3-4 權(quán)限管理 20方法與技巧6:?jiǎn)伪砟J?一些細(xì)心的人會(huì)發(fā)現(xiàn),現(xiàn)實(shí)生活中往往需要填寫(xiě)一些通用的表格,這類表格是

16、登記在一定特定的范圍之內(nèi)的信息,例如中華人民共和國(guó)機(jī)動(dòng)車行駛證,這就不是針對(duì)某一種車型的來(lái)設(shè)計(jì)的。如果對(duì)車輛有一定認(rèn)識(shí)的人就會(huì)知道,行駛證中的“號(hào)牌號(hào)碼、車輛類型、總質(zhì)量、整備質(zhì)量、外廓尺寸、檢驗(yàn)記錄”是各種類型的車輛的公共屬性,“核定載質(zhì)量、準(zhǔn)牽引總質(zhì)量、駕駛室共乘、貨箱內(nèi)部尺寸、后軸鋼板彈簧片數(shù)”是貨運(yùn)車輛的專有屬性,“核定載客”是客運(yùn)車輛的專有屬性。那么,我們應(yīng)該如何設(shè)計(jì)這一種表格的數(shù)據(jù)庫(kù)表呢?有設(shè)計(jì)師提出了一個(gè)名叫“單表模式”的設(shè)計(jì)思路,所謂單表模式,就是把相關(guān)子類的屬性統(tǒng)統(tǒng)集中在一個(gè)表里,通過(guò)“類別”字段來(lái)區(qū)分表內(nèi)記錄所屬的子類以及該類的有效屬性。設(shè)計(jì)如下圖3-6所示。 21圖3-6

17、 單表表格 22方法與技巧7:屬性拓展模式如果說(shuō)單表模式是針對(duì)擁有比較穩(wěn)定屬性的事物,那么屬性拓展模式就是針對(duì)哪些需求不清楚、事物的屬性不穩(wěn)定的一種解決方案。如果現(xiàn)在要開(kāi)發(fā)一個(gè)網(wǎng)上購(gòu)物系統(tǒng),其中要有一個(gè)存放商品信息的地方,也許你會(huì)設(shè)計(jì)出以下的數(shù)據(jù)庫(kù)表,如圖3-7所示。 23客戶突然提出要在商品中添加圖片,但不是所有的商品都有圖片。此時(shí),代碼已經(jīng)寫(xiě)了一部分了,沒(méi)辦法,客戶就是上帝,只好修改數(shù)據(jù)庫(kù),也許你會(huì)選擇直接在數(shù)據(jù)庫(kù)中添加圖片屬性,但考慮到不是所有商品都有圖片,使用image類型的字段會(huì)比較浪費(fèi)空間,所以要么選擇把圖片屬性的類型改為varchar(50)用以存放圖片路徑,要么新開(kāi)一個(gè)表格,為

18、了講述屬性拓展模式,我們使用新開(kāi)表格的方式進(jìn)行拓展,如圖3-8所示。 24又過(guò)了一段日子,客戶又提出商品的屬性還要添加長(zhǎng)、寬、高,此時(shí)你的程序已經(jīng)寫(xiě)完了,沒(méi)辦法,還是按照先前的設(shè)計(jì)思路,再開(kāi)新表存儲(chǔ),如圖3-9所示。 25系統(tǒng)運(yùn)行時(shí),如需維護(hù)“商品其他屬性”,可先從“屬性模板”中選擇一個(gè)屬性名稱,然后填寫(xiě)“屬性值”保存,系統(tǒng)會(huì)將對(duì)應(yīng)的產(chǎn)品ID、屬性模板ID及剛剛填寫(xiě)的“屬性值”一起保存在“商品其他屬性”里,這樣就完成了相關(guān)設(shè)置。無(wú)論產(chǎn)品的其他屬性需求發(fā)生怎樣的變化、怎樣增刪改屬性,都可以在運(yùn)行時(shí)實(shí)現(xiàn),而不必修改數(shù)據(jù)庫(kù)設(shè)計(jì)和程序代碼。如圖3-10所示。 26系統(tǒng)運(yùn)行時(shí),如需維護(hù)“商品其他屬性”,

19、程序直接列出“屬性名稱”,然后填寫(xiě)“屬性值”保存,系統(tǒng)會(huì)將對(duì)應(yīng)的產(chǎn)品ID、屬性名稱及剛剛填寫(xiě)的“屬性值”一起保存在“商品其他屬性”里,這樣就完成了相關(guān)設(shè)置。以后如果需求發(fā)生變更,則只需修改相應(yīng)的程序代碼即可,不必修改數(shù)據(jù)庫(kù)設(shè)計(jì)。如圖3-11所示。 27對(duì)象-關(guān)系映射 現(xiàn)代大部分的商業(yè)系統(tǒng)都是使用面向?qū)ο蟮募夹g(shù)進(jìn)行開(kāi)發(fā)的,比如像Java或者C之類的,特別是在信息管理系統(tǒng)(MIS/ERP)領(lǐng)域,面向?qū)ο蟮募夹g(shù)更是主流所在。在使用面向?qū)ο蟮募夹g(shù)進(jìn)行前臺(tái)開(kāi)發(fā)的同時(shí),大部分開(kāi)發(fā)人員都會(huì)選擇關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)對(duì)數(shù)據(jù)進(jìn)行管理。但是,面向?qū)ο蠹夹g(shù)和關(guān)系數(shù)據(jù)庫(kù)是建立在兩個(gè)不同理論基礎(chǔ)之上的,對(duì)象技

20、術(shù)基于軟件工程的一些原理,例如耦合、聚合和封裝,而關(guān)系范例則基于數(shù)學(xué)原理,特別是集合論的原理。兩種不同的理論基礎(chǔ)導(dǎo)致各自有不同的優(yōu)缺點(diǎn)。在一個(gè)項(xiàng)目的開(kāi)發(fā)過(guò)程中,通常會(huì)存在著面向?qū)ο蠹夹g(shù)與關(guān)系型技術(shù)之間的阻抗失配。不過(guò)這種阻抗失配很容易被克服,訣竅有兩點(diǎn):(1). 理解把對(duì)象映射到關(guān)系型數(shù)據(jù)庫(kù)的過(guò)程。(2). 如何去實(shí)現(xiàn)這些映射。 28對(duì)象-關(guān)系映射對(duì)象-關(guān)系映射,即ORM(Object Relational Mapping)。它的實(shí)質(zhì)就是將關(guān)系數(shù)據(jù)(庫(kù))中的業(yè)務(wù)數(shù)據(jù)用對(duì)象的形式表示出來(lái),并通過(guò)面向?qū)ο螅∣bject-Oriented)的方式將這些對(duì)象組織起來(lái),實(shí)現(xiàn)系統(tǒng)業(yè)務(wù)邏輯的過(guò)程。在ORM過(guò)

21、程中最重要的概念是映射(Mapping),通過(guò)這種映射可以使業(yè)務(wù)對(duì)象與數(shù)據(jù)庫(kù)分離。從面向?qū)ο髞?lái)說(shuō),數(shù)據(jù)庫(kù)不應(yīng)該和業(yè)務(wù)邏輯綁定到一起,ORM則起到這樣的分離作用,使數(shù)據(jù)庫(kù)層透明,開(kāi)發(fā)人員真正的面向?qū)ο蟆?圖3-12簡(jiǎn)單說(shuō)明了ORM在多層系統(tǒng)架構(gòu)中的這個(gè)作用。 29圖3-12 ORM的多層系統(tǒng)架構(gòu) 301. 屬性的映射 類是屬性和操作的集合。一般來(lái)說(shuō),類的一個(gè)屬性可以映射到關(guān)系型數(shù)據(jù)庫(kù)表中0個(gè)或者多個(gè)字段當(dāng)中去。但是,并非所有的屬性都需要映射,例如一些統(tǒng)計(jì)型的數(shù)據(jù),比如一個(gè)應(yīng)用程序記錄學(xué)生的成績(jī),那么其中的平均分?jǐn)?shù)一欄,就可以在需要時(shí)通過(guò)前臺(tái)應(yīng)用程序進(jìn)行計(jì)算。如果一個(gè)屬性本身就是一個(gè)對(duì)象,像學(xué)生選

22、課系統(tǒng)中的課程對(duì)象擁有學(xué)生對(duì)象一樣,這也反映了兩個(gè)類之間的關(guān)系,學(xué)生對(duì)象也需要映射,這本身就是一個(gè)遞歸的關(guān)系。最簡(jiǎn)單的映射是把一個(gè)屬性映射成一列,通常這種情況出現(xiàn)在雙方都擁有一樣的數(shù)據(jù)類型,譬如雙方都是date型、或者屬性是string而列是char型。這樣的映射在power Designer中能輕松地完成。 312. 繼承結(jié)構(gòu)的映射 在面向?qū)ο蟮募夹g(shù)領(lǐng)域中,繼承關(guān)系是其最重要的特征之一,我們需要把這種特征映射到數(shù)據(jù)庫(kù)當(dāng)中去。對(duì)象之間有繼承關(guān)系,但表之間卻沒(méi)有。在把對(duì)象存入關(guān)系型數(shù)據(jù)庫(kù)的時(shí)候,繼承的概念會(huì)發(fā)生了稍許的變化。我們介紹三種常用的解決方法,將繼承關(guān)系映射到關(guān)系數(shù)據(jù)庫(kù),以及由Scott

23、 Amber提出的第四種補(bǔ)充的方法。前三種方法在powerDesigner已經(jīng)有所體現(xiàn)。這些方法如下所示:(1). 整個(gè)類層次結(jié)構(gòu)使用一張表 (2). 每個(gè)具體類使用一張表 (3). 每個(gè)類使用一張表 (4). 所有類映射到一個(gè)通用的表結(jié)構(gòu)我們將使用這一類結(jié)構(gòu)來(lái)講述這四種方法。 32“學(xué)生”類“教師”類“教授”類結(jié)構(gòu) 331.整個(gè)類層次結(jié)構(gòu)使用一張表 按照這種設(shè)計(jì)思路,我們可以把所有的類都存儲(chǔ)在一張表當(dāng)中,如圖3-15所示。這種方法非常直觀,可以一目了然整個(gè)類結(jié)構(gòu),我們建議表的名稱最好用根類的類名來(lái)命名。 不過(guò),這種整個(gè)類層次結(jié)構(gòu)使用一個(gè)表,會(huì)有一些力不從心的事情發(fā)生。如果現(xiàn)在出現(xiàn)了一個(gè)新的結(jié)

24、構(gòu),如圖3-16所示,那么表的結(jié)構(gòu)就要添加一個(gè)新的字段“津貼”,如果繼承的層次不斷增多,那么就要不斷修改表的結(jié)構(gòu),這對(duì)于實(shí)際的開(kāi)發(fā)工作來(lái)說(shuō)非常不利。還有一個(gè)問(wèn)題,現(xiàn)在出現(xiàn)了一個(gè)新的類型,它既是學(xué)生又是教師。那么在“類型”一列中就要用一個(gè)新的代號(hào)來(lái)指明,例如學(xué)生助教之類的,如果后來(lái)又不斷出現(xiàn)新的組合類型,那么代碼就要不斷進(jìn)行修改,從而造成不斷地反工。在這種情況下,可以考慮使用“布爾值代替類型碼”的方法,如圖3-17所示。 34整個(gè)類層次結(jié)構(gòu)使用一張表圖示 352.每個(gè)具體類使用一張表 按照這種設(shè)計(jì)思路,每一張表既包含自身的屬性又包含它所表示的類繼承的屬性。圖3-18描述了采取這個(gè)方法時(shí)的數(shù)據(jù)表結(jié)

25、構(gòu)。有與“學(xué)生”類對(duì)應(yīng)的和與“教師”類對(duì)應(yīng)的表,因?yàn)樗鼈兪蔷唧w類,但沒(méi)有與“人”類對(duì)應(yīng)的數(shù)據(jù)表,因?yàn)樗浅橄箢?。每個(gè)數(shù)據(jù)實(shí)體都有自己的主鍵,即studentOID 和 teacherOID。 這種設(shè)計(jì)思路非常容易掌握,但其弊端也非常明顯。數(shù)據(jù)庫(kù)表會(huì)隨著類結(jié)構(gòu)的不斷增多而日漸龐大,其中有些表顯得多余,數(shù)據(jù)表的無(wú)限制的膨脹在數(shù)據(jù)庫(kù)設(shè)計(jì)當(dāng)中應(yīng)當(dāng)避免。 36圖3-18 每個(gè)具體類使用一張表 373.每個(gè)類使用一張表 按照這種設(shè)計(jì)思路,為每個(gè)類創(chuàng)建一張表,不管其是具體類還是抽象類。圖3-19展示了這種設(shè)計(jì)思路。請(qǐng)大家注意,這里是將根類(“人”類)的主鍵(personOID)作為三個(gè)數(shù)據(jù)表的主鍵。在“學(xué)生

26、”表和“教師”表中,personOID既是主鍵又是外鍵,personOID既起到唯一標(biāo)識(shí)一條記錄的作用,又能維系表與表之間的關(guān)系。在早期的UML中不允許類似這種復(fù)合元素的出現(xiàn),但在UML的1.4版中已經(jīng)取消了這種限制。 38圖3-19 每個(gè)類使用一張表 394.所有類映射到一個(gè)通用的表結(jié)構(gòu) 采用這種設(shè)計(jì)思路,我們需要設(shè)計(jì)一張通用的表格來(lái)存儲(chǔ)繼承結(jié)構(gòu),圖3-20展示了這種設(shè)計(jì)思路。這種方法不局限于繼承結(jié)構(gòu),也支持所有形式的映射。該方法也稱為元數(shù)據(jù)驅(qū)動(dòng)。 這樣的設(shè)計(jì),不管以后類結(jié)構(gòu)如何增加,都能保持表個(gè)數(shù)的穩(wěn)定。只需添加記錄,就能輕松實(shí)現(xiàn)類的類結(jié)構(gòu)的增長(zhǎng)。不過(guò),缺點(diǎn)也顯而易見(jiàn),為了重組一個(gè)類結(jié)構(gòu),

27、需要花費(fèi)的時(shí)間相當(dāng)長(zhǎng),這是由于聯(lián)合查詢所造成的。 40圖3-20 所有類映射到一個(gè)通用的表 41關(guān)系的映射 在映射之前,我們需要清楚關(guān)系的類型。在數(shù)據(jù)表之間存在一對(duì)一關(guān)系,一對(duì)多,多對(duì)多。而在對(duì)象與對(duì)象之間,不僅擁有數(shù)據(jù)表之間的關(guān)系,還增加了聚合、關(guān)聯(lián)等。如何能實(shí)現(xiàn)平穩(wěn)的映射呢?首先介紹處理像聚合、關(guān)聯(lián)等的關(guān)系的映射方法。其實(shí),在面向?qū)ο蠼F陂g(OOA),最難回答的問(wèn)題是,何時(shí)使用聚合,何時(shí)使用關(guān)聯(lián)。性能和靈活性的權(quán)衡將會(huì)影響到這個(gè)問(wèn)題的答案??梢允褂脝伪砭酆希⊿ingle Table Aggregation),這是一種最自然的聚合映射方式。也可以使用外鍵聚合(Foreign Key Agg

28、regation),它常常用于處理1:n聚合的映射。對(duì)于n:m的關(guān)系,可以使用關(guān)聯(lián)表(Association Table)的策略來(lái)解決。 421. 單表聚合(Single Table Aggregation) 該模式展示了如何通過(guò)把所有的聚合的對(duì)象屬性,集成到單個(gè)的表中的方法,把聚合映射到一個(gè)關(guān)系數(shù)據(jù)模型。請(qǐng)看以下例子,現(xiàn)在有兩個(gè)類,“學(xué)生”類和“聯(lián)系”類,“學(xué)生”類有一屬性是聯(lián)系方式,其類型為“聯(lián)系”類,現(xiàn)在要把這樣的結(jié)構(gòu)映射到數(shù)據(jù)表當(dāng)中。按照單表聚合的設(shè)計(jì)思路,把被聚合對(duì)象的屬性和使用聚合對(duì)象的屬性放在同一張表中即可,圖3-21為這種策略的通用表示,圖3-22則是對(duì)應(yīng)于本例子的圖示。 43

29、通用的單表聚合 is mapping tois mapping toAggregatingObject1 AttributesAttributesAggregatedObject2 Attributes44單表聚合映射方法討論映射完成后,可以從若干個(gè)技術(shù)點(diǎn)對(duì)這個(gè)映射方法進(jìn)行討論:(1). 性能:在性能方面,該方案是最佳的,因?yàn)橹恍枰L問(wèn)一張表就能夠獲取一個(gè)帶聚合的對(duì)象,并讀入所有聚合對(duì)象。另一方面,由于聚合對(duì)象的字段的增多,一次讀取將會(huì)增大數(shù)據(jù)庫(kù)讀入的頁(yè)面數(shù),導(dǎo)致IO帶寬的浪費(fèi)。 (2). 可維護(hù)性和靈活性:如果聚合的對(duì)象類型被多個(gè)對(duì)象所引用,那么將會(huì)降低可維護(hù)性,因?yàn)槊恳淮螌?duì)聚合對(duì)象類型的修

30、改,都會(huì)導(dǎo)致對(duì)所有引用聚合對(duì)象的修改。 譬如“地址”類新添加了電話號(hào)碼屬性,那么數(shù)據(jù)庫(kù)表“學(xué)生”表就要添加一個(gè)名為電話號(hào)碼的新列。由于該例子是示例性的例子,結(jié)構(gòu)非常簡(jiǎn)單,但在實(shí)際的設(shè)計(jì)當(dāng)中則要進(jìn)行更多的繁瑣的修改。(3). 數(shù)據(jù)庫(kù)的一致性:刪除使用聚合的對(duì)象時(shí),聚合對(duì)象將會(huì)自動(dòng)刪除。不需要任何其它的程序或數(shù)據(jù)庫(kù)觸發(fā)器來(lái)控制。 (4). 特殊查詢:類似查詢數(shù)據(jù)庫(kù)中所有的“地址”類對(duì)象之類的查詢,都會(huì)變得很難處理。 452. 外鍵聚合(Foreign Key Aggregation) 這種模式展示了如何將對(duì)象間的1:n的關(guān)系,映射到關(guān)系型數(shù)據(jù)庫(kù)表中?,F(xiàn)在有兩個(gè)類,“學(xué)生”類和“地址”類,“學(xué)生”類

31、有屬性是家庭住址和宿舍地址,其類型都為“地址”類。按照這種設(shè)計(jì)思路,可以得出圖3-23所示的通用圖示和圖3-24的對(duì)于該例子的圖示。 46圖3-23 通用的外鍵聚合 is mapping tois mapping toAggregatingObjects TableAggregatedObjectsOID char(64)AggregatedObjects TableSysotherOID char(64)Foreign Key47圖3-24 “學(xué)生”類和“地址”類的外鍵聚合 48外鍵聚合映射方法討論(1). 讀性能:讀取一個(gè)學(xué)生對(duì)象將需要一個(gè)連接操作或兩次讀操作??梢栽趯W(xué)生對(duì)象中加入地址的引用集合。 (2). 寫(xiě)性能:該

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論