您的位置:首页 > 其它

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

2007-09-26 13:36 288 查看
查了下相关资料,目前有两种实现方式,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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: