高 鵬,周 揚(yáng)△,萬文琦,焦煜媛
(1.甘肅省地震局蘭州觀象臺,甘肅 蘭州 730046;2.甘肅省地震局張掖中心地震臺,甘肅 張掖 734300)
近年來隨著地震的頻發(fā),各種用于震害評估的軟件系統(tǒng)也在不斷增多。數(shù)據(jù)庫在震害評估中廣泛應(yīng)用。但由于各個應(yīng)用系統(tǒng)的功能與應(yīng)用不同,所采用的硬件環(huán)境和軟件環(huán)境也不同,各種應(yīng)用系統(tǒng)構(gòu)建有各自獨(dú)立的服務(wù)器與數(shù)據(jù)庫。各種異構(gòu)數(shù)據(jù)源之間信息不能共享,從而形成了信息孤立。如何高效收集與集成各種數(shù)據(jù)庫之間的數(shù)據(jù)與共享成為目前急需解決的問題。本研究提出一種基于XML/VS.NET的關(guān)系數(shù)據(jù)庫集成方案,采用.NET提供的數(shù)據(jù)庫訪問中間件,實(shí)現(xiàn)異構(gòu)數(shù)據(jù)源之間的連接與訪問[1]。XML數(shù)據(jù)作為一種半結(jié)構(gòu)化的數(shù)據(jù)模型,在異構(gòu)數(shù)據(jù)集成方面具有很好的應(yīng)用,采用XML數(shù)據(jù)文件實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫之間的數(shù)據(jù)傳輸與交換[2]。
根據(jù)系統(tǒng)需求,需要實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫之間的數(shù)據(jù)抽取、轉(zhuǎn)換與集成。系統(tǒng)應(yīng)該具較好的適應(yīng)性和擴(kuò)展性,在不影響系統(tǒng)整體功能的前提下,應(yīng)該具有較高的穩(wěn)定性和較低的耦合性。按照多層架構(gòu)的模式將系統(tǒng)自上而下分為表現(xiàn)層、表示邏輯層、業(yè)務(wù)邏輯層、數(shù)據(jù)層。表現(xiàn)層:實(shí)現(xiàn)用戶與系統(tǒng)的良好交互,通過友好的系統(tǒng)界面為用戶提供具體的應(yīng)用。同時系統(tǒng)提供公共服務(wù)應(yīng)用,為這些不同的服務(wù)方式提供統(tǒng)一的出口。表示邏輯層:接受來自表現(xiàn)層的請求,分析數(shù)據(jù)類型,然后通過業(yè)務(wù)服務(wù)組件執(zhí)行業(yè)務(wù)功能。業(yè)務(wù)邏輯層:是實(shí)現(xiàn)系統(tǒng)功能的關(guān)鍵核心部分。包括:業(yè)務(wù)功能接口、XML數(shù)據(jù)轉(zhuǎn)換中間件處理模塊、數(shù)據(jù)庫連接訪問中間件處理模塊。通過數(shù)據(jù)庫連接訪問中間件實(shí)現(xiàn)不同數(shù)據(jù)源的連接訪問[3],從而進(jìn)行數(shù)據(jù)抽取。異構(gòu)數(shù)據(jù)源中抽取的數(shù)據(jù)通過XML數(shù)據(jù)轉(zhuǎn)換中間件模塊進(jìn)行轉(zhuǎn)換與映射,處理成為可以加載顯示的數(shù)據(jù)格式。在加載數(shù)據(jù)的過程中,通過業(yè)務(wù)功能接口實(shí)現(xiàn)整合數(shù)據(jù)的加載與顯示。數(shù)據(jù)層:包括多個異構(gòu)數(shù)據(jù)庫,主要由交換數(shù)據(jù)庫、資源數(shù)據(jù)庫組成。交換數(shù)據(jù)庫主要存儲不同系統(tǒng)的專業(yè)數(shù)據(jù),如震害調(diào)查數(shù)據(jù)、活斷層數(shù)據(jù)、地震小區(qū)劃數(shù)據(jù)[4]等。資源數(shù)據(jù)庫根據(jù)需求存儲抽取的數(shù)據(jù)資料。系統(tǒng)體系結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)體系結(jié)構(gòu)圖
ADO.NET是微軟.NET平臺提供的一種數(shù)據(jù)訪問技術(shù),是由一系列數(shù)據(jù)庫相關(guān)類和接口組成的類庫。它提供了連接模式和無連接模式的數(shù)據(jù)訪問[5]。無連接模式的優(yōu)點(diǎn)是程序使用數(shù)據(jù)庫進(jìn)行連接,并在完成訪問和交互后釋放連接,從而減少系統(tǒng)服務(wù)器的負(fù)載,使數(shù)據(jù)訪問更加靈活。并且ADO.NET支持XML文檔,運(yùn)用XML文檔進(jìn)行數(shù)據(jù)交互,通過ADO.NET對不同異構(gòu)數(shù)據(jù)源進(jìn)行訪問。
工廠模式的定義是一個創(chuàng)建產(chǎn)品對象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中,核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處可以使工廠方法模式在系統(tǒng)不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。數(shù)據(jù)工廠通過構(gòu)建一個數(shù)據(jù)庫連接訪問類,所有訪問數(shù)據(jù)庫的行為都通過這個類實(shí)現(xiàn)。另外,通過動態(tài)配置數(shù)據(jù)庫連接配置文件,實(shí)現(xiàn)對數(shù)據(jù)庫的動態(tài)訪問。在具體開發(fā)過程中,設(shè)計(jì)思想根據(jù)工廠模式,對不同的數(shù)據(jù)庫對象進(jìn)行封裝,形成一個公共抽象類。這個公共抽象類給用戶提供通用接口,用戶通過訪問接口實(shí)現(xiàn)對不同數(shù)據(jù)庫的連接與訪問。具體的功能實(shí)現(xiàn)由這個公共抽象類的子類完成。通過工廠模式的數(shù)據(jù)庫訪問可以降低應(yīng)用程序模塊之間的耦合度,同時還可以提高代碼的復(fù)用性,并使模塊擴(kuò)展變得容易實(shí)現(xiàn)。
用戶通過調(diào)用DBFactory類中的CreateInstance獲取一個DBAccess類的實(shí)例,DBAccess類是一個核心抽象類,它定義了應(yīng)用程序與數(shù)據(jù)庫交互所使用的各種方法和屬性。由DBAccess類自動判斷用戶需要連接的數(shù)據(jù)庫,并進(jìn)行訪問。在不更改應(yīng)用程序的前提下實(shí)現(xiàn)了對異構(gòu)數(shù)據(jù)源的訪問。
XML數(shù)據(jù)處理中間件模塊通過數(shù)據(jù)連接訪問處理模塊提取數(shù)據(jù)進(jìn)行轉(zhuǎn)換。XML數(shù)據(jù)處理中間件模塊主要包括數(shù)據(jù)映射子模塊、數(shù)據(jù)分析子模塊、數(shù)據(jù)加載子模塊。集成模型如圖2所示。
圖2 基于XML的數(shù)據(jù)集成模型圖
(1)數(shù)據(jù)映射子模塊,主要完成關(guān)系數(shù)據(jù)庫與XML數(shù)據(jù)之間的雙向映射與轉(zhuǎn)換。
(2)數(shù)據(jù)分析子模塊,主要負(fù)責(zé)XML數(shù)據(jù)的分析處理,將XML數(shù)據(jù)解析為一棵對象樹。
(3)數(shù)據(jù)加載子模塊,主要負(fù)責(zé)將解析完成后的數(shù)據(jù)進(jìn)行加載,展示給用戶。
實(shí)現(xiàn)XML數(shù)據(jù)模型與關(guān)系數(shù)據(jù)庫之間的數(shù)據(jù)轉(zhuǎn)換,主要通過模板驅(qū)動和模型驅(qū)動兩種形式[6]。模板驅(qū)動方法是使用SQL命令嵌入到XML文件中,通過中間件中的程序讀取模塊中的SQL命令,實(shí)現(xiàn)從數(shù)據(jù)庫中抽取數(shù)據(jù)轉(zhuǎn)換為XML文檔。這種方法的優(yōu)點(diǎn)是簡單易于實(shí)現(xiàn),缺點(diǎn)是只能實(shí)現(xiàn)從數(shù)據(jù)庫到XML文檔的單向映射。模型驅(qū)動方法是在數(shù)據(jù)庫和XML文檔之間預(yù)定義映射模型,通過這種模型把XML文檔結(jié)構(gòu)映射成為數(shù)據(jù)庫結(jié)構(gòu)模型[7]。這種方法可以方便地實(shí)現(xiàn)XML文檔和數(shù)據(jù)庫之間的雙向映射,具體做法是將XML文檔轉(zhuǎn)換為一棵對象樹,將對象模型映射為關(guān)系模型,本系統(tǒng)采用模型映射的方式。
(1)讀取XML文檔,將其構(gòu)建為一棵帶有架構(gòu)的樹[8]。其中XML文檔包含兩部分內(nèi)容,架構(gòu)部分和數(shù)據(jù)部分。
(2)將XML文檔中架構(gòu)部分的數(shù)據(jù)類型[9]、屬性映射成為關(guān)系數(shù)據(jù)庫表的各個字段。
(3)XML文檔中的數(shù)據(jù)部分根據(jù)映射規(guī)則,映射到異構(gòu)數(shù)據(jù)庫相應(yīng)的表中。在數(shù)據(jù)映射過程中,如果是簡單數(shù)據(jù)類型,則直接將數(shù)據(jù)映射到相應(yīng)的數(shù)據(jù)庫表中。如果是復(fù)雜元素,則通過“主鍵-外鍵”對應(yīng)關(guān)系映射到數(shù)據(jù)庫表中[10]。
(1)首先通過數(shù)據(jù)連接訪問模塊抽取異構(gòu)數(shù)據(jù)源中的數(shù)據(jù),這個過程根據(jù)用戶需求動態(tài)構(gòu)造出相應(yīng)的SQL語句進(jìn)行抽取[11]。
(2)由于XML文檔是一種半結(jié)構(gòu)化的數(shù)據(jù)結(jié)構(gòu)[12],所以在將數(shù)據(jù)表轉(zhuǎn)換為XML文檔之前需要定義一個中間轉(zhuǎn)換對象類,這個類定義了數(shù)據(jù)庫表中的字段,即數(shù)據(jù)表中的字段對應(yīng)對象類中的成員變量。
(3)通過中間轉(zhuǎn)換類完成對XML文檔的架構(gòu)定義,確定XML文檔架構(gòu)中的屬性及數(shù)據(jù)類型。然后遍歷類對象中的數(shù)據(jù),通過定義的映射關(guān)系生成一棵帶架構(gòu)的樹狀XML文檔。
在整合地震信息的過程中,分別從地圖空間及屬性數(shù)據(jù)庫、地質(zhì)資料數(shù)據(jù)庫、活斷層數(shù)據(jù)庫、地震小區(qū)劃等數(shù)據(jù)庫中抽取數(shù)據(jù),轉(zhuǎn)換整合成為有效的信息資源。這些資源可以被查詢?yōu)g覽,以及提供詳細(xì)的地震信息。地震信息在Web頁面上的展現(xiàn)如圖3所示。 圖中的圓點(diǎn)顯示近一年所發(fā)生的地震,圓點(diǎn)的大小代表地震震級的大小。
圖3 地震信息在Web頁面上的展現(xiàn)圖
本研究的數(shù)據(jù)集成方案雖然在很大程度上降低了勞動量,提高了數(shù)據(jù)集成的效率,但卻需要人為地定義轉(zhuǎn)換規(guī)則,編寫數(shù)據(jù)轉(zhuǎn)換中間類。在一些相關(guān)的應(yīng)用中發(fā)現(xiàn)轉(zhuǎn)換過程時間過長、轉(zhuǎn)換規(guī)則與轉(zhuǎn)換中間類的編寫相對復(fù)雜。這需要在今后的工作中進(jìn)一步完善轉(zhuǎn)換模型與提高轉(zhuǎn)換效率。