北京市公路局系統(tǒng)使用的是Oracle 7.3關(guān)系數(shù)據(jù)庫(kù),即RDBMS。由于我們對(duì)整個(gè)工程使用了面向?qū)ο蟮能浖こ?OOSE)開(kāi)發(fā)方法學(xué),所以數(shù)據(jù)庫(kù)設(shè)計(jì)也是面向?qū)ο蟮摹?
一、 概念的區(qū)分?
有些人把面向?qū)ο蟮臄?shù)據(jù)庫(kù)設(shè)計(jì)(即數(shù)據(jù)庫(kù)模式)思想與面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)(OODBMS) 理論混為一談。其實(shí)前者是數(shù)據(jù)庫(kù)用戶(hù)定義數(shù)據(jù)庫(kù)模式的思路,后者是數(shù)據(jù)庫(kù)管理程序的思路。用戶(hù)使用面向?qū)ο蠓椒▽W(xué)可以定義任何一種DBMS數(shù)據(jù)庫(kù),即網(wǎng)絡(luò)型、層次型、關(guān)系型、面向?qū)ο笮途桑踔廖募到y(tǒng)設(shè)計(jì)也照樣可以遵循面向?qū)ο蟮乃悸贰?
面向?qū)ο蟮乃悸坊蚍Q(chēng)規(guī)范可以用于系統(tǒng)分析、系統(tǒng)設(shè)計(jì)、程序設(shè)計(jì),也可以用于數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)、數(shù)據(jù)庫(kù)設(shè)計(jì)。OOSE自上至下、自始至終地貫徹面向?qū)ο笏悸罚且粋€(gè)一氣呵成的統(tǒng)一體。面向?qū)ο蟮臄?shù)據(jù)庫(kù)設(shè)計(jì)只是 OOSE 的一個(gè)環(huán)節(jié)。?
二、 數(shù)據(jù)庫(kù)設(shè)計(jì)的重要性?
一般數(shù)據(jù)庫(kù)設(shè)計(jì)方法有兩種,即屬性主導(dǎo)型和實(shí)體主導(dǎo)型。屬性主導(dǎo)型從歸納數(shù)據(jù)庫(kù)應(yīng)用的屬性出發(fā),在歸并屬性集合(實(shí)體)時(shí)維持屬性間的函數(shù)依賴(lài)關(guān)系。實(shí)體主導(dǎo)型則先從尋找對(duì)數(shù)據(jù)庫(kù)應(yīng)用有意義的實(shí)體入手,然后通過(guò)定義屬性來(lái)定義實(shí)體。一般現(xiàn)實(shí)世界的實(shí)體數(shù)在屬性數(shù) 1/10 以下時(shí),宜使用實(shí)體主導(dǎo)型設(shè)計(jì)方法。面向?qū)ο蟮臄?shù)據(jù)庫(kù)設(shè)計(jì)是從對(duì)象模型出發(fā)的,屬于實(shí)體主導(dǎo)型設(shè)計(jì)。?
一般數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)都遵循以下相關(guān)開(kāi)發(fā)步驟:1設(shè)計(jì)應(yīng)用系統(tǒng)結(jié)構(gòu);2 選擇便于將應(yīng)用程序與 DBMS 結(jié)合的DBMS體系結(jié)構(gòu),如RDBMS;3 根據(jù)應(yīng)用程序使用的環(huán)境平臺(tái),選擇適宜的DBMS(如Oracle)和開(kāi)發(fā)工具(如PB);4 設(shè)計(jì)數(shù)據(jù)庫(kù),編寫(xiě)定義數(shù)據(jù)庫(kù)模式的SQL程序;5 編寫(xiě)確保數(shù)據(jù)正確錄入數(shù)據(jù)庫(kù)的用戶(hù)接口應(yīng)用程序;6 錄入數(shù)據(jù)庫(kù)數(shù)據(jù);7 運(yùn)行各種與數(shù)據(jù)庫(kù)相關(guān)的應(yīng)用程序,以確認(rèn)和修正數(shù)據(jù)庫(kù)的內(nèi)容。?
對(duì)以上各步驟,有幾點(diǎn)需要說(shuō)明:?
(1)這不是瀑布模型,每一步都可以有反饋。?
在公路局系統(tǒng)中,以上各步不僅有反饋、有反復(fù),還有并行處理。比如一些庫(kù)表在數(shù)據(jù)錄入時(shí),另一些庫(kù)表設(shè)計(jì)還在修改。這與我們的遞增式開(kāi)發(fā)方法有關(guān),也與面向?qū)ο蟮奶卣饔嘘P(guān)。?
(2)上述順序不是絕對(duì)的,大多數(shù)場(chǎng)合是從第三步開(kāi)始的。?
(3)對(duì)大多數(shù)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)來(lái)說(shuō),上述各步中最重要、最困難的不是應(yīng)用系統(tǒng)設(shè)計(jì)而是數(shù)據(jù)庫(kù)設(shè)計(jì)。?
三、 DBMS的支持和數(shù)據(jù)庫(kù)設(shè)計(jì)?
很多數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開(kāi)發(fā)者不重視數(shù)據(jù)庫(kù)設(shè)計(jì)的原因是:他們太迷信DBMS,認(rèn)為購(gòu)入一個(gè)功能強(qiáng)大的 DBMS后數(shù)據(jù)庫(kù)設(shè)計(jì)就不困難、不重要了。一些國(guó)內(nèi)外的數(shù)據(jù)庫(kù)教材常常是在為DBMS的開(kāi)發(fā)廠商做宣傳,而很少站在數(shù)據(jù)庫(kù)用戶(hù)角度,從數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)出發(fā)介紹數(shù)據(jù)庫(kù)設(shè)計(jì)方法。結(jié)果往往使讀者搞不清書(shū)中介紹的是數(shù)據(jù)庫(kù)管理程序的設(shè)計(jì)思想,還是應(yīng)用這種 DBMS 進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)的思想。?
其實(shí),DBMS只是給用戶(hù)為已采用的數(shù)據(jù)庫(kù)提供一個(gè)舞臺(tái),而是否使用這個(gè)舞臺(tái)上的道具以及唱什么戲,則完全取決于用戶(hù)的戲劇腳本和導(dǎo)演(開(kāi)發(fā)者)的安排。例如,公路局系統(tǒng)所使用的數(shù)據(jù)庫(kù)管理系統(tǒng),是以二維表為基本管理單元、支持所有關(guān)系代數(shù)操作、支持實(shí)體完整性與實(shí)體間參照完整性的全關(guān)系型 RDBMS,而我們要在這個(gè)舞臺(tái)上利用上述“道具”設(shè)計(jì)一個(gè)面向?qū)ο蟮年P(guān)系數(shù)據(jù)庫(kù)。?
四、 應(yīng)用對(duì)象模型與RDBMS模型的映射?
數(shù)據(jù)庫(kù)設(shè)計(jì)(模式)是否支持應(yīng)用系統(tǒng)的對(duì)象模型,這是判斷是否是面向?qū)ο髷?shù)據(jù)庫(kù)系統(tǒng)的基本出發(fā)點(diǎn)。由于應(yīng)用系統(tǒng)設(shè)計(jì)在前,數(shù)據(jù)庫(kù)設(shè)計(jì)隨后,所以應(yīng)用系統(tǒng)對(duì)象模型向數(shù)據(jù)庫(kù)模式的映射是面向?qū)ο髷?shù)據(jù)庫(kù)設(shè)計(jì)的關(guān)鍵。?
1.三層數(shù)據(jù)庫(kù)模式面向?qū)ο竽P偷臄U(kuò)展?
一般數(shù)據(jù)庫(kù)設(shè)計(jì)多參照ANSL/SPARC關(guān)于數(shù)據(jù)庫(kù)模式的3層標(biāo)準(zhǔn)結(jié)構(gòu)提案。最接近物理數(shù)據(jù)庫(kù)的內(nèi)部模式由 DBMS 提供的SQL來(lái)描述。概念模式可以由若干個(gè)內(nèi)部模式聚集而成,它是由數(shù)據(jù)庫(kù)用戶(hù)規(guī)范的一些表的集合。例如,公路局計(jì)劃處數(shù)據(jù)庫(kù)模式、機(jī)務(wù)處數(shù)據(jù)庫(kù)模式等,它們是邏輯數(shù)據(jù)庫(kù),常常通過(guò)庫(kù)表 ID來(lái)界定庫(kù)邊界。一般的概念模式是數(shù)據(jù)庫(kù)物理模式作用域的邊界,它能實(shí)現(xiàn)數(shù)據(jù)庫(kù)的物理意義、特定DBMS 的特殊操作對(duì)外部應(yīng)用程序的信息隱蔽。外部模式是從特定用戶(hù)應(yīng)用角度看待的數(shù)據(jù)庫(kù)模式,從不同的應(yīng)用出發(fā)對(duì)同一概念模式可以給出多種不同的外部模式。例如:公路綠化情況查詢(xún)應(yīng)用看到的數(shù)據(jù)庫(kù)是公路上的樹(shù)木種類(lèi)、數(shù)量、分布比率等,橋梁隧道狀況查詢(xún)應(yīng)用看到的是公路上的橋梁、隧道長(zhǎng)度、個(gè)數(shù)、路段等,但是它們可能訪問(wèn)的是同一個(gè)庫(kù)表的不同子集。?
當(dāng)外部應(yīng)用系統(tǒng)以對(duì)象模型進(jìn)行抽象時(shí),從各個(gè)應(yīng)用出發(fā)抽象出的對(duì)象模型可以映射到外部模型上,對(duì)此我們不妨稱(chēng)之為外部對(duì)象模型。但是,外部模型只是概念模型的子集,所以面向?qū)ο蟮臄?shù)據(jù)庫(kù)設(shè)計(jì)核心在于系統(tǒng)對(duì)象模型(不妨稱(chēng)之為概念對(duì)象模型) 向數(shù)據(jù)庫(kù)概念模型的映射(參見(jiàn)圖1) 。?
2.對(duì)象模型向數(shù)據(jù)庫(kù)表的映射規(guī)則?
由于 RDBMS 是以二維表為基本管理單元的,所以對(duì)象模型最終是由二維表及表間關(guān)系來(lái)描述的。換言之,對(duì)象模型向數(shù)據(jù)庫(kù)概念模型的映射就是向數(shù)據(jù)庫(kù)表的變換過(guò)程。有關(guān)的變換規(guī)則簡(jiǎn)單歸納如下:?
(1)一個(gè)對(duì)象類(lèi)可以映射為一個(gè)以上的庫(kù)表,當(dāng)類(lèi)間有一對(duì)多的關(guān)系時(shí),一個(gè)表也可以對(duì)應(yīng)多個(gè)類(lèi)。?
圖1 三層數(shù)據(jù)庫(kù)模式面向?qū)ο竽P偷臄U(kuò)展?
(2)關(guān)系(一對(duì)一、一對(duì)多、多對(duì)多以及三項(xiàng)關(guān)系)的映射可能有多種情況,但一般映射為一個(gè)表,也可以在對(duì)象類(lèi)表間定義相應(yīng)的外鍵。對(duì)于條件關(guān)系的映射,一個(gè)表至少應(yīng)有3個(gè)屬性。?
(3)單一繼承的泛化關(guān)系可以對(duì)超類(lèi)、子類(lèi)分別映射表,也可以不定義父類(lèi)表而讓子類(lèi)表?yè)碛懈割?lèi)屬性;反之,也可以不定義子類(lèi)表而讓父類(lèi)表?yè)碛腥孔宇?lèi)屬性。?
(4)對(duì)多重繼承的超類(lèi)和子類(lèi)分別映射表,對(duì)多次多重繼承的泛化關(guān)系也映射一個(gè)表。?
(5)對(duì)映射后的庫(kù)表進(jìn)行冗余控制調(diào)整,使其達(dá)到合理的關(guān)系范式。?
3.數(shù)據(jù)庫(kù)模式要面向應(yīng)用系統(tǒng)?
我們選擇面向?qū)ο蟮南到y(tǒng)設(shè)計(jì)也好,面向?qū)ο蟮臄?shù)據(jù)庫(kù)設(shè)計(jì)也好,根本目的是服務(wù)于應(yīng)用系統(tǒng)的需要。?
以公路局計(jì)劃處子系統(tǒng)為例。計(jì)劃處的最大工作量就是處理成堆的報(bào)表,因此如何有效地存取這些報(bào)表是計(jì)劃處數(shù)據(jù)庫(kù)設(shè)計(jì)的關(guān)鍵。考慮到每月上交的報(bào)表是同構(gòu)的,我們可以創(chuàng)建一張庫(kù)表去存儲(chǔ)同一種報(bào)表,例如公路工程月報(bào)表。但是又產(chǎn)生另一個(gè)問(wèn)題,當(dāng)用戶(hù)想查詢(xún)某個(gè)月的公路工程月報(bào)表時(shí),如何從庫(kù)表中取出數(shù)據(jù)呢?按照數(shù)據(jù)庫(kù)的思想應(yīng)該有一個(gè)主鍵來(lái)標(biāo)識(shí)這張報(bào)表。在公路局的報(bào)表里,區(qū)別月報(bào)表靠上報(bào)時(shí)間和上報(bào)單位,但如果為每條記錄都加上這兩個(gè)字段,無(wú)疑會(huì)加大庫(kù)表冗余,增加查詢(xún)時(shí)間,降低效率。更何況每張報(bào)表都有單位負(fù)責(zé)人、填表人的屬性,那么怎樣解決這個(gè)問(wèn)題呢?我們?cè)O(shè)計(jì)了超類(lèi)對(duì)象 X3 表和流水號(hào)表。X3 表和流水號(hào)表的表結(jié)構(gòu)如下。?
表1 X3表和流水號(hào)表的表結(jié)構(gòu):?
將它們加入由應(yīng)用對(duì)象模型映射出的數(shù)據(jù)庫(kù)概念模型后,得到圖2所示的結(jié)構(gòu)。?
每一個(gè)應(yīng)用模塊對(duì)象對(duì)應(yīng)建立一張流水號(hào)表,同一類(lèi)的報(bào)表屬同一流水號(hào)表,由流水號(hào)表統(tǒng)一管理。流水號(hào)表對(duì)各分局、處室提交和建立的每一張報(bào)表分配一個(gè)流水號(hào),該流水號(hào)在整個(gè)數(shù)據(jù)庫(kù)中是唯一的,因此在庫(kù)中存放任何一張報(bào)表都是明確的。流水號(hào)的數(shù)據(jù)類(lèi)型為 Char(10),前4位為表號(hào),后6位為序列號(hào),其中序列號(hào)取自 X3表中最大序列號(hào)。也就是說(shuō),流水號(hào)就是對(duì)象標(biāo)識(shí)符,報(bào)表是一個(gè)對(duì)象,一個(gè)對(duì)象標(biāo)識(shí)符唯一決定一個(gè)對(duì)象。流水號(hào)一旦被分配出去后,在這張報(bào)表的生存期內(nèi)就具有了永久不變性。無(wú)論報(bào)表的內(nèi)容及結(jié)構(gòu)怎么變化,它都不變,直到報(bào)表被刪除,流水號(hào)才會(huì)消失。流水號(hào)表是父類(lèi),報(bào)表是子類(lèi),流水號(hào)表之間的聯(lián)系只能通過(guò) X3 表。5個(gè)應(yīng)用模塊對(duì)象完全映射到數(shù)據(jù)庫(kù)概念模型中,形成應(yīng)用對(duì)象與數(shù)據(jù)庫(kù)對(duì)象的一一對(duì)應(yīng),保持了5個(gè)應(yīng)用對(duì)象在目標(biāo)系統(tǒng)設(shè)計(jì)中原有的獨(dú)立性,具有很好的封裝性和信息隱蔽性。盡管流水號(hào)表會(huì)有一些冗余,但它是值得的。?
圖2 超類(lèi)對(duì)象間關(guān)系示意圖?
五、 面向?qū)ο箨P(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)效果?
在公路局系統(tǒng)設(shè)計(jì)中,從某種意義上講,是數(shù)據(jù)庫(kù)設(shè)計(jì)的面向?qū)ο筇卣髯罱K奠定了整個(gè)系統(tǒng)的面向?qū)ο笮裕攀姑嫦驅(qū)ο蠓椒ㄔ诔绦蜷_(kāi)發(fā)階段全面開(kāi)花。其效果歸納如下:?
1.數(shù)據(jù)庫(kù)結(jié)構(gòu)清晰,便于實(shí)現(xiàn)OOP?
由于實(shí)現(xiàn)了應(yīng)用模塊對(duì)象對(duì)數(shù)據(jù)庫(kù)對(duì)象的完全映射,數(shù)據(jù)庫(kù)邏輯模型可以自然且直接地模擬現(xiàn)實(shí)世界的實(shí)體關(guān)系。公路局用戶(hù)所處的當(dāng)前物理世界、系統(tǒng)開(kāi)發(fā)者所抽象的系統(tǒng)外部功能,與支持系統(tǒng)功能的內(nèi)部數(shù)據(jù)庫(kù) (數(shù)據(jù)結(jié)構(gòu))一一對(duì)應(yīng),所以用戶(hù)、開(kāi)發(fā)者和數(shù)據(jù)庫(kù)維護(hù)人員可以用一致的語(yǔ)言進(jìn)行溝通。 特別是對(duì)多數(shù)不了解公路局業(yè)務(wù)的程序開(kāi)發(fā)人員來(lái)說(shuō),這種將應(yīng)用對(duì)象與相應(yīng)的數(shù)據(jù)對(duì)象封裝在對(duì)象統(tǒng)一體中的設(shè)計(jì)方法,大大減輕了程序?qū)崿F(xiàn)的難度,使他們只要知道加工的數(shù)據(jù)及所需的操作即可,而且應(yīng)用程序大多雷同,可以多處繼承由設(shè)計(jì)人員抽象出來(lái)的、預(yù)先開(kāi)發(fā)好的各種物理級(jí)超類(lèi)。?
2.數(shù)據(jù)庫(kù)對(duì)象具有獨(dú)立性,便于維護(hù)?
除了數(shù)據(jù)庫(kù)表對(duì)象與應(yīng)用模塊對(duì)象一一對(duì)應(yīng)外,在邏輯對(duì)象模型中我們沒(méi)有設(shè)計(jì)多重繼承的泛化關(guān)系,所以這樣得到的數(shù)據(jù)庫(kù)結(jié)構(gòu)基本上是由父表類(lèi)和子表類(lèi)構(gòu)成的樹(shù)型層次結(jié)構(gòu),表類(lèi)間很少有繼承以外的復(fù)雜關(guān)系,是一個(gè)符合局部化原則的結(jié)構(gòu),從而使數(shù)據(jù)庫(kù)表數(shù)據(jù)破壞的影響控制在局部范圍且便于修復(fù),給公路局系統(tǒng)開(kāi)通后的數(shù)據(jù)庫(kù)日常維護(hù)工作帶來(lái)便利。?
3.需求變更時(shí)程序與數(shù)據(jù)庫(kù)重用率高,修改少?
在映射應(yīng)用對(duì)象時(shí),除關(guān)系映射規(guī)范化后可能出現(xiàn)一對(duì)多的表映射外,大多數(shù)應(yīng)用對(duì)象與表對(duì)象是一一對(duì)應(yīng)的。我們可以把規(guī)范化處理后的、由一個(gè)應(yīng)用對(duì)象映射出來(lái)的多個(gè)表看成一個(gè)數(shù)據(jù)庫(kù)對(duì)象。因此當(dāng)部分應(yīng)用需求變更時(shí),首先,系統(tǒng)修改可以不涉及需求不變更的部分。其次,變更部分的修改可以基本上只限于追加或刪除程序模塊或追加新庫(kù)表,而基本上不必修改原有程序代碼或原有庫(kù)表定義,從而大大減少了工作量,降低了工作難度。?
六、 最簡(jiǎn)單的就是最好的?
客觀世界是錯(cuò)綜復(fù)雜的,計(jì)算機(jī)科學(xué)理論的發(fā)展也越來(lái)越高深、復(fù)雜。然而,人類(lèi)探索理論和技術(shù)的最終目的是:讓客觀世界的復(fù)雜變簡(jiǎn)單,最簡(jiǎn)單的就是最好的。為此我們給出以下幾點(diǎn)忠告:?
1. 慎用外鍵?
RDBMS 支持復(fù)雜關(guān)系的能力很強(qiáng),無(wú)論用戶(hù)怎么在邏輯上設(shè)定外鍵,它基本上都能從物理上幫用戶(hù)實(shí)現(xiàn)。但是外鍵把許多獨(dú)立的實(shí)體牽連在一起,不僅使 RDBMS 維持?jǐn)?shù)據(jù)一致性負(fù)擔(dān)沉重,也使數(shù)據(jù)庫(kù)應(yīng)用復(fù)雜化,加重了程序開(kāi)發(fā)負(fù)擔(dān)。這樣的數(shù)據(jù)庫(kù)很難理解,很難實(shí)現(xiàn)信息隱蔽性設(shè)計(jì),往往把簡(jiǎn)單問(wèn)題復(fù)雜化。?
2. 適當(dāng)冗余?
減少數(shù)據(jù)庫(kù)冗余的設(shè)計(jì)思路產(chǎn)生于70年代,它是促使 DBMS 進(jìn)步的重要?jiǎng)恿χ弧H欢q如為了節(jié)省2個(gè)字節(jié)的存儲(chǔ)空間而釀成了如今全球?yàn)橹^痛的2000年問(wèn)題一樣,它是計(jì)算機(jī)硬件主導(dǎo)時(shí)代的產(chǎn)物。以今天國(guó)內(nèi)計(jì)算機(jī)市場(chǎng)價(jià)格為例,6G服務(wù)器硬盤(pán)的價(jià)格不過(guò)2000元,而上海物價(jià)局 1996 年頒發(fā)的一個(gè)人月軟件開(kāi)發(fā)的指導(dǎo)價(jià)約8000元,即一個(gè)人月的軟件價(jià)格就可以購(gòu)買(mǎi)20G左右的硬盤(pán)。即使有5萬(wàn)行數(shù)據(jù)的庫(kù)表,每個(gè)記錄壓縮40字符的冗余,單純計(jì)算合計(jì)也不足2M,即節(jié)省0.6元錢(qián)的磁盤(pán)空間。?
今天的世界已進(jìn)入軟件主導(dǎo)的計(jì)算機(jī)時(shí)代。因此,最容易理解、應(yīng)用開(kāi)發(fā)工作量最少、維護(hù)最簡(jiǎn)單的數(shù)據(jù)庫(kù)結(jié)構(gòu)才是最好的。只要數(shù)據(jù)完整性、一致性不受威脅,有些冗余,不足為慮。換言之,最節(jié)省軟件成本 (而不是硬件成本) 的是最好的。?
3. 信息隱蔽?
這是軟件工程最重要的基本原則之一。簡(jiǎn)言之即信息的作用域越小越好,數(shù)據(jù)庫(kù)的透明度越大越好,因?yàn)閼?yīng)用程序需要知道得越多就越復(fù)雜。使數(shù)據(jù)庫(kù)黑盒化 (透明度高) 的方法很多,除了設(shè)計(jì)上的局部化處理外,還可以利用 DBMS 的觸發(fā)器、存儲(chǔ)過(guò)程、函數(shù)等,把數(shù)據(jù)庫(kù)中無(wú)法簡(jiǎn)化的復(fù)雜表關(guān)系封裝到黑盒子里,隱藏起來(lái),特別是放到服務(wù)器端,其優(yōu)越性更是多方面的。
posted on 2006-08-25 14:40
黑咖啡 閱讀(260)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
Design