摘要:對(duì)實(shí)現(xiàn)了一個(gè)從關(guān)系數(shù)據(jù)庫到XML Schema文檔的轉(zhuǎn)換過程進(jìn)行了詳細(xì)的研究。通過將數(shù)據(jù)庫的結(jié)構(gòu)及數(shù)據(jù)提取為XML格式,數(shù)據(jù)庫的結(jié)構(gòu)和數(shù)據(jù)變得清晰明了,非常適合于網(wǎng)絡(luò)上的信息交換。在將XML數(shù)據(jù)寫入數(shù)據(jù)庫的過程中,考慮到了數(shù)據(jù)庫結(jié)構(gòu)的有關(guān)約束,以保證數(shù)據(jù)庫信息的正確更新。
關(guān)鍵詞: 異構(gòu)數(shù)據(jù)庫集成;數(shù)據(jù)交換;XML
中圖分類號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)26-1637-03
A Study of Database Exchange Technology in Isomeric Data Ware Based on XML
ZHANG Chi
(School of Software Engineering of Southeast University, Nanjing 210009, China)
Abstract: This paper studies the convert process from relation database to XML Schema document in detail. Through converting data base strut and data to XML schema, the strut of data base and data become clear, and fits for transmitting in net. Through the process from writing XML data to database, and considering the constraints in database, it ensures the information in database to renew correct.
Key words: isomeric data; ware data exchange; XML
在Internet的發(fā)展過程中,數(shù)據(jù)庫技術(shù)得到了廣泛的應(yīng)用。隨著商務(wù)網(wǎng)站之間電子商務(wù)的發(fā)展,異構(gòu)數(shù)據(jù)庫間的數(shù)據(jù)交互日益頻繁,新興的可擴(kuò)展標(biāo)記語言逐步展現(xiàn)了其在數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)交換等領(lǐng)域的顯著優(yōu)勢(shì),迅速成為一個(gè)與平臺(tái)無關(guān)、廠商無關(guān)的數(shù)據(jù)格式標(biāo)準(zhǔn)。通過為各商務(wù)網(wǎng)站現(xiàn)有的不同數(shù)據(jù)庫系統(tǒng)提供一個(gè)XML接口,外界就可以借助XML實(shí)現(xiàn)對(duì)任何平臺(tái)下的現(xiàn)有數(shù)據(jù)庫的訪問,并將訪問結(jié)果以XML的形式輸出到其它平臺(tái),從而實(shí)現(xiàn)了異構(gòu)數(shù)據(jù)庫間的信息交換。
1 XML技術(shù)介紹
XML (Extensible Markup Language,可擴(kuò)展標(biāo)記語言)是由W3C(World Wide Web Consortium)組織于1998年2月制定的一種通用語言規(guī)范,它是專門為Web應(yīng)用程序而設(shè)計(jì)的SGML的簡(jiǎn)化子集。XML作為一種可擴(kuò)展性標(biāo)記語言,其自描述性使其非常適用于不同應(yīng)用間的數(shù)據(jù)交換,而這種交換不是以預(yù)先規(guī)定一組數(shù)據(jù)結(jié)構(gòu)定義為前提的。XML最大的優(yōu)點(diǎn)在于它的數(shù)據(jù)描述和傳送能力,因此具備很強(qiáng)的開放性[1-2]。
2 關(guān)系數(shù)據(jù)庫與XML之間的映射方法
根據(jù)映射關(guān)系的建立方式不同,我們可以得到兩種數(shù)據(jù)轉(zhuǎn)換方法:基于模板驅(qū)動(dòng)的轉(zhuǎn)換方法和基于模型驅(qū)動(dòng)的轉(zhuǎn)換方法。
2.1 基于模板驅(qū)動(dòng)的映射方法
基于模板的映射方法并不事先定義好XML文檔與其他數(shù)據(jù)之間的映射關(guān)系,而是在XML文檔中嵌入帶參數(shù)的SQL命令。這些命令在轉(zhuǎn)換過程中被系統(tǒng)所識(shí)別和執(zhí)行,執(zhí)行的結(jié)果被替換到指令所在的位置,從而生成目標(biāo)XML文檔,并用數(shù)據(jù)傳輸諸如中間件等實(shí)體軟件進(jìn)行處理。圖1給出了基于模板轉(zhuǎn)換的流程圖。
基于模板的轉(zhuǎn)換方法的好處在于轉(zhuǎn)換的步驟比較簡(jiǎn)單,只要給出模板,就可以快速地生成相應(yīng)的XML文檔。不足之處在于,基于模板驅(qū)動(dòng)的映射是一種淺層映射,以XML內(nèi)嵌的SQL執(zhí)行的數(shù)據(jù)結(jié)果集為依據(jù),不涉及數(shù)據(jù)庫賴以存在的關(guān)系模式,它只是將關(guān)系數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為XML文檔,并沒有提取出關(guān)系模式,它舍棄了關(guān)系模式的種種約束條件,因此對(duì)于反向的轉(zhuǎn)換更是無能為力。值得注意的是,當(dāng)前諸如Microsoft SQL Server 2000等大多的產(chǎn)品都屬于模板映射。
2.2 基于模型驅(qū)動(dòng)的映射方法
基于模型驅(qū)動(dòng)的映射,當(dāng)把數(shù)據(jù)從數(shù)據(jù)庫傳送到XML文檔或把數(shù)據(jù)從XML文檔傳送到數(shù)據(jù)庫時(shí),不是僅僅依賴內(nèi)嵌SQL命令,而是用一個(gè)具體的模型實(shí)現(xiàn)的?;谀P偷霓D(zhuǎn)換方法用這個(gè)事先定義好的數(shù)據(jù)模型來映射XML與關(guān)系數(shù)據(jù)庫數(shù)據(jù)之間的關(guān)系。圖2給出了基于模型驅(qū)動(dòng)的轉(zhuǎn)換方法的架構(gòu)圖。
基于模型的轉(zhuǎn)換方法的關(guān)鍵在于設(shè)計(jì)一個(gè)靈活的映射模型,為了更好的支持其雙向映射的特點(diǎn),這個(gè)映射模型必須是易于“讀懂”的、易于操縱的,能夠很好的表達(dá)關(guān)系數(shù)據(jù)庫的各種約束。關(guān)系數(shù)據(jù)庫的理論依據(jù)是關(guān)系模型,而 XML文檔的依據(jù)是XML Schema或DTD等。
3 關(guān)系數(shù)據(jù)庫到XML的映射技術(shù)
3.1 關(guān)系模式映射為XML模式
在將關(guān)系模式映射為XML模式時(shí),由兩條路線組成,第一條路線是得到XML Schema首先需要從具體的關(guān)系數(shù)據(jù)庫中反求出關(guān)系模式,再根據(jù)關(guān)系模式重構(gòu)其有向圖,由有向圖將再生成映射的結(jié)構(gòu),根據(jù)映射結(jié)構(gòu)和有向圖將將關(guān)系模式映射為XML Schema;第二條路線是根據(jù)得到的Schema從關(guān)系數(shù)據(jù)庫中提取數(shù)據(jù)嵌入XML事例文檔。整個(gè)流程如圖3所示。
3.2 關(guān)系模式的提取和重構(gòu)
由圖3表達(dá)的流程圖可以看出,由具體的關(guān)系數(shù)據(jù)庫提取出關(guān)系模式是整個(gè)算法實(shí)現(xiàn)的前提。關(guān)系模式的提取是從關(guān)系數(shù)據(jù)庫中反求出來的。
關(guān)系的重構(gòu)主要是各種約束重構(gòu)。約束重構(gòu)包括實(shí)體完整性約束、參照完整性約束和用戶自定義完整性約束,其中用戶自定義完整性約束大部分己在屬性重構(gòu)中建立,即列約束節(jié)點(diǎn)。實(shí)體完整性指的是主鍵約束。參照完整性指的是外鍵約束,外鍵是表中的一列或多列對(duì)應(yīng)參照引用表中主鍵的列,一個(gè)表可能沒有外鍵,也可能有多個(gè)外鍵。約束重構(gòu)的算法步驟如下:1)建立主鍵約束。2)建立外鍵約束。3)建立唯一鍵或唯一索引約束[3]。
3.3 映射結(jié)構(gòu)
映射結(jié)構(gòu)即將關(guān)系模式映射為XML模式后,表與表、列與列之間的層次關(guān)系。用一棵帶父節(jié)點(diǎn)的二叉樹來表示。左孩子表示兄弟關(guān)系,右孩子表示嵌套關(guān)系,同一個(gè)節(jié)點(diǎn)的屬性與子元素按兄弟關(guān)系處理,父節(jié)點(diǎn)表示嵌套該節(jié)點(diǎn)的元素。因此所有的表可建立一棵二叉樹,表示它們之間的嵌套關(guān)系,對(duì)于扁平結(jié)構(gòu)轉(zhuǎn)換,它簡(jiǎn)化變成了一個(gè)鏈表。表內(nèi)的所有列也可建立一個(gè)這樣的二叉樹以表明嵌套關(guān)系[4]。
3.4 模式映射
3.2關(guān)系重構(gòu)結(jié)果樹和3.3映射結(jié)構(gòu)樹將作為模式映射的輸入,輸出的結(jié)果為XML Schema文檔。映射主要分為兩部分,一部分是結(jié)構(gòu)映射;另一部分完整性約束映射。其映射算法如下:
1)確定與XML Schema相關(guān)的全局變量,即XML Schema文檔根元素schema有關(guān)屬性值的確定,如目標(biāo)命名空間、命名空間等。
2)創(chuàng)建根元素,每個(gè)XML文檔有且僅有一個(gè)根元素,這里用數(shù)據(jù)庫名作為映射后的根元素。
3)建立表元素,表元素名稱與關(guān)系模式中的表名對(duì)應(yīng)相同,類型應(yīng)為復(fù)雜類型。
4)建立復(fù)雜類型。每一個(gè)復(fù)雜類型對(duì)應(yīng)一個(gè)表結(jié)構(gòu),實(shí)現(xiàn)了表結(jié)構(gòu)映射的相對(duì)獨(dú)立性。每個(gè)復(fù)雜類型包含的元素為表的各個(gè)列、及其嵌套的表。
5)列元素相關(guān)約束的映射。包括列的數(shù)據(jù)類型、是否為空、字符串長(zhǎng)度、數(shù)據(jù)精度、默認(rèn)值等。
6)一致性約束映射。即主鍵、唯一性約束、外鍵到XML Schema的映射。我們選擇后者映射主鍵、外鍵。
3.5 數(shù)據(jù)嵌入
通過完成表結(jié)構(gòu)映射和約束映射,就實(shí)現(xiàn)了關(guān)系模式到XML Schema的映射。根據(jù)映射的結(jié)果從數(shù)據(jù)庫中取出數(shù)據(jù)生成相應(yīng)的XML文檔。嵌入數(shù)據(jù)時(shí),很顯然要先嵌入上層元素的數(shù)據(jù),后嵌入下層元素的數(shù)據(jù),因此,這里可以按照映射結(jié)構(gòu)樹先序遍歷的順序,將關(guān)系數(shù)據(jù)庫表中的數(shù)據(jù)嵌入到XML文檔中。
3.6 數(shù)據(jù)分割
數(shù)據(jù)輸出包括兩部分:以XML格式所表示的各數(shù)據(jù)庫中的數(shù)據(jù)和格式文檔XMLSchema。分割后的XML文檔必須仍然能夠滿足XML文檔有效性和保持所存儲(chǔ)數(shù)據(jù)的不變性;分割后XML Schema必須依然保留關(guān)系模式的各種約束。
4 XML模式到關(guān)系模式的映射技術(shù)
4.1 映射的簡(jiǎn)要描述
3.3節(jié)將關(guān)系模式轉(zhuǎn)換為XML模式,而在本節(jié)將XML模式轉(zhuǎn)換為關(guān)系模式,關(guān)系模式在轉(zhuǎn)化前后必須保持一致。本節(jié)實(shí)現(xiàn)的轉(zhuǎn)換算法僅僅針對(duì)3.3節(jié)輸出的XML Schema模式,其轉(zhuǎn)換流程如圖4所示。
4.2 形式化描述
XML Schema是非常復(fù)雜的文檔,它描述了一個(gè)樹形結(jié)構(gòu)的XML事例文檔。根據(jù)Schema的特點(diǎn),我們用形式化的方法來描述它,步驟如下:
1)取根元素,對(duì)應(yīng)集合RE,在XML Schema中只允許定義一個(gè)根元素,它必須是Schema節(jié)點(diǎn)的子節(jié)點(diǎn),同其他全局元素不同的是它是一個(gè)復(fù)雜類型的元素節(jié)點(diǎn)。
2)取出復(fù)雜元素,對(duì)應(yīng)集合CE,遍歷Schema文檔,所有element節(jié)點(diǎn)的type屬性值不為XML基本數(shù)據(jù)類型,或者有complex Type子元素的element節(jié)點(diǎn)均是復(fù)雜元素的節(jié)點(diǎn),同時(shí)得到EE集合和EA集合。
3)取出簡(jiǎn)單元素,對(duì)應(yīng)集合SE,遍歷Schema文檔,所有element節(jié)點(diǎn)的type屬性值為XML基本數(shù)據(jù)類型,或者有simpleType子元素的element節(jié)點(diǎn)均是簡(jiǎn)單元素的節(jié)點(diǎn),同時(shí)取出其父元素名。
4)取出簡(jiǎn)單元素和屬性的定義。
5)取出主鍵、外鍵、唯一約束。
4.3 建立元素樹
XML Schema文檔用上述形式化表示為XS,其中RE, CE, SE, EE, EA五個(gè)部分包含了XML文檔的結(jié)構(gòu)。我們用元素樹來表示元素、屬性之間的關(guān)系,構(gòu)建元素樹的算法如下:
1)將RE中的根元素加入元素有向樹,將EA中根元素的屬性加入元素樹中,并在EE中將其子元素也加入元素樹,將其子元素加入到棧中。
2)從棧中取出元素,將EA中該元素的屬性加入到元素樹中,并將其子元素加入元素樹中,對(duì)第2步循環(huán)調(diào)用直到棧為空。元素樹清晰的表達(dá)了XML Schema文檔所描述的結(jié)構(gòu)
4.4 映射轉(zhuǎn)化
映射轉(zhuǎn)化分為3個(gè)步驟進(jìn)行:
首先,確定元素有向樹中哪些節(jié)點(diǎn)映射為表,哪些映射為表的列,根元素是數(shù)據(jù)庫的名稱,而其屬性是有關(guān)關(guān)系數(shù)據(jù)庫的一些描述。
其次,將XML Schema中的簡(jiǎn)單元素定義和屬性定義映射為列約束,包括數(shù)據(jù)類型映射和域值約束映射。
最后,主關(guān)鍵字約束、引用關(guān)鍵字約束、唯一鍵約束的映射,主關(guān)鍵字約束、唯一鍵約束對(duì)應(yīng)關(guān)系模式中的主鍵,引用關(guān)鍵字約束對(duì)應(yīng)關(guān)系模式中的外鍵。
4.5 SQL語句的生成
根據(jù)關(guān)系數(shù)據(jù)樹S就可以動(dòng)態(tài)合成SQL語句,其步驟如下:
1)合成創(chuàng)建表語句,找出各列的數(shù)據(jù)類型、默認(rèn)值、是否可以為空等條件;
2)根據(jù)關(guān)系模式R(PK)合成主鍵語句,保證關(guān)系模式的實(shí)體完整性;
3)根據(jù)關(guān)系模式R(FK)合成外鍵語句,保證關(guān)系模式的參照完整完性;
4)根據(jù)關(guān)系模式R(UI)合成唯一鍵,合成檢查語句,保證關(guān)系模式的用戶定義完整性。
4.6 XML文檔數(shù)據(jù)的錄入
解析XML數(shù)據(jù)文檔,根據(jù)Schema的映射結(jié)果,將數(shù)據(jù)合成SQL中的INSERT語句插入到數(shù)據(jù)庫中。至此XML模式已經(jīng)完整的轉(zhuǎn)化為關(guān)系模式,包括模式轉(zhuǎn)換和數(shù)據(jù)入庫兩部分。
5 結(jié)束語
基于XML的異構(gòu)數(shù)據(jù)庫之間的數(shù)據(jù)交換的順利實(shí)現(xiàn)表明XML作為一種中間件和數(shù)據(jù)承載工具,在數(shù)據(jù)交換領(lǐng)域作顯示了它強(qiáng)大的功能和方便的使用性,當(dāng)前,各個(gè)軟件廠家紛紛開始在自己的軟件產(chǎn)品中加入了對(duì)XML的不同程度的支持,而C# .net也不例外,它作為一種B/S模式下的開發(fā)工具具有許多特點(diǎn),尤其是它對(duì)XML的良好支持,使得它的應(yīng)用前景更加廣闊。
參考文獻(xiàn):
[1] Draper D, Halevy A, We1d D.The Nimble XML data integration system[A].17th Data Engineering International Conference[C], 2001:155-160.
[2] Banerjee S,Krishnamurthy V,Krishnaprasad M. Oracle8i-the XML enabled data management system[A].16th Data Engineering International Conference[C],2000:561-568.
[3] 葉華,張森.一種異構(gòu)數(shù)據(jù)庫間的XML接口方案[J].計(jì)算機(jī)應(yīng)用,2001,(6):33-37.
[4] 邱俊.如何有效利用DOM處理XML文檔[J].重慶工學(xué)院學(xué)報(bào),2002,(4):7-8.