關系或 XML 數據模型
如果您的數據是高度結構化的,具有已知的架構,則關系模型可能對于數據存儲最為有效。Microsoft SQL Server 提供了您可能需要的必要功能和工具。另一方面,如果結構是靈活的(半結構化和非結構化)或未知的,則必須適當地考慮如何對此類數據進行建模。
如果您需要獨立于平臺的模型,以便確保使用結構化和語義標記的數據的可移植性,則 XML 是一種不錯的選擇。而且,如果滿足下列某些屬性,則它還是一種適當的選擇:
• 您的數據比較稀疏,或者您不了解數據的結構,或者數據的結構將來可能發生重大更改。
• 您的數據表示容器層次結構(與實體中的引用相對),并且可能是遞歸的。
• 您的數據具有內在的順序。
• 您希望對數據進行查詢,或者基于其結構更新部分數據。
如果上述任一條件都不滿足,則您應該使用關系數據模型。例如,如果您的數據是 XML 格式,但您的應用程序很少使用數據庫來存儲和檢索數據,則 [n]varchar(max) 列就能滿足您的全部需要。在 XML 列中存儲數據可以帶來其他好處 - 引擎將檢查數據格式規范或者有效,并且支持對 XML 數據進行細粒度的查詢和更新。
在 SQL Server 2005 中存儲 XML 數據的理由
以下為一些使用 SQL Server 2005 中的原生 XML 功能而不是在文件系統中管理 XML 數據的理由:
• 您希望使用數據庫服務器的管理功能來管理 XML 數據(例如,備份、恢復和復制)。
• 您希望以高效的方式和事務處理方式來共享、查詢和修改 XML數據。細粒度的數據訪問對于您的應用程序而言很重要。例如,您可能需要提取 XML 文檔內部的某些節,或者您可能需要插入一個新節而不是替換整個文檔。
• 您具有關系數據和 SQL 應用程序,您希望在應用程序內部的關系數據和 XML 數據之間進行互操作。對于跨域應用程序,您需要有關查詢和數據修改的語言支持。
• 您希望服務器能夠保證數據格式規范,并能夠視情況根據 XML 架構來驗證數據。
• 您需要將 XML 數據編入索引以便實現高效的查詢處理和良好的可伸縮性,并且使用一流的查詢優化器。
• 您希望對 XML 數據進行 SOAP、ADO.NET 和 OLE DB 訪問。
如果不滿足上述任一條件,您最好將數據存儲為非 XML 的大型數據類型,如 [n]varchar(max) 或 varbinary(max)。
XML 存儲選項
SQL Server 2005 中的 XML 的存儲選項如下所示:
• 本機存儲采用 XML 數據類型:
用能夠保留數據的 XML 內容(如容器層次結構、文檔順序、元素和屬性值等等)的內部表示形式存儲數據。具體說來,就是保留 XML 數據的信息集內容(有關信息集的詳細信息,請參閱 http://www.w3.org/TR/xml-infoset)。它可能不是文本 XML 的精確副本,因為未保留以下信息:無關緊要的空格、屬性順序、命名空間前綴和 XML 聲明。
對于類型化的 XML 數據類型(即綁定到 XML 架構的 XML 數據類型)而言,負責向信息集添加類型信息的后架構驗證信息集 (Post Schema Validation Infoset, PSVI) 以內部表示形式編碼。這會顯著提高分析速度。
• XML 和關系存儲之間的映射:
使用帶有批注的架構 (AXSD),XML 將被分解到一個或多個表中的列,并且在關系級別保留數據的保真度 - 保留層次結構,但忽略元素順序。架構不能是遞歸的。
• 大型對象存儲([n]varchar(max) 和 varbinary(max)):
存儲了數據的精確副本。這對于特殊用途的應用(如法律文檔)很有用。大多數應用不要求精確副本,XML 內容(信息集保真度)即可滿足需要。
通常情況下,可能需要組合使用這些方法。例如,您可能需要用 XML 數據類型列存儲 XML 數據,并將其中的屬性提升到關系列中。相反,您可能希望使用映射技術,將非遞歸部分存儲到非 XML 列中,而僅將遞歸部分存儲到 XML 數據類型列中。
XML 技術的選擇
XML 技術(原生 XML 與 XML 視圖)的選擇通常取決于下列因素:
• 存儲選項:
您的 XML 數據可能更適合于大型對象存儲(例如,產品手冊),或者更適合于存儲在關系列中(例如,轉換到 XML 的行項目)。每個存儲選項都在不同程度上保留了文檔保真度。
• 查詢功能:
基于查詢的性質以及對 XML 數據進行查詢的程度,您可能發現一個存儲選項比其他存儲選項更為適合。細粒度的 XML 數據查詢(例如,XML 節點上的謂詞計算)在這兩個存儲選項中受到不同程度的支持。
• 將 XML 數據編入索引:
您可能希望將 XML 數據編入索引,以便提高 XML 查詢性能。索引選項隨存儲選項的不同而不同;您需要進行適當的選擇以優化工作量。
• 數據修改功能:
某些工作量涉及到對 XML 數據進行細粒度的修改(例如,在文檔內添加新節),而其他工作量則不涉及(例如,Web 內容)。對于您的應用程序而言,數據修改語言支持可能很重要。
• 架構支持:
您的 XML 數據可能通過架構進行描述,這可能是也可能不是 XML 架構文檔。對架構綁定 XML 的支持取決于 XML 技術。
不用說,不同的選擇具有不同的性能特性。
原生 XML 存儲
可以將您的 XML 數據存儲在服務器的 XML 數據類型列中。在下列情況下,這將是一個適當的選擇:
• 您需要一種在服務器上存儲 XML 數據的簡單方法,同時需要保留文檔順序和文檔結構。
• 您的 XML 數據可能有也可能沒有架構。
• 您需要查詢和修改您的 XML 數據。
• 您需要將 XML 數據編入索引以便實現更為快速的查詢處理。
• 您的應用程序需要系統目錄視圖以管理您的 XML 數據和 XML 架構。
當您的 XML 文檔具有多種結構時,或者當您的 XML 文檔符合不同的或復雜的架構,而這些架構很難映射到關系結構時,原生 XML 存儲將很有用。
示例:使用 XML 數據類型對 XML 數據進行建模
考慮一個 XML 格式的產品手冊,其中每個主題對應單獨的一章,而每章內又有多節。一節可以包含多個子節,因此 是一個遞歸元素。產品手冊包含大量混合內容、圖表和技術資料;數據是半結構化的。用戶可能希望對感興趣的主題執行與上下文有關的搜索(例如,在有關"索引"的章內部搜索有關"聚集索引"的節),并且查詢技術數量。
XML 文檔的合適存儲模型是 XML 數據類型列。這可以保留 XML 數據的信息集內容。將 XML 列編入索引可以提高查詢性能。
示例:保留 XML 數據的精確副本
假設政府法令要求您保留 XML 文檔(例如,已簽署的文檔、法律文檔或股票交易訂單)的精確文本副本。您可能需要將您的文檔存儲在 [n]varchar(max) 列中。
對于查詢,可在運行時將數據轉換為 XML 數據類型,然后對其執行 Xquery。運行時轉換可能代價高昂,尤其是在文檔很大時。如果您經常進行查詢,可以采用冗余方式將文檔存儲在 XML 數據類型列中并將其編入索引,同時從 [n]varchar(max) 列返回精確的文檔副本。
XML 列可能是基于 [n]varchar(max) 列的計算列。您不能在 XML 計算列上創建 XML 索引,也不能在 [n]varchar(max) 或 varbinary(max) 列上生成 XML 索引。
XML 視圖技術
通過在 XML 架構和數據庫的表之間定義映射,可以創建持久性數據的"XML 視圖"。可以使用 XML 批量負載來填充使用 XML 視圖的基礎表。您可以查詢使用 XPath 1.0 的 XML 視圖;該查詢將被轉換為針對表的 SQL 查詢。與此類似,更新也會被傳遞到這些表。
在以下情況下,此技術很有用:
• 您希望擁有以 XML 為中心的編程模型,該模型使用現有關系數據上的 XML 視圖。
• 您的 XML 數據具有架構 (XSD, XDR),它可能由外部合作伙伴提供。
• 數據的順序不重要,或者您的可查詢數據不是遞歸的,或者預先已經知道最大遞歸深度。
• 您希望通過使用 XPath 1.0 的 XML 視圖來查詢和修改數據。
• 您希望批量加載 XML 數據,并將其分解到使用 XML 視圖的基礎表中。
這方面的例子包括以 XML 形式公開以便用于數據交換和 Web 服務的關系數據,以及具有固定架構的 XML 數據。有關詳細信息,請參閱 SQLXML 開發人員中心。
示例:使用帶有批注的 XML 架構 (AXSD) 對數據進行建模
假設您現有一些希望以 XML 形式進行操作的關系數據(例如,客戶、訂單和行項目)。請使用 AXSD 在關系數據上定義 XML 視圖。通過 XML 視圖,可以將 XML 數據批量加載到表中,以及使用 XML 視圖查詢和更新關系數據。如果您需要在自己的 SQL 應用程序持續工作時與其他應用程序中的 XML 標記交換數據,則該模式很有用。
混合模型
很多時候,適合將關系數據和 XML 數據類型列結合起來進行數據建模。可以將 XML 數據中的某些值存儲在關系列中,而將其余或全部 XML 值存儲在 XML 列中。這可能會產生更好的性能(例如,可以完全控制在關系列上創建的索引)和鎖定特性。然而,這需要您承擔更多的責任來管理數據存儲。
要存儲在關系列中的值取決于您的工作負荷。例如,如果您基于路徑表達式 /Customer/@CustId 檢索全部 XML 值,則通過將 CustId 屬性的值提升到關系列中以及將其編入索引,可能產生更高的查詢性能。另一方面,如果您的 XML 數據被廣泛且非冗余地分解到關系列中,則重新組合的成本可能很大。
對于高度結構化的 XML 數據(例如,表的內容已經轉換到 XML),可以將所有值映射到關系列(可能使用 XML 視圖技術)。
(T114)