在XML中如何实现主外键约束关系

本文介绍了如何使用XML Schema中的键(key)与键引用(keyref)来定义文档内的引用关系,这种方式可以有效解决复杂的多对多关系映射问题,类似于关系数据库中的外键约束。

查了下相关资料,目前有两种实现方式,1是通过DTD,2是Schema

1 DTD作为XML的一种老结构描述方式,采用的不同于XML的语法规则,而且不支持数据类型,基本被淘汰,在此不议 。

2 Schema是完善了DTD的不足,以下是实现方式,相信有些简单基础的朋友都能看明白:

如果曾经尝试用   DTD   来描述具有复杂关系映射的关系数据库,那么好象必须使用   ID-IDREF指向机制。例如,在一个结构中,两个实体通过一张关系表表示相互联系的多对多关系(例如,BBS论坛应用中用户和帖子),简单的   XML   父子关系是不够的。然而,ID   和   IDREF   有其自身弱点:在整个文档中,ID   必须是唯一的,并且   IDREF   声明没有指定   IDREF   属性的实例必须引用的元素类型。XML   Schema,提供了一种与关系数据库中声明的外键关系几乎相同的方式来指定这些指向关系。例如,BBS论坛中用户表与帖子表有一个外键关系,该外键关系不能用XML中简单的父子关系来表达。  
   
  key,keyref示例:bbs.xsd  
  在   PubUser   元素的复合类型中的键定义声明了   nUserID   属性必须出现在所有   nUserID   元素中,并且在   PubUser   元素上的所有   nUserID   属性中它必须是唯一的(注意,这与   ID   不同,无论与该元素相关的是什么元素,该   ID   是唯一的)。然后,在   BbsThread   元素的复合类型中的   keyref   定义声明了   nUserID   字段必须与文档中的   PubUser   元素的   nUserID   字段之一到处相匹配。这种键机制的另一好的特性是,该键可能是强类型   -与   ID   和   IDREF   相反,它们必须是   XML   名称标记   -所以您可以在表中不加修改地使用自动递增的主键。定义组合键以便创建主键(用   key   元素)和外键(用   keyref   元素)也是可能的,这些键直接映射到现有关系数据库中出现的主键(或外键)。  
   
   
   
  bbs.xsd  
  <?xml   version="1.0"   encoding="utf-8"?>  
  <xsd:schema   xmlns:xsd="http://www.w3.org/2001/XMLSchema"   elementFormDefault="qualified"   attributeFormDefault="unqualified">  
      <xsd:element   name="moonpiazza">  
          <xsd:complexType>  
              <xsd:sequence>  
                  <xsd:element   name="PubUser"   maxOccurs="unbounded">  
                      <xsd:complexType>  
                          <xsd:attribute   name="nUserID"   type="xsd:int"/>  
                          <xsd:attribute   name="cUserName"   type="xsd:string"/>  
                      </xsd:complexType>  
                      <xsd:key   name="PubUserPK"> -->   定义键   PubUserPK  
                          <xsd:selector   xpath=".//PubUser"/> -->   指明元素路径  
                          <xsd:field   xpath="@nUserID"/> -->   指明元素名称  
                      </xsd:key>  
                  </xsd:element>  
                  <xsd:element   name="BbsThread"   maxOccurs="unbounded">  
                      <xsd:complexType>  
                          <xsd:attribute   name="nBbsThreadID"   type="xsd:int"/>  
                          <xsd:attribute   name="nUserID"   type="xsd:int"/>  
                          <xsd:attribute   name="cThreadTitle"   type="xsd:string"/>  
                      </xsd:complexType>  
                      <xsd:key   name="BbsThreadPK"> -->   定义键  
                          <xsd:selector   xpath=".//BbsThread"/>  
                          <xsd:field   xpath="@nBbsThreadID"/>  
                      </xsd:key>  
                      <xsd:keyref   name="BbsThreadFK"   refer="PubUserPK"> -->定义键BbsThreadFK,refer指明映射到键PubUserPK  
                          <xsd:selector   xpath=".//BbsThread"/> -->   指明元素路径  
                          <xsd:field   xpath="@nUserID"/> -->   指明元素名称  
                      </xsd:keyref>  
                  </xsd:element>  
              </xsd:sequence>  
          </xsd:complexType>  
      </xsd:element>  
  </xsd:schema>  


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值