張 博,李亞芬,王 普
(北京工業(yè)大學(xué)電子信息與控制工程學(xué)院,北京100124)
模型驅(qū)動架構(gòu) (model driven architecture,MDA)[1]是由對象管理組織 (object management group,OMG)提出的一個(gè)軟件開發(fā)過程和方法,它定義了平臺無關(guān)模型 (platform independent model,PIM)和平臺相關(guān)模型 (platform specific model,簡稱PSM),其核心思想是以模型作為整個(gè)軟件開發(fā)過程的中心,根據(jù)不同的開發(fā)階段,使用不同抽象層次的模型對系統(tǒng)進(jìn)行分析、提煉和獲取相關(guān)的信息,如圖1所示。
MDA的思想是將系統(tǒng)中的元素都看作一個(gè)模型或者一個(gè)模型元素,并且它們可以依照相關(guān)規(guī)范進(jìn)行組合,在更高的層次上實(shí)現(xiàn)軟件的復(fù)用。這種開發(fā)模式的優(yōu)勢主要體現(xiàn)在,模型貫穿于整個(gè)軟件開發(fā)過程中,需求變更首先會體現(xiàn)在模型的變化上,而代碼也是由模型自動生成的,所以這種開發(fā)模式不但可以提高軟件開發(fā)效率,還可以將模型作為后期維護(hù)與系統(tǒng)再開發(fā)的可靠依據(jù)??梢奙DA在一定程度上解決了傳統(tǒng)軟件開發(fā)所面臨的種種問題,旨在降低系統(tǒng)中業(yè)務(wù)與技術(shù)的耦合,提高了系統(tǒng)的可移植性和可維護(hù)性。
圖1 MDA設(shè)計(jì)模式
在設(shè)計(jì)一個(gè)Web系統(tǒng)時(shí),數(shù)據(jù)庫的建設(shè)是一個(gè)重要部分。傳統(tǒng)的數(shù)據(jù)庫的設(shè)計(jì)方法是直接建立ER模型 (entityrelation模型,ER模型)來描述系統(tǒng),如采用PowerDesigner等工具。由此方法可以靈活地創(chuàng)建健壯的數(shù)據(jù)模型,但是它沒有采用面向?qū)ο蟮募夹g(shù)對系統(tǒng)進(jìn)行描述,忽略了軟件系統(tǒng)的業(yè)務(wù)因素和需求對數(shù)據(jù)的影響,直接根據(jù)需求分析得到數(shù)據(jù)庫模型,由于跨度比較大,容易造成設(shè)計(jì)的數(shù)據(jù)庫與客戶所需要的模型有較大的出入[2]。而面向?qū)ο蟮慕7椒梢詮男枨蠓治龅慕嵌瘸霭l(fā),循序漸進(jìn)地構(gòu)造模型,即從需求分析得到UML模型,再經(jīng)過轉(zhuǎn)換得到數(shù)據(jù)庫模型,這種建模方法不易產(chǎn)生設(shè)計(jì)人員與客戶之間對數(shù)據(jù)庫理解的差異。
本文針對以上問題,提出一種基于元模型的UML模型到數(shù)據(jù)庫模型的轉(zhuǎn)換方法。采用MDA思想,在建立系統(tǒng)面向?qū)ο蟮腢ML模型的同時(shí),將模型中的關(guān)聯(lián)關(guān)系、約束等信息提取出來進(jìn)行抽象描述,再通過ATL自動地轉(zhuǎn)換成數(shù)據(jù)庫模型。
模型是MDA的核心。在UML中,可以使用類、屬性、關(guān)聯(lián)、狀態(tài)等元素描述一個(gè)完整的軟件系統(tǒng)。模型是系統(tǒng)的抽象,它比實(shí)現(xiàn)系統(tǒng)更容易獲取、理解和計(jì)算,確定一個(gè)將要在PIM到PSM的轉(zhuǎn)換中使用到的元模型是一個(gè)艱巨的任務(wù)。不同層面的模型間的相互關(guān)系是符合元模型機(jī)構(gòu)(meta object facility,MOF)標(biāo)準(zhǔn)的。MOF元對象設(shè)施是OMG組織提出的一個(gè)標(biāo)準(zhǔn),它是自描述的,所有的建模語言 (如UML等)都是MOF的實(shí)例。
模型不僅僅是帶標(biāo)記的導(dǎo)向圖,還包括一些基于元模型的精確描述和附加屬性。從元模型的觀點(diǎn)來看,PIM和PSM都沒有一個(gè)唯一的元模型,模型轉(zhuǎn)換就是將一種元模型中所定義的元類轉(zhuǎn)換到另一種元模型定義的元類上。
本文以Web信息管理系統(tǒng)為例來說明UML模型到關(guān)系數(shù)據(jù)庫模型的轉(zhuǎn)換。在MDA框架下模型轉(zhuǎn)換系統(tǒng)首先建立用UML類圖描述的PIM,由UML的基本元素:類、屬性、屬性類型、關(guān)聯(lián)關(guān)系、繼承關(guān)系等構(gòu)成。之后細(xì)化PIM模型的操作,再轉(zhuǎn)化為關(guān)系數(shù)據(jù)庫類型的PSM模型。具體的轉(zhuǎn)換規(guī)則就是將上述的映射規(guī)則定義成可操作的代碼,通過轉(zhuǎn)換引擎調(diào)用這些規(guī)則進(jìn)行模型的轉(zhuǎn)換。最后將PSM模型輸入到代碼生成器中,用戶就可以得到所需要的數(shù)據(jù)庫操作代碼,具體流程如圖2所示。
圖2 模型轉(zhuǎn)換系統(tǒng)流程
當(dāng)前MDA正處于發(fā)展階段,模型轉(zhuǎn)換方法有很多種。例如:手動轉(zhuǎn)換方法 (人為地對源模型中的元素進(jìn)行轉(zhuǎn)換,得到目標(biāo)模型)、基于規(guī)則的模型轉(zhuǎn)換[3]、基于模板的代碼生成技術(shù) (例如AndroMDA)、基于關(guān)系代數(shù)的模型轉(zhuǎn)換(將模型轉(zhuǎn)換表達(dá)為一個(gè)二元關(guān)系或者一組二元關(guān)系)[4]、基于元模型映射的模型轉(zhuǎn)換 (進(jìn)行M1層模型轉(zhuǎn)換時(shí),以M2層的模型元素的映射作為轉(zhuǎn)換規(guī)則來執(zhí)行轉(zhuǎn)換)[5]、基于模式的模型轉(zhuǎn)換[6]、以及基于模型編織技術(shù)[7]等。
本文在研究基于MDA的UML模型到數(shù)據(jù)庫模型的轉(zhuǎn)換中,使用的轉(zhuǎn)換是以元模型為基礎(chǔ)的,采用Atlas轉(zhuǎn)換語言進(jìn)行轉(zhuǎn)換。
Atlas屬于開源的項(xiàng)目,其轉(zhuǎn)換框架如圖3所示。
圖3 Atlas轉(zhuǎn)換框架
圖3 中的每個(gè)元素在MDA中都起著重要的作用。MOF是建立元模型的過程中行之有效的元元模型。PIM反映了系統(tǒng)的功能、結(jié)構(gòu)和行為。PSM則更加注重實(shí)現(xiàn),是對應(yīng)于給定平臺的PIM的一個(gè)模型描述。源模型和目標(biāo)模型是符合這些元模型的模型實(shí)例。模型轉(zhuǎn)換是通過一個(gè)轉(zhuǎn)換引擎執(zhí)行轉(zhuǎn)換規(guī)則來完成的,轉(zhuǎn)換規(guī)則制定如何從源模型生成目標(biāo)模型[8]。一個(gè)完整的Atlas模型轉(zhuǎn)換程序需要4個(gè)文件:源元模型a、目標(biāo)元模型b、源模型、模型轉(zhuǎn)換實(shí)例。通過轉(zhuǎn)換生成的模型就是我們得到的目標(biāo)模型。
通過上面的論述,只有在定義了完整的源元模型、目標(biāo)元模型、模型轉(zhuǎn)換規(guī)則和源模型的基礎(chǔ)上,才能得到目標(biāo)模型。因此,下面將逐一對上述模型進(jìn)行分析與設(shè)計(jì),并通過實(shí)例進(jìn)行描述。
依據(jù)元模型自描述的特征,本文用UML類圖來描述UML元模型。模型包括類、數(shù)據(jù)類型、屬性、操作、關(guān)聯(lián)等基本元素[9]。模型中的Class類和DataType類均繼承自抽象類Classifier,其中最主要的類是Class類,它包括一組Attribute類型的屬性,一組Operation類型的操作以及類之間的關(guān)聯(lián)關(guān)系集合。類DataType為原始的建模數(shù)據(jù)類型,如圖4所示。
圖4 UML元模型
上述UML元模型是對系統(tǒng)的抽象描述,提取了系統(tǒng)中的類和關(guān)系。本文將針對北京市重點(diǎn)學(xué)科系統(tǒng)進(jìn)行分析,依照UML元模型,建立其具體的模型描述。該系統(tǒng)中主要包含如部門Depart、部門主管Authority、學(xué)科Category、學(xué)科主管Director、一級學(xué)科One_dpl、二級學(xué)科Two_dpl等多個(gè)對象,每個(gè)對象擁有自己的屬性,對象之間存在一對多,多對多等關(guān)聯(lián)關(guān)系,例如一個(gè)部門有一到多個(gè)主管,多個(gè)部門可以對應(yīng)多個(gè)學(xué)科、一級學(xué)科包含多個(gè)二級學(xué)科等等,這種關(guān)聯(lián)關(guān)系用直線描述,在直線兩端的數(shù)字表示數(shù)量關(guān)系。同時(shí),在UML模型的Operation中加入CHECK操作對對象的屬性進(jìn)行約束,這樣可以限制其取值范圍或格式。源模型的UML模型如圖5所示。
如圖6所示,本文研究的目標(biāo)是自動生成數(shù)據(jù)庫模型,因此目標(biāo)元模型的設(shè)計(jì)就是數(shù)據(jù)庫元模型。關(guān)系數(shù)據(jù)庫元模型也是由UML模型中的類進(jìn)行描述的。在這個(gè)模型中的5個(gè)主要類別:表,列,鍵,外鍵和SQL數(shù)據(jù)類型。它們對應(yīng)到數(shù)據(jù)庫中的相應(yīng)元素。主要的類是Table類,代表數(shù)據(jù)庫的表,它包括一組列Column和對鍵Key的引用,Column通過鍵Key定義數(shù)據(jù)庫的外鍵關(guān)系。列Column具有對數(shù)據(jù)類型SQLDataType的引用,表示列中數(shù)據(jù)所使用的數(shù)據(jù)類型。
2.4.1 總體設(shè)計(jì)
在設(shè)計(jì)了上述兩個(gè)元模型的基礎(chǔ)上,定義這兩個(gè)模型之間的映射關(guān)系,即UML到數(shù)據(jù)庫模型的映射。圖7顯示了從UML元模型到數(shù)據(jù)庫元模型的完整映射。映射通過一組規(guī)則,指定源元模型 (即UML元模型)中的各個(gè)元素映射到目標(biāo)元模型 (即數(shù)據(jù)庫元模型)中各個(gè)元素[10]。在圖中,兩個(gè)元模型的映射使用圖形符號“○”來表示,UML元模型在左側(cè),映射在中間,數(shù)據(jù)庫元模型在右側(cè)。此圖形符號包含以下內(nèi)容:連接 (源和目標(biāo)),關(guān)聯(lián)關(guān)系,轉(zhuǎn)換規(guī)則和組成。一個(gè)連接表示一個(gè)或多個(gè)元模型元素之間的轉(zhuǎn)換規(guī)則。轉(zhuǎn)換規(guī)則將元模型通過轉(zhuǎn)換,得到適當(dāng)?shù)哪繕?biāo)元模型中的元素。最后,使用Atlas模型轉(zhuǎn)換語言來對上述的轉(zhuǎn)換規(guī)則進(jìn)行編寫,便得到轉(zhuǎn)換規(guī)則的代碼描述,.atl為文件后綴。如圖7所示。
圖5 系統(tǒng)源模型
2.4.2 轉(zhuǎn)換規(guī)則設(shè)計(jì)
基于對應(yīng)用程序或數(shù)據(jù)庫的需求,模型會不斷的變化,因此很有必要在UML模型和數(shù)據(jù)庫模型之間建立映射規(guī)則,確保當(dāng)發(fā)生需求變更時(shí),僅需要對源模型進(jìn)行修改,即可自動體現(xiàn)在目標(biāo)模型上。
本文將規(guī)則設(shè)計(jì)為兩部分:直接映射規(guī)則和間接映射規(guī)則。直接映射規(guī)則代表的是轉(zhuǎn)換過程中無需進(jìn)行操作,直接生成對應(yīng)的模型元素,主要包括4個(gè)方面。
(1)主鍵 (FK):對象標(biāo)識符映射為數(shù)據(jù)庫主鍵,
所有的外鍵都設(shè)計(jì)為對主鍵的引用。
(2)數(shù)據(jù)類型 (DataType):UML元模型中的
DataType代表了在類圖中所定義的屬性的數(shù)據(jù)類型,它映射到數(shù)據(jù)庫元模型中,就轉(zhuǎn)換成數(shù)據(jù)庫中的數(shù)據(jù)類型,即SQLDataType。
(3)列 (Column):UML模型中的屬性映射為數(shù)據(jù)
庫中的列,屬性的數(shù)據(jù)類型即數(shù)據(jù)庫中的SQLData-Type。
(4)約束:UML模型中的Operation操作中定義的
對屬性的約束,將會映射為數(shù)據(jù)庫中列的約束,CHECK在數(shù)據(jù)庫中可以約束該列設(shè)定值的取值范圍及格式。
間接映射規(guī)則代表的是無法由UML模型直接生成目標(biāo)模型元素。需要在對映射元素進(jìn)行判斷后執(zhí)行規(guī)則,間接映射主要涉及到兩個(gè)主要方面:類的映射和關(guān)聯(lián)關(guān)系的映射。
(1)類的映射:將類映射為關(guān)系數(shù)據(jù)庫中的表時(shí),需要對類之間的繼承關(guān)系進(jìn)行分析處理。繼承關(guān)系的處理方法取決于在數(shù)據(jù)庫中怎樣組織類中被繼承的屬性。首先,將所有的類都映射為數(shù)據(jù)庫中的表。這種方法為每個(gè)超類和子類都創(chuàng)建一張表,這些表共享一個(gè)公共的主鍵。如果存在繼承關(guān)系,則將超類的屬性下移,每個(gè)子類對應(yīng)的數(shù)據(jù)庫表中既包含該子類中的屬性,也包含該子類所繼承的屬性。超類不映射為數(shù)據(jù)庫表,這樣就減少了數(shù)據(jù)庫表的數(shù)量,訪問速度有所提升。
(2)關(guān)聯(lián)關(guān)系的映射:數(shù)據(jù)庫模型中的關(guān)系是通過Key來描述的。Foreign Key是在一張表中出現(xiàn)的一個(gè)或多個(gè)數(shù)據(jù)屬性,它是另一張Table的Key的一部分,或者是另一張Table的Key。Foreign Key讓一張表中的一行與另一張表中的一行相關(guān)起來。如果要實(shí)現(xiàn)一對一或者一對多的關(guān)系,只需要將一張Table包含另一張Table的Key。
在模型轉(zhuǎn)換的過程中,我們在源模型中定義了一個(gè)參數(shù)MultiValue,如果MultiValue=ture,那么表示該表和其他表具有一對多或者多對多的關(guān)系,如果沒有此參數(shù),則表示該表和其他表僅是一對一的關(guān)系,在轉(zhuǎn)換規(guī)則中將分別對這些轉(zhuǎn)換進(jìn)行定義[11]。
下面以學(xué)科管理Web應(yīng)用系統(tǒng)中的單位機(jī)構(gòu)和學(xué)科門類為例來說明關(guān)聯(lián)關(guān)系的映射:
多對多關(guān)聯(lián)的映射:鑒于數(shù)據(jù)庫的3個(gè)范式,多對多關(guān)聯(lián)的實(shí)現(xiàn)并不能用兩張表來進(jìn)行實(shí)現(xiàn),因此需要建立一張關(guān)聯(lián)表。關(guān)聯(lián)表是一張獨(dú)立的表,它用于在關(guān)系數(shù)據(jù)庫中維護(hù)兩張或多張表之間的關(guān)聯(lián)。在關(guān)系數(shù)據(jù)庫中,關(guān)聯(lián)表中包含的屬性是關(guān)系中涉及到的表中的鍵的組合。關(guān)聯(lián)表的名字是它所關(guān)聯(lián)的表的名字的組合,或者是它實(shí)現(xiàn)的關(guān)聯(lián)的名字。圖8說明了如何在關(guān)系數(shù)據(jù)庫中實(shí)現(xiàn)多對多的關(guān)聯(lián)關(guān)系。
圖8 多對多關(guān)聯(lián)的映射
一對多關(guān)聯(lián)的映射映射:如圖9所示,在實(shí)現(xiàn)一對多關(guān)聯(lián)時(shí),設(shè)置MultiValue=ture,將外鍵Foreign Key放置在“多”的一方,角色作為外鍵屬性名的一部分。外鍵的空與非空由對1的強(qiáng)制性決定。
圖9 一對多關(guān)聯(lián)的映射
針對圖7列出的映射關(guān)系對照圖,采用Atlas轉(zhuǎn)換語言對其一一進(jìn)行描述,得到轉(zhuǎn)換規(guī)則代碼。由于篇幅所限,這里給出模型轉(zhuǎn)換的代碼片段:
module UML2Database;
create OUT:Database from IN:UML;
rule Class2Table;
rule DataTypeAttribute2Column{
from
a:UML!Attribute(
a.type.oclIsKindOf (UML! DataType ) and not a.multiValued
)
to
out:Database!Column(
name< - a.name,
type<-a.type
)}…
…
rule Attribute2Column{
from
a:Class!Attribute(
a.type.oclIsKindOf(Class!Class)and not a.multi Valued
)
to
out:Relational!Column(
name < - a.name+ 'Id',
type<-thisModule.objectIdType
)}
通過執(zhí)行轉(zhuǎn)換規(guī)則,源模型按照相關(guān)映射關(guān)系,得到了目標(biāo)模型,即數(shù)據(jù)庫模型,它是XMI格式描述的,用UML圖形化表示后,如圖10所示。
由UML設(shè)計(jì)的源模型經(jīng)過ATL轉(zhuǎn)換,得到了數(shù)據(jù)庫目標(biāo)模型。它們分別用數(shù)據(jù)庫的表,列,主鍵,外鍵來描述整個(gè)系統(tǒng),是一個(gè)完整的數(shù)據(jù)庫系統(tǒng)。對于源模型中的多重關(guān)系,生成了新的關(guān)聯(lián)關(guān)系表,用名稱_名稱表示,里面包含關(guān)聯(lián)的基本信息。由生成的目標(biāo)模型可以看出,UML類圖中的每個(gè)元素均按照對應(yīng)的轉(zhuǎn)換規(guī)則進(jìn)行轉(zhuǎn)換。源模型中存在5個(gè)關(guān)聯(lián),因此生成了5個(gè)關(guān)聯(lián)關(guān)系表。
U M L對象模型在本質(zhì)上只是一個(gè)擴(kuò)展的實(shí)體-關(guān)系(ER)模型,它強(qiáng)調(diào)的是面向?qū)ο蟮挠^點(diǎn),同時(shí),ER模型現(xiàn)在已被普遍接受,所以在面向?qū)ο蟮脑O(shè)計(jì)中,U M L使得軟件和數(shù)據(jù)庫使用相同的模型一起工作,保證了系統(tǒng)的一致性設(shè)計(jì)。本文探討了在MDA中使用建立數(shù)據(jù)庫模型的方法,分析了在元模型的基礎(chǔ)上UML模型與關(guān)系數(shù)據(jù)庫模型之間的映射關(guān)系,并使用Atlas轉(zhuǎn)換語言對其進(jìn)行代碼級的描述。在下一步工作中,應(yīng)考慮更多模型的復(fù)雜性,不斷完善模型間的映射關(guān)系,進(jìn)一步提高模型轉(zhuǎn)換的精度和完整性,針對更多業(yè)務(wù)領(lǐng)域編寫相關(guān)的模型及模型轉(zhuǎn)換實(shí)例。
圖10 目標(biāo)數(shù)據(jù)庫模型
[1]Joaquin Miller,Jishnu Mukerji.MDA guide version 1.0.1 [EB/OL ].http://www.omg.org/cgi-bin/doc? omg/03-06-01,2003.
[2]XIONG Xinfu.Research of relational database modeling based on UML[D].Chengdu:University of Electronic Science and Technology of China,2011(in Chinese).[熊信富.基于UML的關(guān)系數(shù)據(jù)庫建模研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué).2011.]
[3]ZHANG Zheng,HE Keqing.A rule-based model transformation method [J].Application Research of Computers,2005,22(10):16-19(in Chinese).[張征,何克清.一種基于規(guī)則的模型轉(zhuǎn)換方法 [J].計(jì)算機(jī)應(yīng)用研究,2005,22(10):16-19.]
[4]JIANG Lu.MDA-based transformation between UML models[D].Xi’an:Xidian University,2009:1-23(in Chinese).[蔣璐.基于MDA的UML模型轉(zhuǎn)換[D].西安:西安電子科技大學(xué),2009:1-23.]
[5]Tihomir Calic.Exploration of model driven architecturecapabi-lities via comparative utilization of MDA tools[D].Reno:University of Nevada,2006.
[6]ZHAO Ping.Research of the model transformation technology in MDA [D].Harbin:Harbin Engineering University,2010:3-17(in Chinese).[趙萍.模型驅(qū)動系統(tǒng)中模型轉(zhuǎn)換技術(shù)的研究[D].哈爾濱:哈爾濱工程大學(xué),2010:3-17.]
[7]Fabro MDD,Jouault F.Model transformation and weaving in the AMMA platform [C]//Proc of the Generative and Trans.Techniques in Software Engineering,2005:71-77.
[8]Jos'e Barranquero Tolosa,Oscar Sanju'an-Mart'lnez.Towards the systematic measurement of ATL transformation mo-dels[J].Software– Practice and Experience,2011,41(7):789-815.
[9]France R B.Model-driven development using UML 2.0:promises and pitfalls[J].Computer,2006,39(2):59-66.
[10]Jesus M Alemndros,Luis Iribarne.UML modeling of user and database interaction [J].The Computer Journal,2009,52(3):348-367.
[11]Pontus Bostr,Mats Neovius,Ian Oliver,et al.Formal transformation of platform independent models into platform specific models[C]//Abo Akademi University,Department of Information Technologies Turku Centre for Computer Science,2007.