关闭

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

683人阅读 评论(0) 收藏 举报

查了下相关资料,目前有两种实现方式,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>  


 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:245319次
    • 积分:3374
    • 等级:
    • 排名:第10000名
    • 原创:21篇
    • 转载:306篇
    • 译文:3篇
    • 评论:42条