作為一種“資料庫”格式,XML有一些優勢:例如,它是自描述的(所用的標記描述了資料的結構和類型,儘管缺乏語義),可交換的(portable),能夠以樹型或圖形結構描述資料。同樣它也有缺點,例如,它顯得有些繁瑣,由於要對它進行解析和文本轉換,所以資料訪問速度較慢。
XML及其周邊技術是否可以算作“資料庫” -- 資料庫管理系統(DBMS)。答案是“在某種程度上是(sort
of)”。好的一面是,XML提供了許多資料庫所具備的東西:儲存(XML文檔), 模式(DTD, XML schema,RElAX NG 等等),
查詢語言(XQuery, XPath, XQL, XML-QL, QUILT等等),編程介面(SAX,
DOM,JDOM)等等。不好的一面在於,它缺少一些作為實用的資料庫所應具備的特性:高效的儲存,索引,安全,事務和資料一致性,多使用者訪問,觸發器,在查詢多個檔案等等。
因此,儘管在資料量小、使用者少和效能要求不太高的環境下,可以將XML文檔用作資料庫,但是卻不適用於使用者量大、資料完整性以及效能要求高的情形。
將一個XML檔案的schema映射到資料庫的schema有兩種方法:基於表格的映射和對象-關係映射。
基於表格的映射把XML檔案看作一個(或一組)表格,將各欄位資料以子項目的形式或以屬性的形式儲存。
基於表格的映射對存取關係型資料比較適用,比如在兩個關係型資料庫之間轉換資料。其明顯不足就是不適于格式不符的XML檔案。
對象-關係的映射方式將XML檔案中的資料視為特定的對象樹的模型。在這個模型中,元素及其類型、元素內容或混合內容(複合元素類型)通常被視為類。只具有PCDATA內容的元素(簡單元素類型)、屬性以及PCDATA都被當作簡單屬性。然後通過傳統的對象-關係映射技術或
SQL 3的物件檢視將該模型映射到關係型資料庫。也就是說,類被映射到表格,簡單屬性被映射到欄位,而值為對象屬性被映射為成對的主鍵/外鍵(primary
key/foreign key)。
原生XML資料庫的資料存放區
還可以將XML檔案中的資料存放區在原生XML資料庫(native XML
database)中。這麼做有幾個理由。首先,當你的資料是半結構化的資料時。也就是說,它的結構是普通的,但是如果將其映射到關聯式資料庫,結果是要麼出現大量空值(null)的欄位,要麼表格的數量過多,浪費空間或效率低下。雖然半結構化的資料可儲存到物件導向的或層次型資料庫中,你還可以選擇將它以XML檔案的形式儲存於原生XML資料庫。
將資料存放區在原生XML資料庫中的第二個理由是讀出速度。根據XML資料庫儲存資料的物理方式的不同,資料的讀出速度可以做到比關係型資料庫[的讀取速度]快得多。其原因是,原生XML資料庫對整個檔案一起進行實體儲存體,和[表示]檔案各個部分的物理(而不是邏輯)指標可採用同一儲存策略。這就可以不使用串連(joins)或只使用物理串連讀取檔案,無論哪種情況都比關係型資料庫所用的邏輯連接要快。
以上述銷售訂單檔案為例。在關係型資料庫中,它可能被存為四個表格 -- SalesOrders,
Items, Customers, 和 Parts --
讀取檔案時需要將這些表格結合起來。在原生XML資料庫中,整個檔案可被儲存在磁碟的一個地方,在讀取檔案或其片斷時只需要一次尋找和一次讀取操作。關聯式資料庫在讀取資料時則需要四次尋找以及至少四次讀取操作。
這樣做的一個明顯缺點就是,只有資料的讀取順序和寫入磁碟的順序相同時,才可以提高速度。如果你想要的資料檢視不同,比如只想要客戶及其訂單列表,效能可能比關聯式資料庫更差。所以,如果你的應用中是單個資料檢視為主,為了提高效能,才可以考慮將資料存放區到原生XML資料庫。
將資料存放區在原生XML資料庫中的第三個理由是你想利用XML的專屬特性,如執行XML查詢。由於今天以資料為中心的應用幾乎沒有這樣做的,而且關聯式資料庫正在逐步支援XML查詢語言,這個理由越來越不充分。
將資料存放區在原生XML資料庫中的一個問題是,大多數原生資料庫只能以XML[的形式]返回資料。(支援元素和屬性到應用程式變數綁定的只是少數)。如果你的應用程式需要另一種資料格式(很有可能),使用資料之前必須先解析XML。對本地的應用程式而言顯然是個缺點,而這種前期準備在(比如)ODBC中就不存在。對於將XML作為資料載體使用的分布式應用程式而言,這個問題不很嚴重,因為不管用的是哪種資料庫,這種前期工作必須要有。