一、 xml數據庫的概念及分類
Xml雖然已出現很多年,但在前些年通常只被做為數據交換文件來使用,或作為軟件配置文件,較深層次的應用較少。隨著xml數據使用的越來越多,迫切需要一種能夠直接處理xml數據的數據庫來管理這些結構或半結構化的數據。之前處理xml數據都是在作為文本存儲在關系數據庫中。由于xml數據格式是層次關系,而且同類文件格式也可能不同,用關系數據庫很難表示,更嚴重的是使用關系數據庫保存xml數據無法對xml數據中結點進行檢索。使用新型存儲格式及檢索方式已是必然。隨著處理xml文件的一些方法被定義為標準,例如XPath、XQuery等。Xml數據庫的應用才越來越廣泛了。
Xml數據庫即使用xml文件作為數據存儲格式的數據庫。根據數據庫實現模式,xml數據庫分為:
1、可以使用xml文件的數據庫(Enable-XML Database):數據庫內部含有處理xml數據的模塊,可以和xml數據文件交換數據,即實現了xml數據的讀取,寫入,刪除,更新等操作,但數據庫本身并不是為xml數據設計的。
當前比較流行的數據庫oracle,Ms SQL Sever,IBM DB2,Ms Access等都屬Enable-XML Database類型。目前大部分關系數據庫都支持xml數據。關于Enable-XML Dabase數據庫產品,可以參考“XML Database Products_ XML-Enabled Databases.pdf”文檔。
此類數據由于底層實現模塊中并不是專為xml數據設計,所以在使用xml文件數據時必須通過使用類似ODBC、JDBC等接口程序進行數據交換。接口程序把xml數據讀入數據庫并轉換成數據庫可以識別的數據格式后才能操作數據,操作完的數據在通過接口程序轉換成xml數據格式,這使得執行效率大幅降低。
2、純xml數據庫(Native-XML Database):滿足一下3個條件的就是純xml數據庫:
1)、為xml文檔定義了一個邏輯模型,xml數據的存儲和查詢都基于這個模型。這個模型至少要包含元素、屬性以及PCDATA等,并保持文檔順序。
2)、將xml文檔作為邏輯存儲的基本單位,正如關系數據庫將行作為存儲的基本單位一樣。
3)、不要求只能使用某一特定的底層物理模型或某種專有的存儲格式。
數據以純xml文件格式保存,存儲在數據庫中的內容與原xml文件格式可以保持一致,數據庫引擎直接操作xml數據文件,并通過XPath或XQuery檢索數據。相對于Enable-XML Database數據庫,由于省去了數據轉換過程,在處理xml數據時相對效率較高。
目前純xml數據庫產品或單獨的xml數據庫引擎也有許多,較有代表性的產品有dbXml、Berkeley DB XML等。有代表性的xml數據庫引擎有eXist、Xindice等,本次所作的所有的分析與測試都是基于eXist與Xindice數據庫引擎。關于目前Native-XML Database數據庫產品的介紹可以參考“XML Database Products_ Native XML Databases.pdf”文件。
純Xml數據庫由于可以保持原xml文件的物理格式不變,并且可以按照原格式檢索,所以有時候純xml數據庫也被稱作原生態數據庫。如果當前有許多xml文件但文件又格式不盡相同的話,使用xml數據庫是個不錯的選擇,通過數據庫來管理這些xml文件。利用XPath和XQuery也能夠更方便的查找數據。但是由于目前用于xml數據庫的一些操作沒有明確的標準導致xml數據庫的引擎各有不同。
二、 純xml數據庫的優缺點
純Xml數據庫應用還不是很廣泛,這一點我們從目前市場上的主要數據庫產品就可以看出來。大型數據庫沒有使用純xml數據庫的。至少在上面提到的產品列表文件中沒有見到大型數據庫的身影。但是這也并不代表xml數據庫沒有優勢。下面將對純xml數據庫和關系數據庫做個比較。
優點:
1、可以直接操作xml文件,對于處理大量xml文件,純xml數據庫有著先天的優勢:不必轉換數據。這樣就減少了系統資源消耗。普通的關系數據庫在處理xml數據時必須通過xml接口處理程序來轉換數據。這方面xml數據庫的處理效率明顯高于關系數據庫。
2、存儲在xml數據庫中文件可以保持原文件的物理格式不變。由于xml文件是自描述的,即文件內部不僅包含了數據還包含了對這些數據的描述信息。比如數據結構和類型。如果數據描述信息較多,關系數據庫就顯得力不從心了。
3、原生檢索方式,這時純xml數據庫獨有的特點,即純xml數據庫允許用戶使用對未作任何格式轉變的數據直接檢索。這就使得同一檢索式可以同時檢索不同格式xml文件。原生檢索方式對于擁有大量不同格式的xml文件的用戶來說是最好的檢索方式。
4、以分層的樹形結構描述數據,能夠檢索各個結點。
缺點:
1、數據冗余度高,由于xml文件中帶有大量非數據的內容,也許這些內容比數據本身還要多,不僅占用大量的磁盤空間,還會給操作文件帶來困難。假如你需要在一個1GB的文件中間頻繁插入或刪除數據。
2、檢索效率低下,如果數據訪問速度不高,檢索就可想而知了。前面提到的檢索效率高是指在xml數據庫中和關系數據庫中都只處理xml數據時。但相對于關系數據庫中的普通數據來說。純xml數據庫還遠達不到這樣的高效。這也是妨礙純xml數據廣泛應用的的主要缺陷。曾有人使用eXist作過一些測試,測試過程中,如果在1GB大小的xml文件檢索一個數據,所消耗的時間大概是煮一杯咖啡的時間。
3、純xml數據庫的XQuery語言標準不完善,現在XQuery語言的中不支持插入、刪除、更新操作,即使是部分xml數據庫廠家提供了類似功能,也不能得到廣泛的應用,因為沒有標準。它不能夠像SQL那樣功能強大。也由于這個缺陷給開發基于xml數據庫的應用程序帶來更多風險,只能針對某種數據庫開發,而且許多本應由XQuery本身提供的功能,比如插入、刪除、更新功能不得不由應用程序開發人員開發。
三、 本次測試中所使用的純xml數據庫介紹
本次測試中所使用的純xml數據庫有兩個,分別是eXist 1.0版和Xindice 1.1B4版,都是目前最高版本。關于它們如何安裝使用請參考文檔“eXist數據庫.doc”和“Xindice數據庫.doc”。這里只對最后測試結果作一簡單的介紹。
| eXist | Xindice |
安裝方便程度 | 方便 | 一般 |
使用方便程度 | 方便 | 一般 |
程序穩定性 | 不穩定 | 不穩定 |
在1M數據中檢索 | 少于1秒 | 堆棧溢出 |
10M | 索引前20秒,索引后3秒 | 堆棧溢出 |
100M | 堆棧溢出 | 堆棧溢出 |
300M | 堆棧溢出 | 堆棧溢出 |
500M | 堆棧溢出 | 堆棧溢出 |
800M | 堆棧溢出 | 堆棧溢出 |
1000M | 堆棧溢出 | 堆棧溢出 |
| | |
測試總結:
這兩個數據庫引擎非常不穩定,而且性能不好。
四、 選擇純xml數據庫還是關系數據庫?
這是一個比較重要的問題,雖然它們都是數據庫,但是除了數據庫本身有許多不同之外,在使用上也是大不相同。在項目中使用哪種數據庫還需要慎重考慮,根據上面的數據庫的對比分析,大體可以總結一下在何種情況下使用哪種數據庫:
1、 如果當前有許多xml文件,并且xml文件的格式不統一或者用表格的方法難以表示,那么這時最好選用純xml數據庫。
2、 如果在以后的工作中會產生大量格式或半格式的xml文件,那么選用純xml數據庫較合適。
3、 如果經常使用xml文件作為數據交換格式,則選擇純xml數據庫較好。
4、 如果你的數據之間有較多的關聯,就最好選用關系數據庫。純xml數據庫只能表示簡單的數據關系。
5、 如果對數據庫的性能要求較高的話,最好使用關系數據庫,關系數據庫已發展成熟,而純xml數據庫目前發展還不完善,比如,插入,刪除、更新操作還未有標準。