畢業(yè)設(shè)計(論文)基于XML的異構(gòu)數(shù)據(jù)庫查詢中間件的實現(xiàn)_第1頁
畢業(yè)設(shè)計(論文)基于XML的異構(gòu)數(shù)據(jù)庫查詢中間件的實現(xiàn)_第2頁
畢業(yè)設(shè)計(論文)基于XML的異構(gòu)數(shù)據(jù)庫查詢中間件的實現(xiàn)_第3頁
畢業(yè)設(shè)計(論文)基于XML的異構(gòu)數(shù)據(jù)庫查詢中間件的實現(xiàn)_第4頁
畢業(yè)設(shè)計(論文)基于XML的異構(gòu)數(shù)據(jù)庫查詢中間件的實現(xiàn)_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、北京市高等教育自學(xué)考試畢業(yè)設(shè)計基于xml的異構(gòu)數(shù)據(jù)庫查詢中間件的實現(xiàn)專 業(yè) 計算機及應(yīng)用學(xué) 生 指導(dǎo)老師 日 期 2006年10月論文摘要外交部各部門在實施信息化的過程中,采用了不同的數(shù)據(jù)管理系統(tǒng),這些系統(tǒng)從簡單的文件數(shù)據(jù)庫到復(fù)雜的網(wǎng)絡(luò)數(shù)據(jù)庫,構(gòu)成了異構(gòu)數(shù)據(jù)源。這些異構(gòu)數(shù)據(jù)庫系統(tǒng)資源共享性差,有的甚至無法共享,形成了各自的信息孤島,存在大量重復(fù)建設(shè)、資源浪費的情況,為解決這個問題,本文給出了基于xml的異構(gòu)數(shù)據(jù)庫查詢中間件的方案及其主要框架。該框架以中間件集成方式為基礎(chǔ),將xml引入到了中間件系統(tǒng)中來。本文采用vc、sql server、dotnet等軟件,在ado、xml等技術(shù)的支持下,本文

2、完成了一個較為實用的異構(gòu)數(shù)據(jù)庫查詢中間件程序。該中間件由詞法分析器、語法分析器、重寫器、計劃生成、計劃執(zhí)行等模塊組成,實現(xiàn)了對異構(gòu)數(shù)據(jù)庫(access、sql)的聯(lián)合查詢。本文實現(xiàn)的中間件是針對本人所在處里的兩套異構(gòu)數(shù)據(jù)庫系統(tǒng)進行設(shè)計,這兩套異構(gòu)數(shù)據(jù)庫分別采用了access、sql server數(shù)據(jù)庫,現(xiàn)在該中間件正處在運行測試階段。關(guān)鍵詞:異構(gòu)數(shù)據(jù)庫; 中間件; xml目錄論文摘要2目錄3第一章 概述51.1 論文選題背景51.2 國內(nèi)外發(fā)展現(xiàn)狀51.2.1當(dāng)前數(shù)據(jù)集成方案51.2.2 國內(nèi)外研究現(xiàn)狀71.3 論文目標(biāo)81.3.1論文要實現(xiàn)的目標(biāo)81.3.2 xml技術(shù)的引入91.4 論文的

3、組織結(jié)構(gòu)91.5本章小結(jié)10第二章 中間件設(shè)計方案112.1 主要架構(gòu)112.2 系統(tǒng)目標(biāo)122.2.1 軟件架構(gòu)132.2.2視圖層次142.2.3 功能模塊142.3 中間件工作流程162.3.1 用戶輸入查詢請求162.3.2語法樹的生成162.3.3 查詢計劃樹的生成172.3.4 查詢計劃樹的重寫182.3.5 查詢計劃樹的優(yōu)化182.3.6 查詢分解202.4 沖突的解決202.4.1 沖突的類型212.4.2 異構(gòu)數(shù)據(jù)庫沖突的解決方法21第三章 中間件的實現(xiàn)233.1 語法樹的生成233.1.1 lex 和 yacc 的使用233.1.2 語法樹的生成243.2 計劃樹的生成26

4、3.3 查詢分解的實現(xiàn)283.4 數(shù)據(jù)類型的統(tǒng)一323.5 用戶界面32第四章 總結(jié)344.1 論文總結(jié)344.2 心得體會344.3 進一步工作35第一章 概述1.1 論文選題背景外交部各部門在發(fā)展過程中積累了大量數(shù)據(jù),并為存儲和管理這些數(shù)據(jù)不斷投資,然而,由于實施數(shù)據(jù)管理系統(tǒng)的階段性,以及計算機存儲技術(shù)的不斷發(fā)展,和人為因素的影響,以至于大到部門間的系統(tǒng)、小到一個處內(nèi)的各個系統(tǒng)都可能采用不同的數(shù)據(jù)管理系統(tǒng),從簡單的文件數(shù)據(jù)庫到復(fù)雜的網(wǎng)絡(luò)數(shù)據(jù)庫,它們構(gòu)成了外交部內(nèi)部的異構(gòu)數(shù)據(jù)源。盡管這些數(shù)據(jù)管理系統(tǒng)能夠滿足數(shù)據(jù)存儲和管理要求,但在信息共享的今天,這些異構(gòu)數(shù)據(jù)庫系統(tǒng)資源共享性差,有的甚至無法共

5、享,形成了各自的信息孤島,存在大量重復(fù)建設(shè)、資源浪費的情況。例如,本人所在處就需要用到幾套系統(tǒng):一套外交部固定資產(chǎn)管理系統(tǒng),這套系統(tǒng)采用了sql server作為數(shù)據(jù)庫;一套是辦公網(wǎng)系統(tǒng),這套系統(tǒng)采用了oracle作為數(shù)據(jù)庫;一套是處內(nèi)辦公軟件,這套軟件采用access作為數(shù)據(jù)庫。有時需要同時獲得這三套系統(tǒng)的信息,就必須分別對這三套系統(tǒng)進行訪問,然后將信息匯總后再進行處理。這樣的處理顯示是低效的,復(fù)雜的,易于出錯的。所以,無論是從本部門發(fā)展角度還是從外交部整體的角度來看,對異構(gòu)數(shù)據(jù)庫訪問的需求將越來越多,建立異構(gòu)數(shù)據(jù)庫的集成查詢等勢在必行。 1.2 國內(nèi)外發(fā)展現(xiàn)狀1.2.1當(dāng)前數(shù)據(jù)集成方案一、

6、聯(lián)邦數(shù)據(jù)庫系統(tǒng)集成幾個數(shù)據(jù)庫的最簡單的結(jié)構(gòu)可能是實現(xiàn)需要交互的所有數(shù)據(jù)庫對之間的一對一連接。這些連接允許一個數(shù)據(jù)庫系統(tǒng)db1以另一個數(shù)據(jù)庫系統(tǒng)db2能理解的術(shù)語來查詢d2。這種結(jié)構(gòu)的問題是,如果n個數(shù)據(jù)庫中的每一個都需要與其他n-1個數(shù)據(jù)庫進行交互,則我們必須寫n(n-1)條代碼以支持系統(tǒng)之間的查詢。db1db2db3db4圖1.1聯(lián)邦數(shù)據(jù)庫模型二、數(shù)據(jù)倉庫在數(shù)據(jù)倉庫集成結(jié)構(gòu)中,來自幾個數(shù)據(jù)源的數(shù)據(jù)被抽取出來,合成一個全局模式。然后,數(shù)據(jù)存儲在數(shù)據(jù)倉庫中,這在用戶看來與普通數(shù)據(jù)庫無異。組織方式如圖1.2所示。數(shù)據(jù)倉庫合成器抽取器抽取器數(shù)據(jù)源數(shù)據(jù)源圖1.2 數(shù)據(jù)倉庫一旦數(shù)據(jù)存儲在數(shù)據(jù)倉庫中,用戶

7、就可以提出查詢,正如他們向任何數(shù)據(jù)庫提出查詢一樣。另一方面,通常不允許用戶對數(shù)據(jù)倉庫進行更新,因為這些更新不能反映在基本數(shù)據(jù)源中,并且可以導(dǎo)致數(shù)據(jù)倉庫與數(shù)據(jù)源不一致。此外,數(shù)據(jù)倉庫中的內(nèi)容需要周期性的更新,以保持和數(shù)據(jù)源里的數(shù)據(jù)一致。三、mediation。mediator是一種軟件組件,它支持虛擬數(shù)據(jù)庫,用戶可以查詢這個虛擬數(shù)據(jù)庫,就像它已物化一樣。mediator不存儲任何自己的數(shù)據(jù),而是將用戶的查詢翻譯成一個或多個對數(shù)據(jù)源的查詢。然后,mediator將那些數(shù)據(jù)源對用戶查詢的回答進行綜合處理,將結(jié)果返回給用戶。其基本結(jié)構(gòu)如圖1.3所示。mediator包裝器包裝器數(shù)據(jù)源數(shù)據(jù)源 圖1.3m

8、ediator模型mediator負(fù)責(zé)把查詢分發(fā)到各個包裝器,包裝器然后把查詢轉(zhuǎn)換成本地數(shù)據(jù)源可以理解的模式。mediator本身不對查詢進行任何解釋。mediator對包裝器返回的結(jié)果進行合成。按照這個理論來講的話,對于需要集成的數(shù)據(jù)源,為每個數(shù)據(jù)源都要設(shè)計一個包裝器,或者說為一類數(shù)據(jù)源(關(guān)系數(shù)據(jù)庫、xml、web數(shù)據(jù))設(shè)計一個可動態(tài)配置的包裝器。這種方式存在的問題:既然mediator不對查詢進行解釋,那么這種對數(shù)據(jù)源的集成就無法考慮到數(shù)據(jù)源之間數(shù)據(jù)的特殊的聯(lián)系。因為每個包裝器只了解自己數(shù)據(jù)源的內(nèi)容,mediator只負(fù)責(zé)把各個包裝器返回來的數(shù)據(jù)進行的組合。1.2.2 國內(nèi)外研究現(xiàn)狀異構(gòu)數(shù)

9、據(jù)庫集成并不是一個新的研究領(lǐng)域,隨著xml技術(shù)的采用,該領(lǐng)域又重新成為了研究的熱點。從采用基于xml技術(shù)的中間件來集成異構(gòu)數(shù)據(jù)庫或異構(gòu)信息的角度來看,目前,相關(guān)研究主要集中在國外。美國政府在1998年通過opal計劃開始支持yat(基于中間件的信息集成系統(tǒng))的研究,該系統(tǒng)mediator/wrapper中間件框架實現(xiàn)了關(guān)系模式和sgml到odmg的轉(zhuǎn)化,在2000年,該系統(tǒng)的研究再次受到opal計劃和aquarelle資助,并以研究基于xml中間件信息集成系統(tǒng)(yat系統(tǒng))為主,其中christophides v,cluet s,simeon j等人主要研究了以xml集成視圖對異構(gòu)數(shù)據(jù)的包裝和

10、查詢,并提出了相應(yīng)的代數(shù)體系結(jié)構(gòu)。wisconsin大學(xué)和ibm almaden research center共同研究和實現(xiàn)了xperanto中間件系統(tǒng)是一個比較成功的系統(tǒng)。就關(guān)系模式到xml模式轉(zhuǎn)化(模式轉(zhuǎn)換是基于xml的異構(gòu)數(shù)據(jù)庫集成中間件的核心)面來看,已存在轉(zhuǎn)化工具和大量相關(guān)算法的研究:相關(guān)工具:一些商業(yè)產(chǎn)品實現(xiàn)了關(guān)系模式到xml文檔的轉(zhuǎn)化,例如odbc2xml、oracles sql、xml spy、silkroute工具。目前,除odbc2xml,xml spy、lkroute外,大部分的工具都是為相關(guān)的數(shù)據(jù)庫產(chǎn)品服務(wù),不支持多種異構(gòu)數(shù)據(jù)庫系統(tǒng)更不支持其到xml的集成,而orac

11、les sql、xml spy、silkroute雖然支持多種數(shù)據(jù)庫系統(tǒng),但仍不支持異構(gòu)數(shù)據(jù)庫的集成。同時,這些工具大部分(除xml spy外)都是輸出xml dtd模式,不支持xml schema模式。相關(guān)算法的研究也主要集中在國外。如dongwon lee(ucla,美國,加利福尼亞大學(xué)洛杉磯分校)在美國國防部高級研究項目(darpa)和國家科學(xué)基金(nsf)的雙重支持項目xpress xml中,提出基于xml的關(guān)系數(shù)據(jù)庫發(fā)布和基于關(guān)系數(shù)據(jù)庫的xml存貯和檢索,提出并初步建立基于約束的模式映射。jayavel shanmugasundaram(cornell,美國,康奈爾大學(xué)),提出基于內(nèi)

12、嵌的關(guān)系數(shù)據(jù)發(fā)布技術(shù)。wenfei fan(貝爾實驗室)則在建立xml約束方面作了大量研究。1.3 論文目標(biāo)1.3.1論文要實現(xiàn)的目標(biāo)本文要實現(xiàn)一個數(shù)據(jù)庫集成中間件,該中間件采用sql語言作為輸入,通過ado接口,實現(xiàn)對異構(gòu)數(shù)據(jù)庫access和sql server聯(lián)合查詢,并將查詢結(jié)果以xml作為結(jié)果輸出給用戶。其主要特點是:一、以sql語言為輸入,會使用用戶感到十分方便。同時也可以利用sql語言在操作關(guān)系數(shù)據(jù)庫時的強大功能。二、以xml為結(jié)果,則可以有效的將結(jié)果與其它應(yīng)用程序進行數(shù)據(jù)交換。在本文要實現(xiàn)的中間件中,要解決的主要問題是:一、異構(gòu)性異構(gòu)性是企業(yè)異構(gòu)數(shù)據(jù)集成必須面臨的首要問題,其主要

13、表現(xiàn)在兩方面:強調(diào)數(shù)據(jù)的存儲方式是不同的。關(guān)系數(shù)據(jù)庫、文本文件就可以認(rèn)為是異構(gòu)的。sql server 和oracle也可以認(rèn)為異構(gòu)的,同樣是sqlserver數(shù)據(jù)源,表示了相同的數(shù)據(jù),如果表的結(jié)構(gòu)有所不同,也是異構(gòu)數(shù)據(jù)源。強調(diào)存儲地點的異構(gòu)。不同主機之間,不同的操作系統(tǒng)之間,不同網(wǎng)絡(luò)之間,它們的數(shù)據(jù)之間的差別,而這種異構(gòu)數(shù)據(jù)源的集成重在通信。在本文中,主要解決的問題是第一方面的問題,也就是數(shù)據(jù)存儲方式不同的異構(gòu)。 二、 語義沖突信息資源之間存在著語義上的區(qū)別。這些語義上的不同可能引起各種矛盾,從簡單的名字語義沖突(不同的名字代表相同的概念),到復(fù)雜的結(jié)構(gòu)語義沖突(不同的模型表達(dá)同樣的信息)。

14、語義沖突會帶來數(shù)據(jù)集成結(jié)果的冗余,干擾數(shù)據(jù)處理、發(fā)布和交換。所以如何盡量減少語義沖突也是數(shù)據(jù)集成的一個研究熱點。1.3.2 xml技術(shù)的引入隨著xml及其相關(guān)技術(shù)和應(yīng)用的發(fā)展,xml不僅成為了應(yīng)用間交換數(shù)據(jù)的一種標(biāo)準(zhǔn),也是萬維網(wǎng)重要的信息交換標(biāo)準(zhǔn)和表示的技術(shù)之一。事實上,現(xiàn)在業(yè)界已存在幾個工業(yè)標(biāo)準(zhǔn)(xml dtd)的草案。xml的產(chǎn)生給不同的信息格式的統(tǒng)一帶來了深刻的影響。xml第一次提供了一種信息交換模式,這種格式是可編輯,易解析,并且可以表示為任何類型的結(jié)構(gòu)或半結(jié)構(gòu)化信息。 目前,xml已有多方支持,并且xml的強適應(yīng)性,使其可以實現(xiàn)對資源的快速包裝和集成發(fā)布,所以,通過引入了xml技術(shù),

15、將xml技術(shù)與全局?jǐn)?shù)據(jù)模式相結(jié)合可以使異構(gòu)數(shù)據(jù)源集成中間件系統(tǒng)能更好地適應(yīng)于開放、發(fā)展環(huán)境中的數(shù)據(jù)集成。1.4 論文的組織結(jié)構(gòu)本文探討了實現(xiàn)異構(gòu)數(shù)據(jù)源查詢中間件的設(shè)計方法和實現(xiàn)技術(shù)路線,給出了原型系統(tǒng)的設(shè)計方案。文章的整體結(jié)構(gòu)如下:第一章主要是討論異構(gòu)數(shù)據(jù)源集成的必要性,及其研究的主要內(nèi)容,同時也列舉了國內(nèi)國外的研究進展和相應(yīng)的成果。第二章介紹了本文所實現(xiàn)的異構(gòu)數(shù)據(jù)源中間件原型系統(tǒng)的整個架構(gòu)和中間件系統(tǒng)的整個工作流程。第三章描述了在原型系統(tǒng)實現(xiàn)的過程,原型系統(tǒng)每部分功能實現(xiàn)中所采用的算法、流程,以及在解決具體問題時所采用的方案和核心代碼。最后談到了系統(tǒng)所達(dá)到的目標(biāo)。第四章是全文的總結(jié),概括了本

16、文中所實現(xiàn)系統(tǒng)的特點,同時也指出了其不足和未來能進一步完善之處。1.5本章小結(jié)異構(gòu)數(shù)據(jù)源集成查詢并不是一個新的課題,但在企業(yè)生存環(huán)境不斷改變的前提下,這個課題也是不斷發(fā)展的。如何面向未來,采用合理的技術(shù)實現(xiàn)網(wǎng)絡(luò)時代企業(yè)數(shù)據(jù)集成將是一個持久的討論。作為企業(yè)應(yīng)用和企業(yè)服務(wù)集成實現(xiàn)的一個基礎(chǔ),企業(yè)異構(gòu)數(shù)據(jù)源集成將對企業(yè)信息化進程帶來深遠(yuǎn)的影響。第二章 中間件設(shè)計方案本章將從邏輯架構(gòu)、視圖層次、內(nèi)部實現(xiàn)、數(shù)據(jù)存儲等多個角度來闡述中間件系統(tǒng)的具體實現(xiàn)方案。2.1 主要架構(gòu) 目前已有的基于xml的異構(gòu)數(shù)據(jù)源集成中間件方案,其一般架構(gòu)都是基于圖2.1設(shè)計的。數(shù)據(jù)源層表示現(xiàn)有的異構(gòu)的數(shù)據(jù)源以及在這些數(shù)據(jù)源上的

17、應(yīng)用。xml中間件層是最重要也是承擔(dān)主要工作的一層。中間件先在每個數(shù)據(jù)源上加上一個wrapper,使各個異構(gòu)數(shù)據(jù)源中的數(shù)據(jù)經(jīng)過wrapper封裝后具有統(tǒng)一的數(shù)據(jù)格式。這種經(jīng)過wrapper封裝后的數(shù)據(jù)稱之為輸出模式。產(chǎn)生輸出模式的數(shù)據(jù)后,中間件系統(tǒng)會分解、處理用戶的查詢請求,把不同數(shù)據(jù)源的輸出模式進行合并,形成一個統(tǒng)一的數(shù)據(jù)視圖,最后以全局模式展示給用戶。全局概念模式是在一個或幾個輸出模式的基礎(chǔ)上形成的新的“視圖”。全局概念模式本身并不存儲數(shù)據(jù),而是利用數(shù)據(jù)字典記錄了是由哪幾個輸出模式的所組成。用戶可以直接訪問全局概念模式而不需要關(guān)心概念模式的具體構(gòu)成方式。全局概念模式有點類似于數(shù)據(jù)庫概念當(dāng)中

18、的“視圖”。全局視圖的建立就是針對所有數(shù)據(jù)源數(shù)據(jù)模式的抽取過程,它將各異構(gòu)數(shù)據(jù)源中的不同的數(shù)據(jù)表示形式統(tǒng)一成一致的數(shù)據(jù)視圖。其中,關(guān)鍵要解決的問題是對各個數(shù)據(jù)源的集成存取,或者說將用戶對集成視圖的操縱轉(zhuǎn)換成對底層數(shù)據(jù)源的操縱,包括兩方面工作:一個是將用戶對集成模式的訪問轉(zhuǎn)換成數(shù)據(jù)源可以執(zhí)行的請求;另一方面是將各數(shù)據(jù)源返回的數(shù)據(jù)轉(zhuǎn)換成集成模式的表示形式,反之亦然。圖2.1集成中間件基本架構(gòu)2.2 系統(tǒng)目標(biāo)針對上述體系結(jié)構(gòu),本文中間件原型系統(tǒng)所實現(xiàn)的主要功能目標(biāo)包括:一、實現(xiàn)對特定sql語言(系統(tǒng)定義的一種類sql語言)的支持 sql語言(structured query language)是一種

19、介于關(guān)系代數(shù)與關(guān)系演算之間的語言,是一種用來與關(guān)系數(shù)據(jù)庫管理系統(tǒng)通信的標(biāo)準(zhǔn)計算機語言。其功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制4個方面,是一個通用的、功能極強的關(guān)系數(shù)據(jù)庫語言。目前已成為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。中間件系統(tǒng)支持sql語言,可以使用戶不需要學(xué)習(xí)過多的新知識,易于掌握,提高了中間件的易用性。二、將最終結(jié)果轉(zhuǎn)化為xml的形式隨著xml及其相關(guān)技術(shù)和應(yīng)用的發(fā)展,xml不僅成為了應(yīng)用間交換數(shù)據(jù)的一種標(biāo)準(zhǔn),也是萬維網(wǎng)重要的信息交換標(biāo)準(zhǔn)和表示的技術(shù)之一。事實上,現(xiàn)在業(yè)界已存在幾個工業(yè)標(biāo)準(zhǔn)(xml dtd)的草案。xml的產(chǎn)生給不同的信息格式的統(tǒng)一帶來了深刻的影響。xml第一次提供了一種信

20、息交換模式,這種格式是可編輯,易解析,并且可以表示為任何類型的結(jié)構(gòu)或半結(jié)構(gòu)化信息。2.2.1 軟件架構(gòu)根據(jù)以上給出的系統(tǒng)功能目標(biāo),本文實現(xiàn)的中間件的主要架構(gòu)如圖2.2所示。圖2.2中描述了整個中間件系統(tǒng)的工作流程,其主要由以下幾個部分組成。(1)用戶輸入請求。用戶以系統(tǒng)規(guī)定的sql語句,作為輸入請求;(2)接收查詢語句,進行詞法語法分析,生成查詢樹;(3)根據(jù)查詢樹,生成相應(yīng)的任務(wù)樹;(4)將任務(wù)樹根據(jù)數(shù)據(jù)源所在的位置進行分解,從數(shù)據(jù)源中取出數(shù)據(jù);(5)將各數(shù)據(jù)源返回的結(jié)果進行組合,最終以xml的形式輸出。遠(yuǎn)程數(shù)據(jù)源用戶應(yīng)用程序請求接受查詢請求,進行詞法,語法分析。通信模塊查詢執(zhí)行模塊,將結(jié)果

21、進行組合。返回結(jié)果查詢分解通信模塊本地數(shù)據(jù)源一本地數(shù)據(jù)源二ado接口ado接口數(shù)據(jù)源配置文圖2.2中間件系統(tǒng)架構(gòu)2.2.2視圖層次設(shè)計的原型中間件系統(tǒng)中,一共有四種模式:全局外模式、全局概念模式、輸出模式和局部模式。局部模式是指各異構(gòu)數(shù)據(jù)源存儲數(shù)據(jù)的原始格式。局部模式中,各類數(shù)據(jù)源的數(shù)據(jù)格式是不同的,異構(gòu)的。輸出模式在本系統(tǒng)中以ado接口的形式表現(xiàn)出來。通過ado訪問可以將ado可以訪問的數(shù)據(jù)源中的數(shù)據(jù)變成統(tǒng)一的recordset類型的。本中間件使用了ado編程接口,是為了讓ado起到一個wrapper的作用,使各個數(shù)據(jù)源中的數(shù)據(jù)通過wrapper(ado)變成同構(gòu)的數(shù)據(jù)。當(dāng)然,ado缺少對半

22、結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)的支持。本文只考慮到了ado所支持的數(shù)據(jù)源。全局概念模式是將各個異構(gòu)數(shù)據(jù)源中的數(shù)據(jù)組合在一起的一種模式。這種模式已經(jīng)是同構(gòu)的,并且是將各個數(shù)據(jù)源的數(shù)據(jù)組合在一起的,但是輸出模式對于全局概念模式來講不是透明的,換句話說,對于用戶來說,全局概念模式是很多同構(gòu)數(shù)據(jù)源的組合。全局外模式是建立在全局概念模式之上的一種模式,輸出模式對于全局外模式來說,是透明的。對于用戶來講,全局外模式是一個獨立的數(shù)據(jù)源,而感覺不到任何數(shù)據(jù)的異構(gòu)性和多數(shù)據(jù)源性。全局概念模式全局外模式全局外模式全局外模式輸出模式輸出模式局部模式局部模式ldbldb圖2.3視圖層次2.2.3 功能模塊系統(tǒng)的功能模塊圖如圖2

23、.4所示。功能模塊的主要部分包括parser(查詢分解器),planner(計劃生成器)和executer(執(zhí)行器)。 parser的主要任務(wù)是將用戶的查詢語句進行分解,生成查詢樹。 planner功能模塊的作用是根據(jù)上一步所生成的各子查詢樹,產(chǎn)生相應(yīng)的執(zhí)行計劃,并對計劃進行一定程度的優(yōu)化。 executer功能模塊的作用是執(zhí)行上一步所生成的計劃。此外,在planner和executer運行時過程中,將參考數(shù)據(jù)源配置文件,以找到數(shù)據(jù)源的物理位置。 圖2.4 功能模塊2.3 中間件工作流程下面詳細(xì)介紹一下異構(gòu)數(shù)據(jù)庫查詢中間件系統(tǒng)從接收用戶查詢命令到最后返回xml的整個過程。2.3.1 用戶輸入查

24、詢請求用戶的查詢請求是以系統(tǒng)規(guī)定的類sql語句為輸入形式的。之所以采用類sql語句的形式,主要是由于sql語言易學(xué)易用,功能強大,且已經(jīng)普及。2.3.2語法樹的生成將類sql語句演變?yōu)橄鄳?yīng)語法樹的過程中,使用了lex和yacc工具。 lex是一個詞法分析生成器,可以識別出滿足原型系統(tǒng)給出的定義文件中的規(guī)則的“單詞”。 yacc是一個語法分析生成器,負(fù)責(zé)對lex生成的“單詞”進行語法分析。通過事先定義好的語法規(guī)則,最終可以生成一棵語法樹。在lex和yacc幫助下,通過定義文件,可以生成一顆語法樹。在語法樹中,用戶輸入的sql語句根據(jù)語法定義文件以樹形結(jié)構(gòu)的形式顯示出來。snosnameselli

25、stselectstmtfrom_listsscselect_optionspredicateconditionexpr=ands.deptcs=s.snosc.snoscore圖2.5語法樹例如,如果用戶輸入的sql語句如下:select s.sno, s.sname ,sc.score from student s,studentcourse sc where s.sno = sc.sno and s.dept = cs;根據(jù)上述語法定義文件,系統(tǒng)將最終生成如圖2.5所示的語法樹。2.3.3 查詢計劃樹的生成定義查詢計劃樹(plan tree)是一棵樹=(v,e),其中,是節(jié)點集,每個非葉

26、節(jié)點是類操作符,葉節(jié)點為類。在定義中,類是符合輸出模式的數(shù)據(jù),如果是關(guān)系數(shù)據(jù)庫的話,可以稱之為“關(guān)系”,但一般被集成的數(shù)據(jù)不一定都是關(guān)系數(shù)據(jù)庫,這里將輸出模式中的數(shù)據(jù)稱之為類。一棵查詢計劃樹的結(jié)構(gòu)應(yīng)該類似于圖2.6(b)所示。其中op是指類操作符,c是指類。類操作符主要包括:選擇操作sl、投影操作pj、并un、差df、笛卡爾積cp、聯(lián)接jn、分組操作gb。其中分組操作主要是支持聚合函數(shù)。下面將介紹如何將yacc生成的語法樹變?yōu)椴樵冇媱潣?。對于像select的類sql語句,主要變換規(guī)則如下:(1)將語法樹中的from_list的兒子結(jié)點,也就是所有要操作的類,進行笛卡爾積的操作,把結(jié)果做為第(2

27、)步的參數(shù);(2)如果有聚合操作,那么把第一步的傳來的結(jié)果進行聚合操作,然后把運算完的結(jié)果當(dāng)做參數(shù)傳給第(3)步;(3)把上面?zhèn)鱽淼膮?shù)進行選擇(sl)操作,選擇操作的參數(shù)為語法樹中condition部分。在選擇操作之前,先進行優(yōu)化,把condition盡量下推,以減少取出的數(shù)據(jù),從而減少網(wǎng)絡(luò)傳輸量。選擇操作完成后,把結(jié)果傳給第四步;(4)進行投影操作,其參數(shù)為sellist部分。下面以圖2.6生成的語法樹為例來說明對應(yīng)這棵語法樹的查詢計劃樹是如何生成的。將圖2.5對應(yīng)的語法樹轉(zhuǎn)換成相應(yīng)措施的查詢計劃樹,為如圖2.6(a)所示。opopopopcccsscselect(s.sno = sc.s

28、no and s.dept=cs)project(sno, sname, score) (a)(b)圖2.6查詢計劃樹2.3.4 查詢計劃樹的重寫當(dāng)把用戶的查詢請求轉(zhuǎn)變成一棵查詢計劃樹后,接下來的第二步任務(wù)就是要進行查詢計劃樹的整理和重寫工作。根據(jù)用戶請求而直接生成的查詢計劃樹,其葉結(jié)點有可能是全局概念模式,而不符合數(shù)據(jù)庫的輸出模式要求,也就是說查詢計劃樹的葉結(jié)點還不能被單個數(shù)據(jù)庫的包裝器所能解釋,因此需要整理初始查詢計劃樹并重新生成新的查詢計劃樹。因此,需要將凡是葉結(jié)點是全局概念模式的都轉(zhuǎn)變?yōu)檩敵瞿J?。為進行該步工作,采取的主要方法是通過數(shù)據(jù)字典的記錄,把擁有全局概念模式的葉結(jié)點都各自轉(zhuǎn)變成

29、一棵子查詢計劃樹。具體的變化形式以圖2.7所示為例。opopopcccopopopopccccc 圖2.7查詢重寫2.3.5 查詢計劃樹的優(yōu)化整理和重寫查詢樹的工作完成以后,接下來進行的工作就是優(yōu)化查詢計劃樹。在一個單數(shù)據(jù)庫系統(tǒng)中,查詢優(yōu)化的目的是為了提高數(shù)據(jù)庫的存取速度,而提高存取速度的關(guān)鍵是考慮數(shù)據(jù)在存儲系統(tǒng)中的排列,取出數(shù)據(jù)時數(shù)據(jù)量的大小等因素。在異構(gòu)數(shù)據(jù)源集成實現(xiàn)中,數(shù)據(jù)存儲的功能是由各個異構(gòu)的數(shù)據(jù)庫管理系統(tǒng)自己分別來完成的。那么優(yōu)化查詢計劃樹的主要目標(biāo)在于充分利用各個數(shù)據(jù)庫自己的優(yōu)化功能,把能在數(shù)據(jù)庫管理系統(tǒng)完成的查詢不轉(zhuǎn)嫁到集成系統(tǒng)中來完成。雖然查詢優(yōu)化的目的與傳統(tǒng)單個數(shù)據(jù)庫系統(tǒng)中

30、的優(yōu)化目的不相同,但是利用各數(shù)據(jù)源自帶的優(yōu)化方式,可以很容易實現(xiàn)異構(gòu)數(shù)據(jù)庫查詢?nèi)蝿?wù)樹的優(yōu)化目的。本文對實現(xiàn)查詢計劃樹的優(yōu)化的主要方法總結(jié)包括:(1)把對查詢?nèi)蝿?wù)樹中的一元操作盡量下移到葉節(jié)點;(2)若查詢?nèi)蝿?wù)樹中有二元操作,應(yīng)該盡量把操作下推,使這個操作與其操作的類最為接近。這種查詢優(yōu)化對本文后面要完成的查詢分解是非常有意義的。只有通過這種優(yōu)化方式,很多操作就可以直接成塊的交給各個異構(gòu)的數(shù)據(jù)庫系統(tǒng),而不需要中間件負(fù)責(zé)完成這部分工作。這樣,一方面可以提高數(shù)據(jù)的存取速度,還可以減少所設(shè)計的集成中間件的負(fù)擔(dān)。針對上面所舉例子來說,經(jīng)過查詢優(yōu)化模塊的處理可以將查詢?nèi)蝿?wù)樹變形為圖2.8(a)的形式。轉(zhuǎn)化

31、成這種形式以后,select(s.dept=cs)這個任務(wù)在查詢分解時就可以交給包裝器和數(shù)據(jù)源來進行處理了,而不需要中間件再進行處理。圖2.8查詢分解實例select(s.sno = sc.sno)project(sno, sname, score)sselect(s.dept=cs)scsscselect(s.sno = sc.sno)project(sno, sname, score)select(s.dept=cs)(a)(b)2.3.6 查詢分解 當(dāng)查詢計劃樹進行優(yōu)化完之后,就可以進行分解,把一棵查詢計劃樹分解成幾棵小的查詢計劃樹。然后把小的查詢計劃樹交給包裝器,包裝器把查詢計劃樹變換

32、成其對應(yīng)的數(shù)據(jù)庫系統(tǒng)能解釋的語言,傳給異構(gòu)的數(shù)據(jù)源,然后返回數(shù)據(jù)。在查詢分解的過程中,目標(biāo)是希望傳輸給包裝器的是“最大化”的子樹,也就是說盡量把查詢?nèi)蝿?wù)交給包裝器和數(shù)據(jù)源來處理。這樣做的優(yōu)點是:一方面增加查詢的并行性,充分利用數(shù)據(jù)源本身的查詢能力;另一方面也可以減少中間件的負(fù)擔(dān)。因此,將查詢?nèi)蝿?wù)進行再次分解的主要方法總結(jié)為下面的過程:后序遍歷計劃樹,如果在遍歷的過程中,所有的葉結(jié)點都是位于同一個數(shù)據(jù)源上,則繼續(xù)遍歷,否則遍歷停止;取出已成功遍歷的最大子樹作為“最大化”了的一個子查詢計劃樹,對剩余的查詢計劃子樹繼續(xù)遍歷,直至所有的葉結(jié)點被成功地遍歷為止。以上面的查詢計劃樹為例,該樹分解后形成如圖

33、2.8(b)所示的幾棵查詢子樹。當(dāng)查詢樹被分解完幾棵查詢子樹之后,就把這些子查詢計劃樹發(fā)送到對應(yīng)包裝器當(dāng)中去。包裝器的任務(wù)就是將各自接收的查詢計劃子樹變成數(shù)據(jù)源可以理解的查詢語句。對于關(guān)系數(shù)據(jù)庫來講,包裝器會把子查詢計劃樹變成sql語句,其過程是一個由sql變?yōu)椴樵冇媱潣湟粋€相反的過程。其主要變換過程如下:(1)將查詢計劃子樹中的葉結(jié)點作為sql語句中的from語句的一部分;(2)如果查詢計劃子樹中有選擇操作,則把其條件部分作為where語句的一部分;(3)如果查詢計劃子樹中有投影操作,則把投影操作的參數(shù)做為select語句的一部分。生成各關(guān)系數(shù)據(jù)庫的sql語句之后,就可以有相應(yīng)的關(guān)系數(shù)據(jù)庫系

34、統(tǒng)將該語句直接發(fā)給數(shù)據(jù)源,從數(shù)據(jù)源中查詢得到數(shù)據(jù)。當(dāng)然,如果數(shù)據(jù)源不支持sql語句,而支持其它的語句,那么相應(yīng)的包裝器就會把查詢計劃樹變?yōu)橄鄳?yīng)支持的語句。2.4 沖突的解決解決語義沖突是異構(gòu)數(shù)據(jù)源集成的一個關(guān)鍵技術(shù)難點。異構(gòu)數(shù)據(jù)源之間存在著語義上的差別。這些語義上的不同可能在集成中會引起各種矛盾,從簡單的名字語義沖突(不同的名字代表相同的概念),到復(fù)雜的結(jié)構(gòu)語義沖突(不同的模型表達(dá)同樣的信息)。語義沖突會帶來數(shù)據(jù)集成結(jié)果的冗余,干擾數(shù)據(jù)處理、發(fā)布和交換。所以如何盡量減少語義沖突也是數(shù)據(jù)集成的一個研究熱點。在很多數(shù)據(jù)集成模型中,沖突的解決是要通過配置文件來解決的,在集成的過程中,要先讀取配置文件

35、。本文實現(xiàn)的集成原型系統(tǒng)中吸取了t-sql(sqlserver中的sql語句)的特性,使用擴展sql語言實現(xiàn)了對沖突在一定程度上的解決。2.4.1 沖突的類型沖突的類型大致可以分為以下幾種:(1) 命名沖突。由于各用戶數(shù)據(jù)庫遵循不同的實體命名習(xí)慣, 因而存在命名沖突。命名沖突包括同物異名和同名異物;(2) 結(jié)構(gòu)沖突。由于對實體對象的使用方式不同, 各用戶數(shù)據(jù)庫對同一數(shù)據(jù)對象的描述結(jié)構(gòu)可能存在差異;(3) 語義沖突。是指對同一數(shù)據(jù)對象的表達(dá)方式不同, 語義沖突包括標(biāo)量沖突、域沖突和數(shù)據(jù)沖突等。2.4.2 異構(gòu)數(shù)據(jù)庫沖突的解決方法一、處理命名沖突標(biāo)準(zhǔn)數(shù)據(jù)庫與用戶數(shù)據(jù)庫的字段名是可能發(fā)生命名沖突的。

36、命名沖突有兩個來源: 同物異名和同名異物。分析字段名之間的相似和失配有助于發(fā)現(xiàn)命名沖突。當(dāng)不同名的字段在關(guān)系模式中有幾個共同的性質(zhì)與約束時,謂之相似,它們可能是同物異名;反之,當(dāng)同名的字段在關(guān)系模式中有幾個不同的性質(zhì)與約束時,謂之失配,它們可能是異物同名。當(dāng)檢查到同義詞或同名異義時,要建立對應(yīng)的映射規(guī)劃,去掉二義性。例如:某一用戶數(shù)據(jù)庫的關(guān)系表有字段: name標(biāo)準(zhǔn)數(shù)據(jù)庫的關(guān)系表有對應(yīng)字段: 姓名某一用戶數(shù)據(jù)庫和標(biāo)準(zhǔn)數(shù)據(jù)庫就發(fā)生命名沖突,需要建立映射規(guī)則: name姓名。在原型中間件系統(tǒng)中,數(shù)據(jù)庫集成的視圖是使用sql語句來完成的,在sql語句中,使用as關(guān)鍵字可以實現(xiàn)語義沖突。其表達(dá)如下:n

37、ame as 沖突二、處理結(jié)構(gòu)沖突在分析并解決了命名沖突后, 命名達(dá)到了一致性。分析結(jié)構(gòu)沖突則要對輸入模式中的同名概念進行比較, 看能否歸并它們。例如:某一用戶數(shù)據(jù)庫的電話表有字段: firstname 和 lastname標(biāo)準(zhǔn)數(shù)據(jù)庫的電話表有對應(yīng)字段: fullname某一用戶數(shù)據(jù)庫和標(biāo)準(zhǔn)數(shù)據(jù)庫就發(fā)生結(jié)構(gòu)沖突,建立映射規(guī)則:lastname + + firstname -fullname在sql語句中要實現(xiàn)該結(jié)構(gòu)的沖突,就要實現(xiàn)對表達(dá)式的支持,對于上面的沖突,可以用如下的表達(dá)式:lastname + + firstname as fullname三、處理語義沖突。語義沖突是指在不同的數(shù)據(jù)源中

38、用不同的形式來表示同一個內(nèi)容。比如說,在某一數(shù)據(jù)庫中表示性別的時候,用“男”和“女”,而在標(biāo)準(zhǔn)的數(shù)據(jù)庫中用1和0。解決這樣的問題是需要通過函數(shù)以及表達(dá)的一個映射來實現(xiàn)這個問題。舉例來說:在原有時候時間系統(tǒng)中,都是用15位來表示身份證號,一般在標(biāo)準(zhǔn)的數(shù)據(jù)庫中,將用18位來表示。要實現(xiàn)這種變換,可使中間件系統(tǒng)支持字符串substring函數(shù),其原型為: substring(string ,int ,int)substring表示取子串,三個參數(shù)是第一個表示原串,第二個參數(shù)表示從第幾個字符開始,第三個參數(shù)表示一共取幾個字符。我們就可以用類似substring(date,1,6) + 19 + sub

39、string(code, 7,9) + 6 的形式(當(dāng)然,轉(zhuǎn)換函數(shù)可能要比這個復(fù)雜,這里只是來說明函數(shù)與表達(dá)式在解決沖突中的應(yīng)用)來將一個原來15位的身份證號表示為18位的進行表示。從而解決沖突??傊?,通過定義映射規(guī)則的方式可以解決大部分?jǐn)?shù)據(jù)沖突,而且對于一些系統(tǒng)更新不一致或人為錯誤引起的語義沖突,數(shù)據(jù)庫維護人員可根據(jù)具體情況定義相應(yīng)的映射規(guī)則。第三章 中間件的實現(xiàn)異構(gòu)數(shù)據(jù)源中間件的程序架構(gòu)中,主要包括語法樹的生成,計劃樹的生成及優(yōu)化,執(zhí)行計劃等幾個部分,下面分別介紹程序架構(gòu)以及實現(xiàn)的難點。3.1 語法樹的生成3.1.1 lex 和 yacc 的使用lex 和 yacc 是 unix 兩個非常

40、重要的、功能強大的工具。lex 是一種生成掃描器的工具。掃描器是一種識別文本中的詞匯模式的程序。這些詞匯模式(或者常規(guī)表達(dá)式)在一種特殊的句子結(jié)構(gòu)中定義。一種匹配的常規(guī)表達(dá)式可能會包含相關(guān)的動作。這一動作可能還包括返回一個標(biāo)記。當(dāng) lex 接收到文件或文本形式的輸入時,它試圖將文本與常規(guī)表達(dá)式進行匹配。它一次讀入一個輸入字符,直到找到一個匹配的模式。如果能夠找到一個匹配的模式,lex 就執(zhí)行相關(guān)的動作(可能包括返回一個標(biāo)記)。另一方面,如果沒有可以匹配的常規(guī)表達(dá)式,將會停止進一步的處理,lex 將顯示一個錯誤消息。lex 和 c 是強耦合的。一個 .lex 文件(lex 文件具有 .lex 的

41、擴展名)通過 lex 公用程序來傳遞,并生成 c 的輸出文件。這些文件被編譯為詞法分析器的可執(zhí)行版本。 yacc 代表 yet another compiler compiler。 yacc 的 gnu 版叫做 bison。它是一種工具,將任何一種編程語言的所有語法翻譯成針對此種語言的 yacc 語 法解析器。它用巴科斯范式(bnf, backus naur form)來書寫。按照慣例,yacc 文件有 .y 后綴。用 yacc 來創(chuàng)建一個編譯器包括四個步驟:通過在語法文件上運行 yacc 生成一個解析器。 說明語法: 編寫一個 .y 的語法文件(同時說明 c 在這里要進行的動作)。 編寫一個

42、詞法分析器來處理輸入并將標(biāo)記傳遞給解析器。 這可以使用 lex 來完成。 編寫一個函數(shù),通過調(diào)用 yyparse() 來開始解析。 編寫錯誤處理例程(如 yyerror()。 編譯 yacc 生成的代碼以及其他相關(guān)的源文件。 將目標(biāo)文件鏈接到適當(dāng)?shù)目蓤?zhí)行解析器庫。 通過對lex 和yacc的使用,系統(tǒng)最后將用戶輸入的類sql語句變成一棵語法樹。3.1.2 語法樹的生成生成的語法樹主要保存在下面的結(jié)構(gòu)體中typedef struct querylinkitem * qual; /*條件。也就是包括where子句里的全部內(nèi)容,以一棵樹的形式*/linkitem *targetlist;/顯示給用戶

43、的字段。也就是select語句后面的內(nèi)容 targetfield * baserel; /連接的基本表。 也就是from子句后面的內(nèi)容 query;條件的存儲是以樹的結(jié)構(gòu)方式存儲的。樹的結(jié)點的類型是linkitem類(圖3.1)。targetfield類是linkitem的子類(圖3.1)。當(dāng)該結(jié)點表示數(shù)據(jù)庫表中某個字段的時候,用targetfield類表示。在targetfield類中的三個字段分別表示:databasename: 數(shù)據(jù)庫名稱tablename: 表名fieldname: 字段名在linkitem類中,type字段有以下幾種類型。#define notuse 0 /保留#de

44、fine operate 1 /關(guān)系謂詞 and or not#define compare 2 /比較 = = = !=#define field 3 /表示數(shù)據(jù)庫的字段#define value 4 /常量#define compute 5 /計算 + - * /#define function 6 /函數(shù) substring等下面舉例來說明從sql語句到生成相應(yīng)語法樹的過程。 圖3.1linkitem類繼承關(guān)系query treequaltargetlistbaserel=tab1.atab2.ctab1.atab1.btab2.ctab2.dtab1tab2圖4.2語法樹內(nèi)部結(jié)構(gòu)圖3.

45、2語法樹實例parser實現(xiàn)的關(guān)鍵是把各個子句分開,得到每個子句的具體內(nèi)容,以一個樹形結(jié)構(gòu)來存其內(nèi)容。這一部分在lex語法分析器和yacc詞法分析器的實現(xiàn)。例如,當(dāng)用戶輸入以下sql語句時select * from tab1, tab2 where tab1.a = tab2.f對應(yīng)生成的語法樹如圖3.2所示。3.2 計劃樹的生成計劃樹是由查詢樹所變化而來的。在plan tree中,其結(jié)點的主要結(jié)構(gòu)如圖3.3所示。其中plan結(jié)點是父結(jié)點,在實際的存儲中,使用的是join類型的結(jié)點,seqscan類型的結(jié)點和sqlscan類型的結(jié)點。join類型的結(jié)點,在計劃樹中非葉結(jié)點,seqscan和sq

46、lscan結(jié)點都是葉結(jié)點。seqscan與sqlscan類型不同的是seqscan是開始生成的計劃樹的結(jié)點,而sqlscan是在查詢分解以后,將分解后的子樹變?yōu)橐粋€結(jié)點時,所代表的結(jié)點類型。 圖3.3plan結(jié)點類圖plan結(jié)構(gòu)中的type表示這個結(jié)點是的類型typedef enum nodetag p_join, /表示連結(jié)p_scan, /表示seqscan結(jié)點p_unique, /去掉重復(fù)p_sort, /排序p_sql /表示sqlscan結(jié)點nodetag;對于如下sql語句:select db1.t1.f1,db2.t2.f2 from db1.t1,db2.t2 where db

47、1.t1.f1 = 5 and db1.t1.f1 = db2.t2.f2對應(yīng)生成的計劃樹如圖3.4所示。 圖3.4計劃樹內(nèi)部結(jié)構(gòu)由查詢樹變?yōu)橛媱潣涞娜蝿?wù)主要由planner類(圖3.5)來完成,其算法流程圖如圖3.6所示。圖3.5planner類 plan* planner:generateplan(query* parser);圖3.6查詢樹轉(zhuǎn)計劃樹3.3 查詢分解的實現(xiàn)查詢分解的主要目標(biāo)是一個計劃樹的內(nèi)容變?yōu)槎鄠€計劃樹。所以對于屬于同一數(shù)據(jù)源的數(shù)據(jù),系統(tǒng)將盡量將其變?yōu)橐粋€查詢結(jié)點,并將查詢請求,發(fā)送到相應(yīng)的數(shù)據(jù)源。把計劃樹按照數(shù)據(jù)源進行分解,變?yōu)閷Ω鱾€數(shù)據(jù)源的訪問,其基本流程如圖3.7所

48、示。void planner:changetosqlscan(plan*& plan); 圖3.7查詢分解流程圖檢查葉結(jié)點是否屬于同一數(shù)據(jù)源的算法流程圖如圖3.8所示。bool planner:isinsamedatabase(plan* plan,wbqstring& databasename);圖3.8檢查葉結(jié)點是否是同一數(shù)據(jù)源如果以計劃樹中的某一個結(jié)點a為根結(jié)點的子計劃樹中所有的葉結(jié)點所關(guān)系到的數(shù)據(jù)源是同一個數(shù)據(jù)源,那么就可以將以a為根結(jié)點的樹轉(zhuǎn)化為一個結(jié)點。同時,將以a為根結(jié)點的樹的信息轉(zhuǎn)化為一個數(shù)據(jù)源能夠解釋的語言,最后發(fā)給數(shù)據(jù)源。由于本中間件系統(tǒng)是建立在microsoft公司的ad

49、o技術(shù)基礎(chǔ)之上,那么最終將以a為根結(jié)點的計劃樹將轉(zhuǎn)化為sql語言。轉(zhuǎn)化的步驟如下:(1)將所有葉結(jié)點所關(guān)系到的表名放在from子句的后面;(2)將所有關(guān)系到的字段(包括最后投影中用到的字段和條件語句中用到的字段)放在select子句的后面;(3)將條件樹(qualification tree)轉(zhuǎn)化為字符串的形式,成為where子句。將條件樹轉(zhuǎn)化為字符串形式的主要步驟是:(1)中序遍歷條件樹;(2)遍歷過程中,獲取條件樹結(jié)點所表示的字符串;(3)將得到的字串連接起來,中間用空格分開。執(zhí)行計劃樹的步驟。執(zhí)行計劃樹的過程也是一個遞歸調(diào)用的過程,其主函數(shù)的原型如下:bool execute(plan

50、* plan);首次調(diào)用時其參數(shù)值為plan tree的根結(jié)點。其流程圖如圖3.9所示。取得plan結(jié)點join結(jié)點?直接把sql語句發(fā)給fetch函數(shù),取回數(shù)據(jù)集否是以左子樹和右子樹分別為參數(shù),遞歸調(diào)用本函數(shù)得到結(jié)果數(shù)據(jù)集判斷是否到數(shù)據(jù)集結(jié)尾處從數(shù)據(jù)集中刪除不符合條件的數(shù)據(jù)行對于用戶要顯示的結(jié)果,以xml的形式輸出取出左子樹和右子樹的數(shù)據(jù)集,進行合并操作數(shù)據(jù)集指針下移 圖3.9執(zhí)行計劃樹流程3.4 數(shù)據(jù)類型的統(tǒng)一因為在各個數(shù)據(jù)源中的數(shù)據(jù)類型是各種各樣的,那么如何讓各數(shù)據(jù)源中的數(shù)據(jù)類型統(tǒng)一起來,并能夠互相進行運算或者比較,是一個十分重要的問題。因為在中間件系統(tǒng)中使用的包裝器中ado接口,數(shù)據(jù)類型的統(tǒng)一步驟則變得相對比較簡單,其主要過程變?yōu)榱巳鐖D3.10所示的過程。異構(gòu)的數(shù)據(jù)源類型ado數(shù)據(jù)類型操作系統(tǒng)支持的基本類型型圖3.10 ado數(shù)據(jù)類型轉(zhuǎn)換在ado系統(tǒng)中,其變量為com中的_variant_類型,這種類型實際上是一種枚舉類型,其中包括著多種類型。一旦變量的類型統(tǒng)一了,變量之間就可以進行運算和比較了。3.5 用戶界面在完成中間件的系統(tǒng)以后,中間件以com的形式封裝,可以供其它程序進行調(diào)用。下面是用dotnet完成的一個用戶程序,該用戶程序的主要功能是配置數(shù)據(jù)源,接收用戶查詢請求,調(diào)用中間件接口,返回xml數(shù)據(jù)結(jié)果。程序的查

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論