XML 视图中的 ID 属性

2008-04-02 10:49:29来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

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 属性的 XMLwww.yestar2000chinai tp ow er.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.yestar2000chinai tp ow er.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.yestar2000chinai tp ow er.comIxEPmFa

在文档的任何元素中,ID 属性值也必须是唯一的。即使元素名不同,也不允许重复。把 ID 属性作为表的主键,只是这个键带有额外约束,您不能在任何数据库其他表中使用这个键值。考虑了这些约束之后,再看一下如何把 ID、IDREF 和 IDREFS 属性映射到 SQL Server 数据库中。www.yestar2000chinai tp ow er.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.yestar2000chinai tp ow er.comIxEPmFa

您在映射架构中使用 ID、IDREF 和 IDREFS 属性的前缀批注来指定一个任意字符串,该字符串将被添加到从数据库检索到的值中,并且被映射到那些属性中。通过让您确保映射到 ID 属性的数值型值满足 NCName 生产的需要,前缀的使用就解决了第一个问题。您也能够使用非数值型前缀。前缀也能解决重复值的问题。通过为架构中的每个 ID、IDREF 或 IDREFS 属性指定单独的前缀批注,您能够从不同列中消除重复值(当您正在映射到 IDENTITY 列时,这是个常见问题)。现在,让我们看一个如何使用前缀批注的示例。www.yestar2000chinai tp ow er.comIxEPmFa

示例使用 Listing 1 中 SQL 脚本定义的数据库。这个脚本借用 Northwind 示例数据库中的数据来生成三个表。他们把定单,定单上的行项(被称为项并且存储在 Order Details 表中),连同在行项中引用的产品联系起来。您能够通过使用 Listing 1 中的 SQL 脚本创建的数据库来运行

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 生成直方图

下一篇: SQLSERVER中对查询结果随机排序