在 XML 數據庫發展的早期,在所謂的原生 XML 數據庫(NXD)和支持 XML 的常規關系數據庫管理系統(RDBMS)之間存在很大的差異。NXD 針對存儲 XML 文檔做了優化,而老式的 RDBMS 只對可能包含 XML 的常規二進制大對象(BLOB)增加了一些語法改進。
現在,NXD 仍然是 NXD,但是更先進了。與此同時,成熟 RDBMS 的供應商努力改進了 XML 文檔的存儲方法。XML 片段不再被存儲到 BLOB 中,而是存儲在樹結構中。典型的 XML 文檔的基本性質就是采用樹結構,所以這一改進大大提高了 RDBMS 處理 XML 文檔的能力。
從早期實現到現在的成熟解決方案之間的這段時間裡,在 XML 文檔的查詢語言標准化方面有了一些重要的進展 —— 其中最重要的是 XQuery 1.0 和 XML Path Language (XPath) 2.0。XQuery 的概念經過了多年開發;最終結果與早期版本有相似之處,但是更加成熟。與 Structured Query Language (SQL) 一樣,XQuery 也重視促進供應商獨立性和重用。
為什麼需要 XML 數據庫?
常規數據庫可以存儲高度結構化的數據和非結構化數據。這兩種數據都需要使用不會頻繁變化的數據結構。但是,關系數據庫的弱勢在於存儲半結構化文檔方面。與結構化數據不同,這些文檔在文檔元素的次序和元素相互嵌套的方式方面有很大的自由度。與非結構化數據不同,可以使用描述性標簽對元素進行分類。這些元素往往是細粒度的。
能夠在關系結構中存儲半結構化數據嗎?當然可以,但是最終很可能形成頻繁變化的特殊數據結構,因為一般化的數據結構會喪失標簽的描述性;或者使用內容管理系統使用的那種抽象模型,但是這會把數據與元數據混在一起。
另一方面,XML 格式非常適合描述半結構化數據。另外,可以輕松地維護數據模型。添加新的元素名並不會改變數據結構 —— 它總是樹結構。只需修改 XML 模式,XML 模式描述在樹結構中使用和關聯元素名的方式。
對於工作履歷、產品說明和客戶訂單等文檔,XML 可能是最合適的格式。同時,XML 也能夠描述結構化和非結構化數據。
那麼,還需要關系數據庫嗎?
在創建新的軟件解決方案時,答案可能是 “不需要”。如果您有一個能夠存儲半結構化數據的解決方案,那麼也能用它存儲結構化和非結構化數據。用一個存儲解決方案存儲所有數據,就能夠方便地連接和查詢所有數據,這比集成多個存儲源中的數據容易得多。
但是准確地說,如果要對這個問題回答 “不需要”,那麼您的大多數數據應該是半結構化的文檔。但是,如果大多數數據更適合采用高度結構化的實體-關系模型,數據不太像文檔並且關系更復雜,那麼選擇 NXD 可能並不合適。
那麼,如何判斷數據的性質呢?另外,如果結構化、半結構化和非結構化數據的數量大體相當,那麼怎麼辦呢?對於這些不確定的情況,好消息是當今的傳統數據庫已經能夠很好地處理 XML 文檔或 XML 文檔的片段了。在不同的數據庫中,訪問這些 XML 片段的方式可能有所差異。但是,它們有一點是相同的:它們都使用 XQuery 1.0 規定的構造。
解決方案
市場上的一些產品以不同的方式實現 XML 數據庫,包括 Xindice、Tamino、X-Hive、Oracle 和 Microsoft® SQL Server。但是,我不打算在本文中討論這些產品。完整全面地比較所有產品是不可能的;另外,本文發表在 IBM 的網站上,而 IBM 是提供 XML 數據庫解決方案的廠商之一,因此在此對各種產品發表評論也不容易獲得您的信任。雖然我是一名獨立的作家,但並不能保證中立性問題。
我能做的是討論具備 pureXML 特性的 IBM DB2 Express-C 並與典型的 NXD 做比較。我選擇開放源碼項目 eXist-DB 作為 NXD 的代表。eXist 和 DB2 Express-C 都是免費的,都提供了大量用戶友好的功能。
如果您需要存儲非常多的數據,那麼我建議您購買 DB2 的商業版本。您可能覺得 DB2 過分繁雜,但是可以先在桌面計算機或筆記本上安裝 DB2 Express-C,體會一下 pureXML 功能,這是很容易的。盡管 eXist 沒有商業版本,但是如果 eXist 的功能無法滿足性能和可伸縮性需求,Mark Logic 是不錯的替代產品。可以使用 30 天試用許可證評估 Mark Logic,也可以使用存儲空間限制為 100MB 的社區版本。
我可以想像到讀者需要對 DB2 和 Oracle 等相似產品的比較。但是,在網上可以找到對這兩個產品的各種評論。更基礎性的討論是對 DB2 Express-C 中的 pureXML 特性與 eXist-DB 或 Mark Logic 做比較。
原生 XML 數據庫
與大多數產品類別名稱一樣,原生 XML 數據庫 這個詞也有點兒容易引起誤解。它引出了幾個問題:什麼是數據庫?什麼是原生 XML?DB2 是 NXD 嗎?
根據 Wikipedia 上的說法,“計算機數據庫是存儲在計算機系統中的記錄或數據的結構化集合。” 原生 XML 是使用與 XML 相關的技術,但是不與非 XML 技術混合使用。這意味著能夠使用 XQuery 和 XPath 而不需要借助於 SQL。IBM 預料到人們會問 DB2 是否是原生 XML,所以把 DB2 的 XML 特性命名為 pureXML。我將在 下一節 討論 pureXML 的定義。
在比較 NXD 和支持 XML 的 RDBMS 時,我認為典型的 NXD 也可以被看作文檔存儲庫。但是,Alfresco 和 Magnolia 等產品使用了文檔存儲庫 這個詞,而這些產品是在現有數據庫之上建立的,它們缺少 eXist 和 Mark Logic 提供的那種基礎結構,尤其是以高效的方式執行 XQuery 的能力。它們主要關注比較高層的功能,比如工作流和用戶友好的界面。NXD 把這些功能留給產品的用戶去開發。它們只提供低層的文檔存儲庫 API,比如 Web-based Distributed Authoring and Versioning (WebDAV) 或定制的 REST 式連接器。
因此,典型 NXD 的特點是以高效的方式存儲 XML 文檔。它提供 XQuery 技術和基本的文檔存儲庫功能層。
NXD 往往是面向資源的,這實際上意味著可以使用 Uniform Resource IdentifIErs (URI) 標識存儲庫中存儲的內容。可以通過 HTTP 或 WebDAV 使用相同的 URI 訪問數據,這就消除了連接問題。
但是,把數據視為資源也有缺點。文檔相互分隔導致很難在多個文檔的數據之間建立關系。如果一個文檔包含其他文檔引用的可靠數據,就很難維護引用完整性。比較大的 XML 數據庫供應商提供了對多個文檔的數據實施約束的特性。但是,這個特性還沒有標准化。
pureXML
盡管 IBM 避免使用 “原生 XML 數據庫” 這個術語,但是仍然希望他們的解決方案能夠體現 XML 的本質。DB2 Express-C 並不是典型的 NXD,但是它具備 NXD 的一些特點。從某個角度來看,DB2 像是常規的 RDBMS 加上支持 XML 的列。如果您只需要使用關系數據庫,而不打算使用 XML 技術,那麼只需忽略支持 XML 的列。但是,如果需要 XML 特性,支持 XML 的列就能夠提供相當好的 XML 功能。
pureXML 這個名稱有兩方面的意義:
XML 數據按照原生的樹格式與關系數據分開存儲。
可以通過單一 XML 接口訪問所有數據,包括關系數據和 XML 數據。
XQuery 1.0 不僅能夠查詢 XML 文檔。IBM 提供的 XQuery 函數允許查詢關系數據,並與來自支持 XML 的列的 XML 結果組合在一起。可以以 XML 格式返回組合數據的結果。
DB2 是純粹的數據庫基礎結構。與許多 NXD 不同,它不提供基本的文檔存儲庫功能層。這並不意味著不能使用 DB2 實現文檔存儲庫。目前,Alfresco 等大多數文檔存儲庫都是在非 XML RDBMS 之上實現的,而不是依賴於 NXD。使用 DB2 作為這些存儲庫的基礎至少不會損害它們目前提供的功能,而且有可能使用 XML 存儲功能提供更靈活的數據模型。
Alfresco 等產品可能需要過一段時間才能利用 pureXML 等特性。原因在於這些產品不願意與單一數據庫產品捆綁在一起。盡管 XQuery 1.0 已經發布了,但是在數據庫產品中使用 XQuery 語言的方式仍然不夠標准化。對於這些產品,比較安全的做法是推遲使用 XML 數據庫的新功能,等到 XQuery 和連接協議的使用方式比較統一了,再采用這些新功能;目前,只使用 WebDAV 或關系數據庫連接器等比較統一的實現。
在什麼情況下可以使用 DB2 的 pureXML 功能?
答案很簡單。大多數 IT 解決方案已經在關系數據庫方面投入了大量資金。即使關系數據庫缺少解決方案所需的靈活性,與替代技術相比,它們仍然更成熟,更適合滿足復雜的業務需求。
即使公司希望采用 XML 技術,也不太可能願意放棄多年來在關系數據庫上的開發成果並用 NXD 替代它。另外,盡管可以在保留現有關系數據庫的同時使用 NXD,但是這會在集成多個數據源的數據方面產生新的難題。考慮一下事務處理和引用完整性,就能夠明白這有多麼困難。盡管這些問題不是無法解決的,但是能夠處理這些問題的綜合解決方案可以避免許多麻煩。
pureXML 技術能夠把關系數據和 XML 數據組合在一起,這有助於更順利地遷移到 XML 技術,或者進行部分遷移。
結束語
盡管 XML 文檔能夠描述結構化數據,但是對於描述多個文檔中的結構化數據之間的關系和維護引用完整性,包含許多 XML 文檔的 NXD 可能不是最好的解決方案。即使能夠管理這些關系(比如使用 XPointer),使用方式也不是標准化的。
最好的建議是,用合適的工具做合適的事。但是,同時使用 NXD 和 RDBMS 會產生集成難題。DB2 的 pureXML 特性能夠把關系數據和 XML 數據兩方面的優勢結合在一起,能夠同時存儲結構化和半結構化數據。對於非結構化數據的存儲,NXD 和 RDBMS 是同樣合適的。
如果您需要的實際上是文檔存儲庫,而不是數據庫,那麼應該問另外一個問題。您的需求主要關注文檔存儲庫的前端功能,還是後端功能?如果需要大量最終用戶功能,比如管理界面、工作流和可視化,那麼市場上有許多產品提供這種支持,比如 Alfresco。如果您更關心強大的查詢機制(比如 XQuery 和全文搜索)和高效地存儲半結構化數據,那麼 eXist 或 Mark Logic 等 NXD 可能是您需要的。
數據庫解決方案領域由幾個大型供應商控制著。IBM 是其中之一。NXD 仍然是一個有許多小公司參與競爭的市場。這些小公司是否能夠在競爭中生存下去,它們是否會被大公司收購(比如 EMC 收購了 X-Hive),它們是否會喪失市場份額,這些都無法確定。目前的趨勢很明顯,RDBMS 供應商不願意把市場份額讓給 NXD,它們會提供完全成熟而且更全面的 XML 解決方案,以此滿足客戶的需要。