袁 滿 陳星童
(東北石油大學(xué),大慶,163318)
目前,企業(yè)日趨信息化、標(biāo)準(zhǔn)化的發(fā)展方向,決定當(dāng)前企業(yè)中的大量生產(chǎn)信息及管理數(shù)據(jù)的集成與轉(zhuǎn)換成為亟待解決的問題。由于石油領(lǐng)域生產(chǎn)、管理、科研上地域分散的特點,使得企業(yè)內(nèi)存在大量采用不同數(shù)據(jù)庫存儲的異構(gòu)數(shù)據(jù),各個企業(yè)應(yīng)用之間存在信息壁壘,阻礙信息之間的共享。完整的數(shù)據(jù)遷移系統(tǒng)包括數(shù)據(jù)抽取、數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)加載[1],當(dāng)前的遷移方法包括:①利用PowerBuilder的數(shù)據(jù)管道(Data Pipe-Line)技術(shù)[2]、數(shù)據(jù)窗口(DataWindows)和動態(tài) SQL 語句實現(xiàn)[3]。數(shù)據(jù)管道技術(shù)雖然簡單,但對于大量且模型結(jié)構(gòu)復(fù)雜的數(shù)據(jù),不提供糾錯和質(zhì)量控制機制;采用動態(tài)SQL語句雖然適用范圍廣,但在進行遷移過程中,對于數(shù)據(jù)模型復(fù)雜或數(shù)據(jù)量龐大的情況,使遷移任務(wù)繁瑣且效率低下,缺少可視化操作界面。②采用源數(shù)據(jù)庫自帶的導(dǎo)出工具和目標(biāo)數(shù)據(jù)庫的導(dǎo)入工具,中間需要經(jīng)過必要的轉(zhuǎn)換處理;采用手工遷移和數(shù)據(jù)庫自帶工具進行遷移需要編寫大量輔助程序,要求遷移人員對源庫與目標(biāo)庫的結(jié)構(gòu)和業(yè)務(wù)規(guī)則有比較透徹的了解,增加了用戶的工作量。③采用已有的一些數(shù)據(jù)遷移軟件,如SQL Server的DTS工具、Delphi中的DataPump工具等。④特殊的數(shù)據(jù)庫提供的一些特別的遷移方法,如PHP實現(xiàn)MYSQL的遷移等。⑤通用數(shù)據(jù)遷移工具,其中用到基于相似度計算[4]的映射工具,但對于具有復(fù)雜映射關(guān)系的數(shù)據(jù)仍不能滿足。這些方法各有利弊。傳統(tǒng)的ETL體系結(jié)構(gòu),數(shù)據(jù)轉(zhuǎn)換的描述信息包括對數(shù)據(jù)源位置與基本屬性的描述、轉(zhuǎn)換規(guī)則信息等,缺少控制數(shù)據(jù)轉(zhuǎn)換行為的描述,使得整個轉(zhuǎn)換過程要依賴程序代碼控制實現(xiàn),導(dǎo)致轉(zhuǎn)換工具的實現(xiàn)復(fù)雜度增加。隨著企業(yè)信息化的深入、新行業(yè)標(biāo)準(zhǔn)的引入,新舊數(shù)據(jù)模型差異逐漸加大,導(dǎo)致新的映射關(guān)系不斷出現(xiàn),傳統(tǒng)方案只能不斷增加或者修改代碼來適應(yīng)這種情況,不但增加了維護的難度,且可能導(dǎo)致軟件重新開發(fā)。然而,用元數(shù)據(jù)描述映射模式的設(shè)計思路實現(xiàn)的數(shù)據(jù)轉(zhuǎn)換系統(tǒng)具有以下優(yōu)點:①具有良好的擴展性,不同數(shù)據(jù)模型之間出現(xiàn)一種新的映射模式只需編寫單獨的轉(zhuǎn)換規(guī)則函數(shù),配置函數(shù)接口及參數(shù)信息,定制對應(yīng)字段間映射模式元數(shù)據(jù)后,即可使用新映射模式,不需要更改程序代碼,降低了工具開發(fā)復(fù)雜度的同時,提高了工具的質(zhì)量。②通過元數(shù)據(jù)形式描述數(shù)據(jù)庫之間的映射模式,構(gòu)建用于映射模式元數(shù)據(jù)模型實現(xiàn)數(shù)據(jù)轉(zhuǎn)換過程,使得數(shù)據(jù)轉(zhuǎn)換行為能夠靈活控制,更易于維護。
映射關(guān)系[5]是指同一數(shù)據(jù)領(lǐng)域內(nèi),存儲相關(guān)數(shù)據(jù)的不同關(guān)系數(shù)據(jù)庫數(shù)據(jù)模型之間的對應(yīng)關(guān)系。映射關(guān)系分為3個層次:
①實體映射。反映了兩個數(shù)據(jù)庫概念模型上的差別,由一個或多個屬性描述。
②表映射。是實體映射的充分反映,為數(shù)據(jù)模型數(shù)據(jù)表之間的對應(yīng)關(guān)系,在應(yīng)用中表映射分為一對一映射、一對多映射、多對一映射等情況,對于多對多表交叉映射則可通過前3種映射描述。
③屬性映射[6]。關(guān)系數(shù)據(jù)庫中,屬性映射對應(yīng)的是數(shù)據(jù)表中的字段映射。它是映射關(guān)系的最底層,是數(shù)據(jù)轉(zhuǎn)換規(guī)則處理的最小單位。
了解進行數(shù)據(jù)轉(zhuǎn)換的異構(gòu)數(shù)據(jù)源的概念模型,以及數(shù)據(jù)源數(shù)據(jù)之間的對應(yīng)關(guān)系,將這種關(guān)系進行分類和細化,并且給出明確的定義和解釋,最終確定滿足從源向目標(biāo)庫進行數(shù)據(jù)轉(zhuǎn)換的數(shù)據(jù)映射模式。
映射模式[7]為源數(shù)據(jù)庫數(shù)據(jù)表字段到目標(biāo)數(shù)據(jù)庫數(shù)據(jù)表字段之間的映射關(guān)系,每一類映射關(guān)系為一類映射模式。每一類映射模式的實質(zhì)是一類數(shù)據(jù)轉(zhuǎn)換的規(guī)則,將每一類映射模式抽象為一個數(shù)據(jù)轉(zhuǎn)換規(guī)則函數(shù)。筆者通過分析關(guān)系數(shù)據(jù)庫數(shù)據(jù)模型,確定15種映射模式,包括:直接映射、主鍵映射、外關(guān)鍵字映射、多級映射、間接外鍵映射、自關(guān)聯(lián)外鍵映射、類型轉(zhuǎn)換映射、單位轉(zhuǎn)換映射、拼接映射、計算映射、截取映射、代碼表映射、源代碼表映射、目標(biāo)代碼表映射、篩選條件。在這些映射的基礎(chǔ)上,可能會增加新的映射模式來滿足數(shù)據(jù)轉(zhuǎn)換需求。
定義1.映射關(guān)系:源數(shù)據(jù)庫中實體ES的某一個屬性或?qū)傩约疉(數(shù)據(jù)表的某一個或一組字段)到與含義相同的目標(biāo)數(shù)據(jù)庫實體ET的屬性或?qū)傩约疊的對應(yīng)關(guān)系,為A到B的映射關(guān)系,記為f(A,B),或
定義3.反向映射:根據(jù)數(shù)據(jù)轉(zhuǎn)換需求,需要滿足將目標(biāo)庫向源庫的數(shù)據(jù)遷移,將A屬性設(shè)定為源到屬性B的映射關(guān)系稱為正向映射關(guān)系,基于該正向映射關(guān)系,確定以B屬性為源到以A屬性為目標(biāo)屬性為反向映射關(guān)系,則該映射關(guān)系記為,f與 f-1互為逆映射,對應(yīng)轉(zhuǎn)換規(guī)則函數(shù)為 F-1(bi,ai)或 ai=F-1(bi)。例:
②拼接映射關(guān)系f2([序號,階段],求產(chǎn)序號)。
③計算映射關(guān)系f3([射孔頂深-射孔底深],厚度)。
1.3.1 轉(zhuǎn)換規(guī)則函數(shù)
為提高數(shù)據(jù)映射行為的重用性,對油田現(xiàn)有業(yè)務(wù)數(shù)據(jù)庫模型分析,如勘探開發(fā)數(shù)據(jù)庫、A2數(shù)據(jù)庫。將數(shù)據(jù)處理對象及其屬性進行抽取,抽象為轉(zhuǎn)換規(guī)則函數(shù)。以下是對部分映射模式及其轉(zhuǎn)換規(guī)則函數(shù)進行詳細分析。
①直接映射:無需任何轉(zhuǎn)換處理,直接將源字段中數(shù)據(jù)向目標(biāo)字段遷移。
轉(zhuǎn)換規(guī)則函數(shù):F直接(S<字段>,T<字段>),函數(shù)參數(shù):S<字段>:源表字段;T<字段>:目標(biāo)表字段。
②主鍵映射,源表中的主鍵字段在目標(biāo)表中仍是主鍵,在目標(biāo)表中主關(guān)鍵字段的值發(fā)生了變化。由于描述內(nèi)容不同,需要將源主鍵值轉(zhuǎn)變?yōu)槟繕?biāo)主鍵值,同時構(gòu)建中間代碼表保存源主鍵值與新目標(biāo)主鍵值之間的對應(yīng)關(guān)系。
轉(zhuǎn)換規(guī)則函數(shù):F主鍵(S<主鍵字段>,T<主鍵字段>,MID<代碼表>),函數(shù)參數(shù):S<主鍵字段>:源主鍵字段;T<主鍵字段>:目標(biāo)主鍵字段;MID<代碼表>:中間代碼表。
③外關(guān)鍵字映射,源表中某字段所存儲的信息,在目標(biāo)表中用一個外關(guān)鍵字段來代替。
轉(zhuǎn)換規(guī)則函數(shù):F外鍵(T<參照引用表>.T<參照引用字段>,T<字段>)
外關(guān)鍵字段映射過程,首先確定目標(biāo)表中外鍵字段引用的表,即確定 T<參照引用表>,通過源字段中的數(shù)據(jù),在引用表T<參照引用表>中相應(yīng)字段 T<參照引用字段>數(shù)據(jù)作對照,獲取目標(biāo)字段T<字段>的值。函數(shù)參數(shù):T<參照引用表>:目標(biāo)庫中的參照引用表;T<參照引用字段>:參照表中的參照字段。
④常量映射,目標(biāo)字段值是常量值,不需要源表字段參與數(shù)據(jù)轉(zhuǎn)換處理。
轉(zhuǎn)換規(guī)則函數(shù):F常量(T<字段>,常量值),函數(shù)參數(shù):T<字段>:目標(biāo)字段。
⑤多級映射,由于模型復(fù)雜的層級結(jié)構(gòu)和繁多的數(shù)據(jù)量,通過單次映射往往不能正確、有效獲取目標(biāo)字段值,導(dǎo)致了數(shù)據(jù)冗余或錯誤數(shù)據(jù)等問題。對于一些復(fù)雜目標(biāo)字段的獲取需通過多次中間值的查詢和轉(zhuǎn)換處理來解決。可能通過外關(guān)鍵字映射、源表字段值、目標(biāo)字段值、指定常量值等方式獲取。在處理過程中,下一次映射的啟動依賴于上一次的映射結(jié)果,形成嵌套的映射結(jié)構(gòu)。轉(zhuǎn)換規(guī)則函數(shù):F'多級(F多級(F外鍵(T<參照引用表>.T<參照引用字段>,T<字段>),T<參照字段值>),T'<參照字段值>,S<參照字段值>)函數(shù)參數(shù):T<參照字段值>:F多級多級映射的目標(biāo)參照字段值;T'<參照字段值>:F'多級多級映 射 的 目 標(biāo) 參 照字段值;S<參照字段值>:F'多級多級映射的源參照字段值。
通過描述這些轉(zhuǎn)換規(guī)則函數(shù)及參數(shù)的元數(shù)據(jù),實現(xiàn)異構(gòu)數(shù)據(jù)模型字段間映射關(guān)系的描述,使得該基于映射關(guān)系的數(shù)據(jù)庫之間的數(shù)據(jù)轉(zhuǎn)換得到靈活實現(xiàn)。
1.3.2 映射轉(zhuǎn)換算法
算法1:識別映射模式,調(diào)用對應(yīng)映射轉(zhuǎn)換規(guī)則函數(shù),實現(xiàn)映射識別與轉(zhuǎn)換過程的自動處理算法。
前提需要:ES{A1,A2…Ai};ET{B1,B2,…,Bi};
Ai{a1,a2,…,ai};Bi{b1,b2,…,bi};
一組映射集合S-T《D》
開始:
算法2:基于外關(guān)鍵字段映射規(guī)則的數(shù)據(jù)轉(zhuǎn)換處理過程算法。
F外鍵(T<參照引用表>.T<參照引用字段>,T<字段>)
{前提需要:來自目標(biāo)表的一組數(shù)據(jù)集合P;
開始:
P=φ;
IF目標(biāo)表中對應(yīng)字段值為空THEN執(zhí)行INSERT語句插入目標(biāo)值;
ELSE IF執(zhí)行UPDATE相關(guān)語句更新數(shù)據(jù);
}
元數(shù)據(jù)驅(qū)動[8]:數(shù)據(jù)在程序中不是被加工的對象,而是通過元數(shù)據(jù)值的改變來改變程序的行為,控制程序的運行,這樣稱為元數(shù)據(jù)驅(qū)動。按照傳統(tǒng)的定義,元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù)。元數(shù)據(jù)的典型表現(xiàn)為對象的描述,即對數(shù)據(jù)庫、表、列、列屬性(類型、格式、約束等)以及主鍵/外鍵關(guān)聯(lián)等的描述。
2.2.1 支撐元模型構(gòu)建
基于元數(shù)據(jù)驅(qū)動映射工具,數(shù)據(jù)庫中需存儲大量的元數(shù)據(jù)信息,將這些元數(shù)據(jù)進行分類,存儲在對應(yīng)模型中,通過元數(shù)據(jù)模型對元數(shù)據(jù)進行管理與維護。重點在于構(gòu)建映射元數(shù)據(jù)存儲模型,元數(shù)據(jù)的模型中主要實現(xiàn)進行數(shù)據(jù)轉(zhuǎn)換的數(shù)據(jù)源位置、屬性描述與映射函數(shù)參數(shù)信息的配置。具體元數(shù)據(jù)信息包括:
①數(shù)據(jù)源數(shù)據(jù)庫信息,包含數(shù)據(jù)庫類型、數(shù)據(jù)庫版本號、數(shù)據(jù)庫名、訪問數(shù)據(jù)庫的URL、訪問數(shù)據(jù)庫的用戶名密碼等信息;
②源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫的對應(yīng)關(guān)系,描述為數(shù)據(jù)庫之間的映射關(guān)系,庫級映射;
③源—目標(biāo)表的對應(yīng)關(guān)系,描述為表間的映射關(guān)系,表級映射;
④數(shù)據(jù)源表的字段信息和目標(biāo)表字段信息,如字段的名稱、代碼、類型、寬精度等信息;
⑤源—目標(biāo)字段的對應(yīng)關(guān)系,描述為字段之間的映射關(guān)系,字段級映射;
⑥映射函數(shù)參數(shù)信息,包含各個映射模式函數(shù)的接口參數(shù)、控制條件、映射轉(zhuǎn)換規(guī)則等信息。
2.2.2 配置元數(shù)據(jù)
配置元數(shù)據(jù)包括定義源、目標(biāo)數(shù)據(jù)源的位置及各個數(shù)據(jù)源的屬性、確定從源數(shù)據(jù)到目標(biāo)數(shù)據(jù)的對應(yīng)映射轉(zhuǎn)換規(guī)則、確定數(shù)據(jù)處理相關(guān)的業(yè)務(wù)邏輯、在數(shù)據(jù)實際加載前的其他必要的準(zhǔn)備工作。這些情況都是在配置元數(shù)據(jù)階段要考慮的問題,在具體模型進行轉(zhuǎn)換的過程中,通過配置元數(shù)據(jù)實現(xiàn)映射規(guī)則函數(shù)與轉(zhuǎn)換規(guī)則的擴展,滿足用戶對數(shù)據(jù)轉(zhuǎn)換過程更為復(fù)雜的需求。通過對元數(shù)據(jù)的配置來控制其整個異構(gòu)數(shù)據(jù)轉(zhuǎn)換任務(wù)。
元數(shù)據(jù)是基于配置的,基于元數(shù)據(jù)驅(qū)動技術(shù)的開發(fā)實際上就是基于配置的元數(shù)據(jù)的開發(fā)。針對業(yè)務(wù)數(shù)目較多的情況,僅需要增加元數(shù)據(jù)的數(shù)量,實現(xiàn)通過修改元數(shù)據(jù)來滿足用戶對程序的變更需求,配置相應(yīng)元數(shù)據(jù)代替修改程序的過程,使得這種基于配置元數(shù)據(jù)的方式更為高效。這樣,不僅減少了應(yīng)用人員工作量,并使得程序具有良好的開發(fā)性能。
ETL(Extraction-Transformation-Loading)分為 3個步驟,Extraction:數(shù)據(jù)抽取是從數(shù)據(jù)源中抽取數(shù)據(jù)的過程。Transformation:數(shù)據(jù)轉(zhuǎn)換是將抽取出來源數(shù)據(jù)轉(zhuǎn)換為目標(biāo)數(shù)據(jù)的數(shù)據(jù)處理過程。Loading:數(shù)據(jù)加載是將轉(zhuǎn)換和處理后的數(shù)據(jù)加載到目標(biāo)庫中。如圖1使用元數(shù)據(jù)驅(qū)動ETL的這3個步驟行為實現(xiàn),使得該處理流程易于擴充及維護。本研究按照ETL體系結(jié)構(gòu)中的數(shù)據(jù)轉(zhuǎn)換部分展開,在數(shù)據(jù)處理過程中,基于映射關(guān)系調(diào)用相應(yīng)映射模式的數(shù)據(jù)轉(zhuǎn)換函數(shù),完成數(shù)據(jù)的轉(zhuǎn)換。因此基于ETL框架技術(shù)[9]能夠很好實現(xiàn)異構(gòu)關(guān)系模型數(shù)據(jù)間的數(shù)據(jù)轉(zhuǎn)換。
圖1 元數(shù)據(jù)存儲模型
該系統(tǒng)是基于ETL的體系結(jié)構(gòu)實現(xiàn)的,圖2為數(shù)據(jù)轉(zhuǎn)換體系結(jié)構(gòu)。
①數(shù)據(jù)源:源數(shù)據(jù)的數(shù)據(jù)庫或文件。
②目標(biāo)庫:存儲從源數(shù)據(jù)庫中抽取出來經(jīng)過數(shù)據(jù)轉(zhuǎn)換后的數(shù)據(jù)庫或文件。
③通用訪問接口:采用OLEDB和ODBC技術(shù)[10]進行訪問的接口程序。
④數(shù)據(jù)抽取模塊:抽取源數(shù)據(jù)庫中的源數(shù)據(jù)。
⑤數(shù)據(jù)轉(zhuǎn)換模塊:將源數(shù)據(jù)轉(zhuǎn)化為目標(biāo)數(shù)據(jù)。
⑥數(shù)據(jù)加載模塊:負責(zé)配置數(shù)據(jù)加載環(huán)境,將轉(zhuǎn)換后的數(shù)據(jù)加載到目標(biāo)數(shù)據(jù)庫。
⑦元數(shù)據(jù)定制模塊:獲取源、目標(biāo)庫的結(jié)構(gòu)信息及映射模式等信息,定制映射模式元數(shù)據(jù)。
⑧元數(shù)據(jù)庫:作為框架核心,元數(shù)據(jù)庫存儲支撐元數(shù)據(jù)與驅(qū)動元數(shù)據(jù)。
該基于元數(shù)據(jù)驅(qū)動的數(shù)據(jù)轉(zhuǎn)換系統(tǒng)采用.NET平臺,使用C#語言編程實現(xiàn)。
①映射規(guī)則定義:選擇源數(shù)據(jù)庫中的一個數(shù)據(jù)表,確定該表的遷移流程,選擇與其對應(yīng)的一個目標(biāo)表,選取表中需要建立映射關(guān)系的字段建立映射,如果一個源表對應(yīng)多個目標(biāo)表,可以對該源表重復(fù)建立映射。定制映射規(guī)則界面如圖3所示。
圖2 ETL體系結(jié)構(gòu)
圖3 映射規(guī)則定義功能界面
②數(shù)據(jù)轉(zhuǎn)換與加載:首先獲取驅(qū)動元數(shù)據(jù),從源數(shù)據(jù)庫中抽取源數(shù)據(jù),根據(jù)對應(yīng)映射規(guī)則,調(diào)用轉(zhuǎn)換函數(shù),對數(shù)據(jù)中轉(zhuǎn)區(qū)中的數(shù)據(jù)進行編譯處理。其次,解析映射模式元數(shù)據(jù)中的目標(biāo)庫結(jié)構(gòu)信息、加載方式信息,構(gòu)造加載的SQL語句,在目標(biāo)庫中執(zhí)行,并記錄執(zhí)行結(jié)果,最終存儲到數(shù)據(jù)庫中,同時反饋給用戶。數(shù)據(jù)轉(zhuǎn)換功能界面與數(shù)據(jù)加載界面如圖4、圖5所示。
圖4 數(shù)據(jù)轉(zhuǎn)換功能界面
結(jié)合油田企業(yè)中異構(gòu)數(shù)據(jù)模型間數(shù)據(jù)轉(zhuǎn)換的問題,研究基于元數(shù)據(jù)驅(qū)動的數(shù)據(jù)轉(zhuǎn)換技術(shù),構(gòu)建了用于描述和存儲映射策略的系列支撐元模型,對各種映射模式進行了詳細的定義,并對映射模式的表示方法及轉(zhuǎn)換規(guī)則函數(shù)進行詳細描述,實現(xiàn)了相應(yīng)模式的映射轉(zhuǎn)換算法。在油田項目中得到靈活應(yīng)用,具有可擴展性、靈活性等優(yōu)點。
圖5 數(shù)據(jù)加載界面
本研究還存在許多需要進一步研究和解決的問題,這也是下一步需要研究的內(nèi)容:在映射規(guī)則構(gòu)建過程中,用戶手工定制工作量較大,人工定制過程依賴性強;映射規(guī)則的自治構(gòu)建。
[1]鐘華,馮文瀾,譚紅星,等.面向數(shù)據(jù)集成的ETL系統(tǒng)設(shè)計與實現(xiàn)[J].計算機科學(xué),2004,31(9):87-90.
[2]Meng Xiaofeng,Zhou Longxiang,Wang Shan.State of the art and trends in database research[J].Journal of Software,2004,15(12):1822-1834.
[3]錢菁,黃光明.異構(gòu)數(shù)據(jù)庫間數(shù)據(jù)遷移的實現(xiàn)方法[J].微型電腦應(yīng)用,2002,18(3):10-12.
[4]Xu L,Embley D W.A composite approach to automating direct and indirect schema mappings[J].Information Systems,2006,31(8):697-732.
[5]Zhao Jian,Chen Songqiao.Research of data mapping relationship and data object for a data integration tool[J].Microcomputer Development,2005,15(3):76-78.
[6]George Fletcher H L,Catharine Wyss M.Towards a general framework for effective solutions to the data mapping problem[J].Data Semantics,2009,14(1):37-73.
[7]熊輝,劉彥峰,郭大慶.分布式異構(gòu)數(shù)據(jù)庫遷移系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機工程,2008,34(4):57-59.
[8]宋杰,王大玲,鮑玉斌.一種元數(shù)據(jù)驅(qū)動的ETL方法研究[J].小型微型計算機系統(tǒng),2007,28(12):2167-2173.
[9]吳遠紅.ETL執(zhí)行過程的優(yōu)化研究[J].計算機科學(xué),2007,34(1):81-83.
[10]Wang Yuanzhen,Li Haibo.Design and implementation of data ETL tools basing on OLEDB[J].Mini-Micro Systems,2002,23(4):453-455.