视图中的ID属性

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

XML视图定义了一种以XML为中心的,有关在关系中存储的数据子集的视图。通过向XML架构添加批注形成映射架构,可以定义一个XML视图。在“在XML视图中筛选值”(2002年11月发表,InstantDocID26715)与“定义XML视图”(2002年12月发表,InstantDocID27106)两篇文章中,我展示了如何使用多个批注,将数据库表中行与列的数据映射到虚拟XML文档中,该虚拟XML文档是映射架构所定义的。在这篇专栏文章中,我将展示如何使用XML对IDIDREF属性以及IDREFS属性的内置支持。IDIDREF属性的功能类似于数据库中的键与外键;IDREFS属性则允许您指定一对多(1:M)的关系。您可以使用IDIDREF属性来避免在XML查询结果中产生冗余数据。当数据库包含一对多的关系时,就可能发生冗余情况。例如,正如在Northwind示例数据库中所作的操作一样,多个定单详细信息记录可能会引用同一种产品。通过使用每种产品元素各自的ID属性与定单详细信息的IDREF属性来引用这种产品,您可以避免复制每种定单详细信息中的产品数据。尽管多个定单的详细信息都可能引用该产品元素,但是由于您只涉及一种产品元素,所以,使用这些属性减少了XML查询结果的大小。我还解释了如何在2000与SQLServer2000Webreleases(SQLXML)中使用映射架构的前缀批注,来生成包含IDIDREF与IDREFS属性的XML。

当一个架构使用IDIDREF或IDREFS类型声明属性时,使用前缀批注。(请注意在这篇专栏文章中,IDIDREF与IDREFS属性总是指类型,而非名称。????架构声明的属性可以使用任何有效的属性名。)这些特殊的属性类型在XML文档的不同元素间构建非层次关系。(在非层次关系中,XML文档中的两个元素相互关联,但是其中任何一个元素都不是另外一个元素的祖先或后代。)当构建非层次关系时,您使用ID属性来指定一个在文档范围内使用的唯一键。将这个唯一键当作SQLServer数据库中的主键。—正如您会想到的一样,一个IDREF属性引用一个包含ID属性的元素,这个ID属性的值与IDREF属性的值相同??类似于SQLServer数据库中的外键。使用IDIDREF,您可以在XML文档元素之间建立一对一(1:1)的关系。IDREFS与IDREF类似。它们只有一点不同:IDREFS属性包含一个或多个对元素的引用,这些元素含有与IDREFS属性中指定值相同的ID属性IDREFS属性中的各个引用被空格分隔。如上所述,您可以用IDREFS来指定一对多的关系。

您映射到IDIDREF与IDREFS属性中的值必须符合特定的格式设置要求。一个IDREFS属性的格式设置隐含约束您用作ID属性的值;这些值不能包含空格字符(这是因为空格会将ID值分开)。对ID属性值的约束只是更多约束的一部分。更多的约束规定您用作IDIDREF的值以及IDREFS属性的每个值必须满足NCName生产(一套用于构造受约束字符串值的规则)的要求。NCName生产是XML中为命名空间的规范而定义的。(有关这种生产的信息,请参阅http://www.w3.org/tr/1999/rec-xml-names-19990114/)。NCName生产指定了一个有效的NCName?¨即一个有效ID值)必须是一个以字母或下划线(_)字符开始的字符串,其后是可打印的字符或数字。因为ID值必须以字母或下划线开始,所以需要前缀批注符合NCName生产约束。

在文档的所有元素中,ID属性值也必须是唯一的。即使元素名不同,也不允许重复。把ID属性作为表的主键,只是这个键带有额外约束,您不能在任何数据库其他表中使用这个键值。考虑了这些约束之后,再看一下如何把IDIDREF与IDREFS属性映射到SQLServer数据库中。

因为在一个XML文档内部ID属性的值必须是唯一的,这个值非常容易把它本身映射到数据库主键中。通常情况下,您能够映射一个主键或一个IDENTITY列的值,来标识数据库表中一个实体的单独实例。在Listing1所示的示例数据库中,您使用一个唯一的OrderID来标识存储在Orders表中的单个定单。您可以使用这些唯一值来产生一个Order元素的ID属性。它将唯一标识从SQLServer获取的XML结果中的定单。记住ID属性必须满足XML规范中定义的NCName生产的要求。但是,在Listing1中,OrderID列是以数字开头的整型。另外,如果要把Order与Product元素合并到一个文档中,您必须保证为它们的ID使用两个不同的值。但是,在Listing1中,OrderID列与ProductID列中有重复的值。如果您使用这些列的值,XML文档将是无效的,这是因为一个定单与一种产品将共享同一ID属性。使用前缀批注解决了这两个问题。

1

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值