基于XML的數據庫總體分析(下)
本文我們繼續介紹基于XML的數據庫總體分析,首先介紹基于XML的數據庫產品分類:
根據Ronald Bourret在XML Database Products一文中的描述,XML Database中包含有七種類型的產品,分別為:
1.中間件(Middleware )
1.與XML相結合能驅動XML的數據庫(XML-Enabled Databases),比如Oralce和微軟都宣稱在它們最新的數據庫產品都都能夠和XML進行無縫的銜接。
2.原始的XML數據庫(Native XML Database)。
3.XML服務器(XML Servers)。
4.XML應用服務器,比如IBM的WebSphere。
5.內容管理系統(Content Management Systems)。
2.可持久化的DOM實現(Persistent DOM Implementations)
下面我們對每一種產品做一個具體的說明和介紹。
中間件:所謂中間件就是用來在XML文檔和數據庫之間進行處理和轉化的軟件。主要應用于以數據為中心的應用里面,它可以用各種各樣的語言編寫,一般來說它需要用到ODBC, JDBC,或者是 OLE DB. 盡管它可以通過Internet進行是數據的傳輸,但是一般它都是通過Web服務器來實現數據的傳輸。
下面我們需要考慮當把XML文檔存儲到數據庫中,如何選擇適合你應用程序的中間件。
實際上,在我們選擇中間件的時候,我們要考慮下面一些因素
1.數據類型: XML不支持數據類型,也就是說,在XML文檔中的所有數據都是文本,即使數據它本身代表了另外一種數據類型,比如日期或者整數。通常,數據傳輸中間件將把數據轉化為其他類型。
2.二進制數據處理:有兩種通常的方法存儲XML文檔中的二進制數據:未經過解析的實體(unparsed entities)和Base64編碼。
3.Null類型處理:在關系數據庫世界中,NULL表示該數據不存在,它和0或者是空字符串當然是不一樣的。當然,XML也支持NULL的概念。如果一個可選擇的元素類型或者屬性是NULL的話,它就不包括在這個文檔里面。當映射一個XML文檔的結構到數據庫或者根據數據庫內容生成XML文檔的時候,你需要考慮可選元素類型和屬性跟可NULL的列之間的映射。
4.字符集:一個XML文檔可以包含任何Unicode字符,而不幸的是,許多數據庫并不支持Unicode。因此如果你的數據包括非ASCII字符的時候,需要注意數據庫和中間件對這些字符的處理。
5.關于XML中的處理指令:處理指令并不是XML文檔中的數據,因此中間件就很難決定如何存儲它們。所以在選擇中間件的時候,要看它們對處理指令的處理情況。
6.標記存儲:注意不同的中間件對標記的處理是不一樣的。而且在數據庫中的存儲模式也不同,見下面的例子:
- <description>
- <b>Confusing example:</b>
- </description>
在數據庫中存儲的形式如下:
- <b>Confusing example:</b> <foo/>
這主要是因為數據庫不能識別<b>和<foo>是標記還是文字。
典型的中間件有:
ADO:它可以實現數據庫和XML文檔之間的雙向轉換。XML支持把一個記錄集合對象保存為一個XML文檔,它也能夠把一個XML文檔作為一個記錄集合進行處理,這樣就在XML文檔和數據庫之間提供了一個橋梁。這種映射實際上是模型驅動的,數據可以被看成是一棵對象樹,一個具有嵌套結構的樹可以作為一個嵌套的記錄結果集被顯示,反之也是如此。另外,如果記錄集合數據有變化的話,可以反映到相應的XML文檔中,而XML文檔中內容的變化也可以導致數據庫內容的變化。
ASP2XML:主要是通過一個COM對象實現XML文檔和基于ODBC或者是OLE DB的數據庫之間數據的傳遞。該產品實際上是基于模型驅動的,把XML文檔看成是一個單一的表,當把數據從數據庫傳遞到XML文檔的時候,用戶指定一個SELECT語句,輸出包含了ASP2XML專用的標簽。當把XML文檔的數據傳遞到數據庫的時候,XML文檔必須包含ASP2XML專用的標簽。該COM對象是支持自動化的,也就是說它能夠在劇本語言中使用,比如ASP。
3.支持XML的數據庫系統(XML-Enabled Databases):數據庫提供了擴展的功能,能夠在XML文檔和數據庫之間進行數據的傳輸。通常是設計成為能夠存儲和提取以數據為中心的文檔。一般來說是把XML文檔進行解析以后,存儲到相應的表格中,當然,也可以存儲以文檔為中心的文檔,也就是說把整個文檔作為一個單一的表中的一個字段,然后通過文本檢索機制進行查詢。因為許多數據庫現在能夠把內容發布到網站上,基于XML的數據庫和XML服務器之間的差別就變得很模糊。
典型的產品有:微軟的SQL Server 2000。SQL Server2000通過三種方式支持XML技術:
1 在SELECT語句中增加了FOR XML條件子句:FOR XML條件子句有三種選擇,用來指定如何把SELECT語句映射到XML上去。RAW模式指定結果集為一個表格,表格中的每一行對應一個元素,每一列對應元素的屬性或者是它包含的子元素。AUTO和RAW的區別在于:行的元素名稱和表格名稱一致,產生的XML文檔是線性嵌套的,和表格在SELECT語句中出現的順序相對應。EXPLICIT允許你使用一系列的SELECT語句的UNION來構建一個XML文檔。
2 通過XPath進行信息定位:通過模式映射的方式,也就是在XML文檔的元素和屬性以及在數據庫中的表和字段之間建立映射關系。這里把XML看成是一棵對象樹,而使用XPath的一個子集來進行查詢。
3 在存儲過程中使用OpenXML函數:OpenXML函數被用來提取XML文檔的任何一個部分,并把它當作一個表格,然后就可以用SELECT語句中的FROM指定這個表格,并通過INSERT語句在XML文檔和數據庫之間傳遞數據。并可以用XPath來指定具體的元素或者屬性。
4.原始的XML數據庫(Native XML Database):實際上,在一個數據庫中存儲XML文檔可以有四種選擇:
1.以文本形式存儲整個文檔,比如在關系數據庫中用BLOB類型,在文件系統用文件類型。
2.在文件系統中以修改過的形式存儲整個文檔,比如,以壓縮的形式或者事先解析過的形式。
3.把文檔結構映射到數據庫中,比如把DOM模式映射成為數據庫中表格的形式。如何建立映射,各個數據庫可以有不同的實現,。
4.把數據結構映射到數據庫中,比如,把一個包含銷售訂單的XML文檔映射到Order,Itmes,Parts和客戶等表格中去。
原始的XML數據庫和支持XML的數據庫的區別在于原始的XML數據庫一般使用方法2和方法3。而支持XML的數據庫一般選用方法4。
典型的產品有斯坦福大學開發的Lore系統,它的數據庫實際上是一個半結構化的數據庫。所謂半結構化的例子就是我們的簡歷,其中既有一些結構化的信息,比如性別,年齡,通訊電話等等,也有非結構化的信息,比如個人特長等的描述。XML本身就是一個非常好的半結構化數據模式的例子,它本身是自描述的,包含了很多元數據。而且它同時可以擴展或增加新的元數據(或者說是新的字段)。
Lore是用來存儲半結構化的數據庫。它最開始是用來存儲HTML文檔數據的,但現在已經可以被用來作為XML數據庫。它包括了一個查詢語言(Lorel),多索引機制,查詢優化器,多用戶支持,日志記錄和恢復等功能,并且能夠倒入外部數據。因為Lore支持半結構化,所以它也能夠存儲沒有DTD定義的XML文檔。
#p#
5.XML服務器:一般認為,XML服務器是一個提供數據服務的平臺,而這里的數據就是以XML形式出現的,而這些數據主要是為分布式應用程序服務的,比如電子商務和B2B應用等。XML服務器通常包括了一個完整的應用開發環境,并通過各種數據存儲方式來使應用程序可以方便的獲取和使用這些數據。存儲的數據包括傳統的數據庫數據、電子郵件信息和文件系統等等。我們知道傳統的Web服務器都是基于HTML文本進行信息傳送的,隨著XML技術的出現,對于基于XML的Web服務器的需求也就產生了。那么到底什么是XML服務器呢?準確定義XML Server這個概念是困難的,因為這實在是一個比較新,而且概念很廣泛的東西,雖然已經有許多的產品稱自己為XML Server,比如DataChannel公司的DataChannel Server 4.1;Software AG公司的Tamino;Excelon公司的excelon,但在應用的范圍上以及功能上,每種產品都各不相同,因此這里也就不為XML Server進行定義,而是歸納這幾種產品的共同擁有的一些特點,以說明的方式來向大家解釋XML Server這個概念。 簡單地講,XML Server是一個提供數據的平臺,它能夠以XML文檔的形式與分布式的應用進行數據交互。比如電子商務這一類的應用。這聽上去和傳統的數據庫非常的相似,它和數據庫一樣提供數據的存貯與提取功能,但數據的格式的是基于XML的,因此在數據的處理方面,所用的是和傳統數據庫完全不同的技術了。
所以XML Server被認為是XML Database其中的一種,XML-enabled Server則相對來講比較容易理解,因為它本質上就是一個Web Server,對于客戶端而言,瀏覽Web,客戶端不會感覺它和傳統Web Server有什么太大的區別,但實際上Server端在對請求(REQUEST)處理方法上,XML-enabled Web Server和傳統Web Server是完全兩種不同的方式,這是由于XML文檔與HTML文檔本身的特性所決定的。我們大家都知道,XML文檔是一種以數據為中心的文檔,XML文檔本身沒有表示格式化的信息,而是通過特定的XSL或者CSS來表現,也就是說數據和表現是分離的。而在客戶端提交需求后由XML-enabled Web Server將內容與形式結合后把最終結果發布給客戶端的Web Server。因此這是一種胖服務器,瘦客戶的模式。這種模式同微軟將XSL Parser集成到IE中的設計思想是完全不同的。它的優點是能夠對不同的設備瀏覽Web的提供各自相應的格式的文檔,而不需要人工的干涉。
從另外一個角度講,XML Server可以提供比單純XML文檔更強的管理XMl格式數據的能力,而且可以避免用傳統數據庫時需要進行數據轉換的過程(因為XML是標準的擴展標記語言,并不是各個公司專屬的技術,而數據庫廠家對自己的數據庫都有不同的格式,所以必須通過一些中間件進行轉換),而獲得高效。
當然,任何技術都不是盡良盡美的,任何一項新的技術在沒有完全成熟以前都會存在許多的缺點,XML Server同XML-enabled Server也不會例外,它們分別存在下面一些缺點或問題:
對于XML Server而言:XML Server的性能如何還沒有得到驗證,因為它采用的是一種全新的數據組織方式,而這種方式在過去還沒有得到過廣泛的應用。正如我們有理由看好XML Server發展前景的同時,我們也有理由對這種沒有經過大范圍使用的產品持懷疑態度。我們可以看一下幾種典型XML Server產品的配置需求。
DataChannel Server 4.1 在Windows環境下的硬件要求:500MHz or faster Pentium III processor with at least 256MB of RAM.
DataChannel Server 4.1 在Windows環境下的硬件要求:Sun Ultra 10 or equivalent. At least 256MB of RAM.
Tamino 在Windows環境下的硬件要求:At least 300MHZ or faster. At least 256MB of RAM.
對于XML-enabled Web Server而言:最大的問題是XML-enabled Web Server太復雜了,比較起原來用Html和傳統Web Server建設Web,懂得使用XML這些先進技術的人還是太少了,而且Server的安裝也顯得太復雜,而開發工具則又太專業了。如何使電腦的初級用戶能很快的學會使用它,是它需要解決的另外一個問題。 基于XML的Web服務器體系結構如下所示:
最后,我們看一下微軟對基于XML的Web服務器的支持,它的實際實現方法是通過IIS的ISAPI擴展用以提供通過HTTP直接訪問SQL Server并將查詢結果形成XML返回到客戶端而完成的。最簡單的訪問方法是直接HTTP的URL中使用SQL語句:http://IISServer/VirtualRoot?sql=SELECT+*+FROM+Customers+FOR+XML+AUTO。同時需要注意的,我們可以在URL中執行存儲過程和使用xml文檔模板。
6.XML應用服務器:XML應用服務器實際上是支持XML的Web應用服務器,它們通常是模板驅動的,通過在一個劇本語言中嵌入使用SQL語句來提取數據并動態構建XML文檔。
7.內容管理系統:內容管理系統是用來存儲、提取和裝配XML文檔的系統。它們通常包括以下一些特征:編輯器、版本控制和多用戶并發處理,它們本身的對數據庫實現對用戶是透明的。它們的主要目的是用來管理文檔。文檔一般是以XML格式或者其他的如RTF、PDF或者SGML的形式出現的,對于非常簡單的文檔集合,文件系統就能夠滿足你的要求,但是,如果你有一個復雜的文檔集合的話,你通常需要一個內容管理系統。這里的內容管理系統的含義就是說允許你把文檔分割成具體的內容片段,比如例子、過程、章節或者是工具條和其他的一些元數據比如:作者名字、版本號等等。然后可以根據需要來重新裝配XML文檔。你也可以根據這些片段來合成一個新的XML文檔。
內容管理系統通常具有下面的一些功能:
1.版本和可獲取性控制。
2.搜索引擎。
3.編輯器。
4.發布引擎,把內容發布到書本、CD或者Web上。
5.內容和形式的分離。
6.通過劇本和接口進行擴展。
7.和數據庫數據集成。
采用對象-關系模型,把DOM映射到數據庫中,你需要為DOM中的每一個對象在數據庫中建立對應的表格。一般來說,系統需要包括五個表:
1.屬性定義:定義屬性,包括他們的類型,合法的值等等。
2.元素/屬性關聯:定義哪些屬性是和哪些元素相關聯的。
3.內容模型定義:定義哪些元素能夠包含其他的元素。
4.屬性值:包含屬性值和指向在屬性定義表和元素/屬性關聯表中的相關行的指針。
5.元素值:包括元素值(PCDATA或者指向其他元素值的指針),元素在它的父節點中出現的次數,指向包含父節點元素值所在行的指針,指向在元素/屬性表中的相應行的指針。
前三個表和一個簡單的DTD是等價的,接下來的兩個表包含了實際的數據。通過反復的查詢后面兩個表,就有可能構建XML文檔的任意一個部分。
可持久化的DOM實現(Persistent DOM Implementations):使用數據庫來進行DOM實現的考慮是為了加快速度和避免機器內存不夠,尤其是在XML文檔非常大的時候。它們存儲了XML文檔的結構,可持久化的DOM實現能夠被用來存儲、提取和查詢XML文檔,也可以從現在的文檔中創建新的文檔。也就是說能夠通過編程實現基于DOM的應用。
實際上,你可以在自己的應用程序中,通過編寫代碼來整合中間件、支持XML的數據庫,原始XML數據庫、XML服務器和永久DOM實現等技術。這里XML應用服務器需要你編寫一些劇本代碼,內容管理系統需要你做一些系統的配置。
關于XML的數據庫總體分析就介紹到這里,若文章中有不妥之處,歡迎各位批評指正。
【編輯推薦】