- 相關(guān)推薦
對象模型的關(guān)系投影研究
摘要 本文在對象模型與關(guān)系模型區(qū)別的基礎(chǔ)上,介紹了將對象模型投影成關(guān)系模型的投影原理,并結(jié)合實例詳細(xì)論述了對象之間不同引用關(guān)系的不同投影以及繼承實體的三種不同投影方法。 關(guān)鍵詞 面向?qū)ο?nbsp; 數(shù)據(jù)模型 關(guān)系模型 投影 0 引言隨著我國軟件開發(fā)水平的提高,越來越多的軟件開發(fā)自覺地遵循軟件工程開發(fā)方法。在數(shù)據(jù)庫的開發(fā)中采用了很多軟件建;驍(shù)據(jù)建模工具,如Rational Rose、PowerDesigner等。這些建模工具在需求分析、系統(tǒng)分析以及設(shè)計,直至最終物理代碼的生成都提供了強(qiáng)大的功能,帶給數(shù)據(jù)庫開發(fā)人員很大的便利。同時由于面向?qū)ο蟮姆椒鼙容^直觀地描述現(xiàn)實系統(tǒng),便于建立的業(yè)務(wù)模型,便于開發(fā)過程中的交流,因此開發(fā)人員使用這些工具進(jìn)行需求分析、系統(tǒng)分析和設(shè)計的時候,一般也都建立對象模型。
建立起來的概念上的對象模型,其物理實現(xiàn)可以有兩種,一種是對象數(shù)據(jù)庫,一種是關(guān)系數(shù)據(jù)庫。由于關(guān)系數(shù)據(jù)庫更加成熟,并且占主導(dǎo)地位,所以大多開發(fā)人員會選擇用關(guān)系數(shù)據(jù)庫來實現(xiàn)設(shè)計出的對象模型。這樣,在用對象模型分析與設(shè)計完成后,開發(fā)人員不得不將對象模型轉(zhuǎn)換成關(guān)系模型[1];而在此數(shù)據(jù)庫之上的數(shù)據(jù)操作也不得不改為針對關(guān)系模型,而不是概念層上的對象模型,這就使得設(shè)計與實現(xiàn)形成了一條鴻溝。為了填平這條鴻溝,使數(shù)據(jù)庫上層開發(fā)人員還能夠針對對象模型進(jìn)行數(shù)據(jù)操作,就需要開發(fā)一個轉(zhuǎn)換層,用來屏蔽掉對象模型與關(guān)系數(shù)據(jù)庫之間的這種轉(zhuǎn)換,該層的實現(xiàn)就稱為對象模型的關(guān)系實現(xiàn)。
對象模型的關(guān)系實現(xiàn)包括兩方面的:一個是模型上的轉(zhuǎn)換,稱為“模型投影”,即將對象模型轉(zhuǎn)換成關(guān)系模型;另一個是數(shù)據(jù)操作接口的轉(zhuǎn)換,即定義一個接口負(fù)責(zé)把對對象模型的操作轉(zhuǎn)換成對投影生成的關(guān)系模型的操作。本文重點(diǎn)介紹模型的投影方法,通過分析對象模型與關(guān)系模型的特點(diǎn),提出了一套對象模型在關(guān)系型數(shù)據(jù)庫上投影的具體方案。 1 投影原理分析
首先,我們比較一下對象模型和關(guān)系模型的主要概念。
表1給出了對象模型與關(guān)系模型基本概念的對照。從中可以看出對象模型與關(guān)系模型有較大的區(qū)別,對象模型許多概念在關(guān)系模型中沒有對應(yīng)的概念,即使有對應(yīng)的概念在實際投影時并不能簡單地一一對應(yīng)[2]。例如,一個實體并不能簡單地投影成一個關(guān)系表,因為關(guān)系模型中沒有實體之間的繼承關(guān)系,所以一個實體的定義可能被投影成多個表,也可能沒有關(guān)系表與之對應(yīng),如抽象實體。屬性也不能直接對應(yīng),當(dāng)對象模型中具有復(fù)雜數(shù)據(jù)類型時,一個屬性可能被投影成多個列。
對象模型中實體之間的聯(lián)系與關(guān)系模型中表之間的聯(lián)系也有本質(zhì)的區(qū)別。在對象模型中實體之間聯(lián)系使用“引用”方式在實體與實體之間建立比較緊密的耦合關(guān)系和比較的導(dǎo)航關(guān)系。例如,要指出某人所在單位領(lǐng)導(dǎo)的姓名,可以用person.department.master.name這種簡潔的方式直接獲得,但在關(guān)系模型中則要通過一組復(fù)雜的表之間的關(guān)聯(lián)查詢(利用外部鍵)才能得到。
對象模型向關(guān)系模型的投影有三個關(guān)鍵要素:
(1) 對象模型的描述規(guī)范
(2) 關(guān)系模型的描述規(guī)范
(3) 對象模型向關(guān)系模型投影的規(guī)則
我們在此不從語法上來定義對象模型,只給出對象模型的主要概念。在我們的對象模型中將應(yīng)用以下幾個概念:(1)實體、(2)屬性、(3)主標(biāo)識、(4)對象引用、(5)實例、(6)繼承、(7)方法、(8)對象標(biāo)識、(9)聚集、(10)類型定義、(11)唯一性規(guī)則、(12)Where規(guī)則。
關(guān)系模型中將應(yīng)用以下幾個概念:(1)表、(2)列、(3)行、(4)主鍵、(5)外部鍵
為了按對象進(jìn)行操作,需要建立一個數(shù)據(jù)字典,也稱為投影字典。投影字典由一組關(guān)系表構(gòu)成,在投影字典中要保存對象模型的完整描述。
2、基本內(nèi)容的投影
基本的投影包括簡單的對象模型向關(guān)系模型的轉(zhuǎn)換。具體有以下幾種:
(1)實體 一般投影成表。但只有一個獨(dú)立的實體,既沒有超類,也沒有子類,才投影成一個表。具有繼承關(guān)系的實體投影,將在第4節(jié)中介紹。由于投影規(guī)則選擇不同,當(dāng)一個實體投影成多個表時,不能保證可以用一個關(guān)系視圖來描述一個實體。
(2)屬性 對具有基本數(shù)據(jù)類型的屬性,投影成列。這需要在對象模型與關(guān)系模型的各種數(shù)據(jù)類型之間建立對應(yīng)關(guān)系;緮(shù)據(jù)類型指整型、實型、字符串、日期、時間、布爾。如果對象模型采用枚舉類型需要在關(guān)系模型中對列進(jìn)行取值范圍限定。其它復(fù)雜數(shù)據(jù)類型如聚集、結(jié)構(gòu)類型則需要采用專門的處理方法。
(3)主標(biāo)識、對象標(biāo)識。對象標(biāo)識在對象模型中并不需要明確地表示成對象的一個屬性,采用的方式是在每一個與實體對應(yīng)的關(guān)系表中都增加一個列,并把該列作為主鍵,數(shù)據(jù)類型為字符串,對象標(biāo)識的格式為:實體名+表中唯一序列號。之所以把對象標(biāo)識作為主鍵,是因為要把實體之間的引用采用以對象標(biāo)識作為主鍵/外部鍵來實現(xiàn)的。這樣原來的主標(biāo)識就不能投影成主鍵了。在有的關(guān)系數(shù)據(jù)庫中允許使用輔助鍵,如果沒有輔助建則只能對原來的主標(biāo)識投影成的列加上唯一性約束規(guī)則。
(4)實例 實例不屬于模型投影的內(nèi)容,但與投影的操作有密切關(guān)系。如果一個實體投影成多個表,則一個實例將由多個關(guān)系表的行構(gòu)成。這些行必須具有相同的對象標(biāo)識。
(5)聚集 如果聚集的元素類型是基本數(shù)據(jù)類型,可以考慮投影成二進(jìn)制類型。如果元素類型是實體類型,這實際上構(gòu)成了該實體與元素所指向?qū)嶓w之間多對多的引用關(guān)系,具體可參照第3節(jié)。
(6)類型定義 主要指自定義結(jié)構(gòu)類型,需要將結(jié)構(gòu)的域投影成單個的列。
(7)唯一性規(guī)則。轉(zhuǎn)換為關(guān)系表的唯一性約束規(guī)則,當(dāng)唯一性規(guī)則中包括的屬性投影成多列時,注意要將多個列均包括在關(guān)系表的唯一性約束定義中。
(8)Where規(guī)則 轉(zhuǎn)換成關(guān)系表的條件約束規(guī)則。
(9)名字轉(zhuǎn)換規(guī)則 實體名轉(zhuǎn)換成表名,屬性名轉(zhuǎn)換為列名,數(shù)據(jù)類型的域展開為列時,需要有一套名字轉(zhuǎn)換規(guī)則。
3、對象之間引用關(guān)系的投影[3]
如果從純粹的建模技術(shù)角度來看,對象之間的關(guān)系有以下幾種:
一對多關(guān)系
多對多關(guān)系
一對一關(guān)系
不管是哪一種關(guān)系在概念模型中都兩種情況,一種是依賴的,一種是獨(dú)立的。
為了方便敘述,我們定義了一個簡單的對象模型,圖2是該模型的實體關(guān)系圖(也稱為類圖),圖中的各實體只列出了主標(biāo)識中的屬性。圖中分別用不同的符號給出了繼承關(guān)系、多對多關(guān)系、依賴的一對多關(guān)系和獨(dú)立的一對多關(guān)系。
具體說明如下:實體Student和Teacher是Person的子類,繼承關(guān)系用一個三角形表示。一個系(Department)里有多個人(學(xué)生或老師),兩個實體間用實線連接表示引用關(guān)系,實心圓圈表示多的一端。一個系可以開設(shè)多門課(Course),一門課是依賴于系的,這就是說只知道課程名還不能確定這門課,還需要知道是哪個系開設(shè)的這門課。同樣是方法課,數(shù)學(xué)系開設(shè)的和計算機(jī)系開設(shè)的在難度上和內(nèi)容上會有很大區(qū)別。用箭頭表示依賴。一門課有多個學(xué)生選修,一個學(xué)生可以選修多門課程。
實體間不同的關(guān)系進(jìn)行投影是不同的。
(1)獨(dú)立的引用關(guān)系進(jìn)行投影,需要在“多”的一邊要產(chǎn)生一個外部鍵。如果實體Person投影對應(yīng)的表是T_Person,則表T_Person中要自動增加一個屬性DptName,作為外部鍵,對應(yīng)實體Department投影成的表T_Department的主鍵DptName。如果在繼承關(guān)系中Person要分解到多個子類表中,則這些子類表中都要生成這個對實體Department引用的外部鍵
(2)依賴的引用關(guān)系進(jìn)行投影,不僅需要在“多”的一邊產(chǎn)生一個外部鍵,而且還要把該外部鍵做為輔助鍵。例如實體Course投影成表T_Course時,不僅要生產(chǎn)一個外部鍵DptName,而且它的輔助鍵由兩個列組成:DptName和CourseName。注意,根據(jù)第2節(jié)對象標(biāo)識的投影規(guī)則,表T_Course的主鍵是對象標(biāo)識列。
(3)實體之間多對多的關(guān)系進(jìn)行投影,需要新建一個“交叉表”,該表專門記錄實體間多對多的這種聯(lián)系,原來的兩個實體表與新建的交叉表之間的關(guān)系是一對多的關(guān)系,這實際上把多對多關(guān)系變成兩個一對多關(guān)系。實體Cource和Student之間的多對多關(guān)系投影成表T_Course_Student,它有兩個列一個是Course_ID,一個是Student_ID,都是外部鍵,分別用來對表T_Course或T_Student進(jìn)行引用。
4 繼承關(guān)系的投影
繼承關(guān)系的投影是模型投影中的關(guān)鍵,對該問題的不同解決方案會到整個模型投影的設(shè)計。一般來講,在關(guān)系數(shù)據(jù)庫中實現(xiàn)繼承的方法可劃分為三類:
(1)合并法。合并法就是將整個類層次映射為單個關(guān)系表,表中保存所有類(基類、子類)的屬性。圖2中實體Person、Student、Teacher映射成一個表T_Person。如圖3所示,表中增加了一個屬性PersonID,由于對象標(biāo)識的格式是實體名+唯一序列值,通過它的前綴可以區(qū)分用一個實例屬于哪一個實體。 合并法實現(xiàn)繼承關(guān)系投影的優(yōu)點(diǎn)是實現(xiàn)簡單,操作方便,缺點(diǎn)是會產(chǎn)生大量的數(shù)據(jù)冗余。
(2)分解法 分解法就是將每個具體子類映射成單個關(guān)系表,超類的屬性將復(fù)制到各子類中。子類對應(yīng)的關(guān)系表包括自身的屬性和繼承的屬性,每個具體的子類包含各自的對象標(biāo)識。抽象的基類不參與映射。其中,Person由于是抽象類,未映射成數(shù)據(jù)庫表;而Student、Teacher映射為相應(yīng)的表,它們具有各自的主鍵。如圖4所示。
分解法的表中包含了具體子類的所有信息,操作實現(xiàn)簡單,但超類的修改會導(dǎo)致相對應(yīng)的表及其子類所對應(yīng)表的更改,這會增加保持?jǐn)?shù)據(jù)的完整性的復(fù)雜性。
(3)單表法 單表法為每一個類創(chuàng)建數(shù)據(jù)庫表,表中包含特定于該類的屬性和對象標(biāo)識。圖5所示,注意personID作為所有表的主鍵,它們之間是is-a的關(guān)系。
單表法與面向?qū)ο蟮母拍罹哂幸恢滦,支持多態(tài),易于修改基類和增加新的類。但數(shù)據(jù)庫中存在大量的關(guān)系表,加上表之間的關(guān)聯(lián)較多,會降低數(shù)據(jù)訪問效率。
以上三種方法各有優(yōu)缺點(diǎn),沒有一種是絕對完美的。因此,數(shù)據(jù)庫設(shè)計人員要根據(jù)模型的具體情況選擇繼承的投影方法。
5 結(jié)束語
本文介紹的對象模型的關(guān)系投影原理已經(jīng)用于多個項目的對象數(shù)據(jù)平臺的開發(fā)上,簡潔實用。由于對象模型到為止還沒有統(tǒng)一的標(biāo)準(zhǔn),因此對象模型向關(guān)系模型的投影規(guī)則要根據(jù)實際模型的定義來制定。在實際的投影規(guī)則定義中,名字的轉(zhuǎn)換規(guī)則、聚集的處理方式、對象之間的引用關(guān)系、繼承處理方式可以根據(jù)需要確定下來,也可以設(shè)計成多種方式并存,建立可控制的投影,這需要設(shè)計一整套投影規(guī)則元模型。建立一套可描述對象模型、關(guān)系模型、投影規(guī)則的形式語言規(guī)則和語法規(guī)則在上和上具有重要意義,這也是我們目前正在的重點(diǎn)。
【對象模型的關(guān)系投影研究】相關(guān)文章:
能力結(jié)構(gòu)與經(jīng)濟(jì)合作的關(guān)系模型研究10-23
戰(zhàn)略整合模型研究10-13
剩余收益模型與傳統(tǒng)DCF模型的比較研究07-07
超市商業(yè)智能模型研究10-05
對醫(yī)療市場博弈模型研究10-03
基于vc與word、outlook對象模型的email實現(xiàn)07-14