XML 視圖定義了一種以 XML 為中心的,有關在關系數據庫中存儲的數據子集的視圖。通過向 XML 架構添加批注形成映射架構,可以定義一個 XML 視圖。在“在 XML 視圖中篩選值”(2002 年 11 月發表,InstantDoc ID 26715)與“定義 XML 視圖”(2002 年 12 月發表,InstantDoc ID 27106)兩篇文章中,我展示了如何使用多個批注,將數據庫表中行與列的數據映射到虛擬 XML 文檔中,該虛擬 XML 文檔是映射架構所定義的。在這篇專欄文章中,我將展示如何使用XML 對 ID 與 IDREF 屬性以及 IDREFS 屬性的內置支持。ID 和 IDREF 屬性的功能類似於數據庫中的鍵與外鍵;IDREFS 屬性則允許您指定一對多 (1:M) 的關系。您可以使用 ID 和 IDREF 屬性來避免在 XML 查詢結果中產生冗余數據。當數據庫包含一對多的關系時,就可能發生冗余情況。例如,正如在 Northwind 示例數據庫中所作的操作一樣,多個定單詳細信息記錄可能會引用同一種產品。通過使用每種產品元素各自的 ID 屬性與定單詳細信息的 IDREF 屬性來引用這種產品,您可以避免復制每種定單詳細信息中的產品數據。盡管多個定單的詳細信息都可能引用該產品元素,但是由於您只涉及一種產品元素,所以,使用這些屬性減少了 XML 查詢結果的大小。我還解釋了如何在 SQL Server 2000 與 SQL Server 2000 Web releases (SQLXML) 中使用映射架構的前綴批注,來生成包含 ID、IDREF 與 IDREFS 屬性的 XML。www.yestar2000iTbulo.comIxEPmFa
當一個架構使用 ID、IDREF 或 IDREFS 類型聲明屬性時,使用前綴批注。 (請注意在這篇專欄文章中,ID、IDREF 與 IDREFS 屬性總是指類型,而非名稱。 ????架構聲明的屬性可以使用任何有效的屬性名。) 這些特殊的屬性類型在 XML 文檔的不同元素間構建非層次關系。 (在非層次關系中,XML 文檔中的兩個元素相互關聯,但是其中任何一個元素都不是另外一個元素的祖先或後代。) 當構建非層次關系時,您使用 ID 屬性來指定一個在文檔范圍內使用的唯一鍵。 將這個唯一鍵當作 SQL Server 數據庫中的主鍵。 —正如您會想到的一樣,一個 IDREF 屬性引用一個包含 ID 屬性的元素,這個 ID 屬性的值與 IDREF 屬性的值相同 ?? 類似於 SQL Server 數據庫中的外鍵。 使用 ID 與 IDREF,您可以在 XML 文檔元素之間建立一對一 (1:1) 的關系。 IDREFS 與 IDREF 類似。它們只有一點不同:IDREFS 屬性包含一個或多個對元素的引用,這些元素含有與 IDREFS 屬性中指定值相同的 ID 屬性。 IDREFS 屬性中的各個引用被空格分隔。 如上所述,您可以用 IDREFS 來指定一對多的關系。www.yestar2000iTbulo.comIxEPmFa
您映射到 ID、IDREF 與 IDREFS屬性中的值必須符合特定的格式設置要求。一個 IDREFS 屬性的格式設置隱含約束您用作 ID 屬性的值;這些值不能包含空格字符(這是因為空格會將 ID 值分開)。對 ID 屬性值的約束只是更多約束的一部分。更多的約束規定您用作 ID、IDREF 的值以及 IDREFS 屬性的每個值必須滿足 NCName 生產(一套用於構造受約束字符串值的規則)的要求。NCName 生產是 XML 中為命名空間的規范而定義的。(有關這種生產的信息,請參閱 http://www.w3.org/tr/1999/rec-XML-names-19990114/)。NCName 生產指定了一個有效的 NCName?¨即一個有效 ID 值)必須是一個以字母或下劃線 (_) 字符開始的字符串,其後是可打印的字符或數字。因為 ID 值必須以字母或下劃線開始,所以需要前綴批注符合 NCName 生產約束。www.yestar2000iTbulo.comIxEPmFa
在文檔的所有元素中,ID 屬性值也必須是唯一的。即使元素名不同,也不允許重復。把 ID 屬性作為表的主鍵,只是這個鍵帶有額外約束,您不能在任何數據庫其他表中使用這個鍵值。考慮了這些約束之後,再看一下如何把 ID、IDREF 與 IDREFS 屬性映射到 SQL Server 數據庫中。www.yestar2000iTbulo.comIxEPmFa
因為在一個 XML 文檔內部 ID 屬性的值必須是唯一的,這個值非常容易把它本身映射到數據庫主鍵中。通常情況下,您能夠映射一個主鍵或一個 IDENTITY 列的值,來標識數據庫表中一個實體的單獨實例。在Listing 1所示的示例數據庫中,您使用一個唯一的 OrderID 來標識存儲在 Orders 表中的單個定單。您可以使用這些唯一值來產生一個 Order 元素的 ID 屬性。它將唯一標識從 SQL Server 獲取的 XML 結果中的定單。記住 ID 屬性必須滿足 XML 規范中定義的 NCName 生產的要求。但是,在 Listing 1 中,OrderID 列是以數字開頭的整型。另外,如果要把 Order 與 Product 元素合並到一個文檔中,您必須保證為它們的 ID 使用兩個不同的值。但是,在 Listing 1 中,OrderID 列與 ProductID 列中有重復的值。如果您使用這些列的值,XML 文檔將是無效的,這是因為一個定單與一種產品將共享同一 ID 屬性。使用前綴批注解決了這兩個問題。www.yestar2000iTbulo.comIxEPmFa
您在映射架構中使用 ID、IDREF 與 IDREFS 屬性的前綴批注來指定一個任意字符串,該字符串將被添加到從數據庫檢索到的值中,並且被映射到那些屬性中。通過讓您確保映射到 ID 屬性的數值型值滿足 NCName 生產的要求,前綴的使用就解決了第一個問題。您也可以使用非數值型前綴。前綴也能解決重復值的問題。通過為架構中的每個 ID、IDREF 或 IDREFS 屬性指定單獨的前綴批注,您可以從不同列中消除重復值(當您正在映射到 IDENTITY 列時,這是一個常見問題)。現在,讓我們看一個如何使用前綴批注的示例。www.yestar2000iTbulo.comIxEPmFa
示例使用 Listing 1 中 SQL 腳本定義的數據庫。這個腳本借用 Northwind 示例數據庫中的數據來生成三個表。它們把定單,定單上的行項(被稱為項並且存儲在 Order Details 表中),以及在行項中引用的產品聯系起來。您能夠通過使用 Listing 1 中的 SQL 腳本創建的數據庫來運行 XML 架構定義 (XSD) 映射架構示例。www.yestar2000iTbulo.comIxEPmFa
Listing 2顯示了圖 1所示生成 XML 結果的映射架構。在 Listing 2 的標注 C 中,映射架構聲明了一個名為 root 的頂級元素,它包含一系列 Order 元素和 Product 元素。標注 A 中的 Order 元素有一個唯一標識 Order 元素的 OrderID 屬性。前綴批注把 ORDER- 字符串添加到 OrderID 列的值中,這樣,OrderID 屬性的值就滿足了 NCName 生產的要求。每個 Order 元素還包含一個 ShipAddress 與 ShipCountry 元素,以及一組 LineItem 元素 ?? 每個元素用於一個定單的行項(在 Order Details 表上可找到)。每個 LineItem 元素包含一個名為 Product 的 IDREF 屬性。映射架構使用關系批注把 IDREF 屬性映射到 Products 表中,並且前綴批注指定 PRODUCT-的值,以使來自 ProductID 列的值是唯一的。在標注 B 中聲明的 Product 元素包含一個子元素,這個子元素含有 Product 名稱和名為 ProductID 的 ID 屬性。前綴批注規定應該把 PRODUCT-字符串添加到被映射列的值中,以確保 Product 元素的 ID 值與 Order 元素下 LineItem 元素的 IDREF 的值相同。www.yestar2000iTbulo.comIxEPmFa
為了執行示例中的代碼,需要使用 IIS 虛擬目錄管理創建一個虛擬目錄。這個虛擬目錄管理用於 Microsoft 管理控制台 (MMC) 的 SQLXML 插件。把虛擬目錄命名為 Jan2003,並在系統上選擇一個目錄作為本地路徑。(選擇 Inetpub\www 目錄下的目錄可以避免訪問安全問題。)在名為 Orders.xsd. 的文件中把 Listing 2 中的映射架構保存到目錄下。輸入安全參數以訪問數據庫,這個數據庫包含來自 Listing 1 的表。然後在 Settings 選項卡上選擇 Allow XPath 復選框。
在 Virtual Names 選項卡上,創建一個名為 Orders 的虛擬名稱,將其類型選為 schema,然後將路徑設置為 (.),它將使用為虛擬目錄指定的相同目錄。下一步,保存虛擬目錄。到目前為止,您已經安裝了 XML 視圖。它用 ID 與 IDREF 來定義非層次關系。www.yestar2000iTbulo.comIxEPmFa
現在,使用 Internet Explorer (IE) 5.0 或更高版本來執行 XML 視圖上的 XPath 查詢。通過使用 IDREF 屬性把 LineItems 元素與它們引用的產品關聯起來,該查詢返回一個 XML 結果。要執行一個查詢,在地址欄中鍵入 http://localhost/Jan2003/Orders/Orders.xsd/root。Jan2003/Orders/Orders.xsd 選擇 Listing 2 的映射架構所定義的 XML 視圖,/root 是檢索所有客戶的 XPath 查詢。查詢產生如圖 1 所顯示的結果。www.yestar2000iTbulo.comIxEPmFa
學會如何從 SQL Server 內部數據生成 ID、IDREF 與 IDREFS 屬性之後,就可以在下面兩種情況下使用這種技術:架構定義 ID、IDREF 或 IDREFS 屬性,或者您希望通過消除低級層次結構中的重復數據來減少 XML 結果的大小。www.yestar2000iTbulo.comIxEPmFa