基于XML的數據庫總體分析(上)
為什么要把XML和數據庫相聯系呢?舉個例子來說明這個問題,比如你有一個電子商務的應用程序需要使用XML來進行數據傳輸。你所關心的是數據本身應該具有的結構,你并不關心它在文檔中實際的存儲結構。如果你的應用程序很簡單的話,基本的文件系統將滿足你的需求,但如果應用本身很復雜的話,你就需要一個完整的開發應用環境來支持XML。從另一個方面來說,假設你有一個Web站點,它的內容是由一系列XML文檔構成的,你不僅要管理這個站點,同時你需要提供給用戶一個搜索該站點內容的機制。而這些都需要借助數據庫來實現。
選擇一個數據庫的最重要的因素是你是否需要數據庫來存儲數據或者是文檔,如果你想要存儲數據的話,你需要一個關系數據庫或者是對象數據庫來存儲實際的數據,同時你需要中間件在數據庫和XML文檔之間建立橋梁關系,從另一方面來說,如果你想要存儲文檔,你需要一個內容管理系統,通過它進行文檔的存儲。實際上,XML文檔可以分到兩大類:以數據為中心或者以文檔為中心。
以數據為中心的文檔:數據為中心的文檔有非常規則的結果,比如關于銷售訂單或者是飯店菜單的XML文檔。以數據為中心的文檔通常是為機器設計的,也就是說主要是方便機器進行處理。通常,任何Web站點可以動態的構建HTML文檔,其步驟如下,根據用戶的查詢請求找到相關的面向數據的XML文檔,然后通過XSL對XML文檔進行轉化,讓基于HTML的瀏覽器能夠方便的瀏覽結果。
以文檔為中心的文檔:以文檔為中心的文檔具有不規則的結構,而且數據的粒度也比較大。具體的例子如書本、電子郵件、廣告等等。以文檔為中心的文檔主要是用人類而設計的。
為了存儲或提取數據,你可以使用數據庫和中間件,或者你可以使用XML服務器,或者是基于XML的Web服務器。為了存儲文檔,你需要一個內容管理系統或者是可持久化的DOM實現。可以在數據庫或者是XML文檔中發現大量基于數據為中心的文檔。這樣我們就需要工具把數據從數據庫轉化成XML文檔,或者把一個XML文檔轉換到數據庫中。同時需要注意的是,當把數據存儲到數據庫中的時候,需要拋棄一個文檔的很多信息,比如它的名稱和DTD,它的物理結構,比如實體定義和使用,一個節點下元素的位置排列,二進制數據的存儲方式等等。同樣,當從數據庫中提取數據的時候,產生的XML文檔通常不包含CDATA或者是實體使用的說明,而且節點下元素的排列位置只和數據庫中記錄的順序位置一致。實際上一個XML文檔存儲到數據庫中,再由該數據庫生成此XML文檔,這前后兩個文檔格式幾乎不可能完全一樣。
為了在數據庫和XML文檔之間傳遞數據,必須在文檔結構和數據庫結構之間建立映射,這種映射可以有兩個分類:模板驅動和模型驅動。
1.基于模板驅動的映射:需要在一個模板中嵌入命令,并用數據傳輸中間件進行處理。比如,考慮下面的模板:
- <?xml version="1.0"?>
- <FlightInfo>
- <Intro>The following flights have available seats:</Intro>
- <SelectStmt>SELECT Airline, FltNumber, Depart, Arrive FROM Flights</SelectStmt>
- <Conclude>We hope one of these meets your needs</Conclude>
- </FlightInfo>
注意其中嵌入了一個SELECT語句。當用數據傳輸中間件進行處理的時候,每一個SELECT語句都會被它的結果所代替,用XML格式化形式表現為:
- <?xml version="1.0"?>
- <FlightInfo>
- <Intro>The following flights have available seats:</Intro>
- <Flights>
- <Row>
- <Airline>ACME</Airline>
- <FltNumber>123</FltNumber>
- <Depart>Dec 12, 1998 13:43</Depart>
- <Arrive>Dec 13, 1998 01:21</Arrive>
- </Row>
- ...
- </Flights>
- <Conclude>We hope one of these meets your needs</Conclude>
- </FlightInfo>
基于模板驅動的映射可以是相當靈活的,比如,一些產品允許你把結果集放到XML文檔的任何位置,同時可以對SELECT語句設置參數,并且可以使用for循環語句和if條件語句等。值得注意的是,當前基于模板驅動的映射只能應用于在關系數據庫和XML文檔之間傳遞數據。
基于模型驅動的映射:也就是說把數據從數據庫傳送到XML文檔是用一個具體的模型實現的,這樣,XSL可以被結合到基于模型映射的產品上。在XML文檔中,兩種模型是很常見的:表格模型(table model)和數據專用對象模型(data-specific object model)。
2.表格模型:許多中間件軟件包用表格模型在XML文檔和關系數據庫之間傳遞數據。它把XML文檔表示為一個單一的表格或者是表格的集合。這樣,一個XML文檔的結構可以用如下的形式表示:
- <database>
- <table>
- <row>
- <column1>...</column1>
- <column2>...</column2>
- ...
- </row>
- ...
- </table>
- ...
- </database>
這里關鍵字"talbe"在把數據從數據庫傳遞到XML文檔的時候,表示一個單一的結果集,把數據從XML文檔傳遞到數據庫的時候,表示表示一個單一的表格或者視圖。但是,當結果集合不只一個的時候,或者當XML文檔包括多個復雜嵌套的時候,這種傳遞方式就不能適應了。
3.數據專用的對象模型:把一個XML文檔表示為由數據對象構成的樹,每一個元素類型和對象相對應。主要在面向對象和層次數據庫中使用,通過傳統的關系-對象模型也可以映射到關系數據庫中。注意這種模型并不是文檔對象模型(DOM)。比如,銷售訂單文檔可以被看成一個對象樹,其中包括五個類:Orders, SalesOrder, Customer, Line, 和Part。如下所示:

當把一個XML文檔看成是一個以數據為中心的對象樹的時候,元素不一定和對象相對應,比如,一個元素只包含PCDATA,它能夠被當成一個屬性,它包括一個單一的,標量值。
實際上在XML和數據庫之間進行數據轉化的時候,需要考慮兩個過程:一個是從數據庫模式中產生DTD,另外一個是根據DTD生成數據庫模式
從一個DTD中生成一個關系模式的步驟如下:
1. 對每一個元素,產生一個表和一個主鍵列。
2. 對每一個有混合內容的元素,產生一個獨立的表格,用來存儲PCDATA,并通過父表的主鍵和父表相聯。
3. 對元素類型中的每一個單一值的屬性,對具有只有PCDATA內容的子元素(該子元素按順序出現),產生一個單獨的列,如果子元素類型或者值是可以選擇的話,該列就應該可以允許為NULL類型。
4. 對有多個值的屬性和可以出現多次的子元素(該子元素PCDATA)的話,需要創建一個單獨的表來存儲這些值,并通過父表的主鍵和父表相聯。
5. 對每一個包含元素或者混合內容的子元素來說,通過父表的主鍵把父元素和子元素聯接起來。
從一個關系數據庫模式構建DTD步驟如下:
1. 對每一個表,創建一個元素。
2. 對表中的每一列,創建一個屬性或者是一個只有PCDATA 內容的子元素。
3. 根據表中的每一主鍵/外鍵關系,創建該表元素的子元素。
本文就介紹到這里,更多的內容我們會在下節中繼續介紹。
【編輯推薦】





















