在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>
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>
相关文章推荐
- TestNG入门教程-11-如何通过testng.xml来实现设置依赖关系
- 如何在SQL Server 2005中建立主外键关系?如何实现级联删除效果?
- 如何在SQL Server 2005中建立主外键关系?如何实现级联删除效果?
- 如何在SQL Server 2005中建立主外键关系?如何实现级联删除效果?
- 关于spring 2.0自定义xml 标记 (二 如何实现)
- FMI飞马网 | 【线上直播】如何处理好横向关系 在协同与合作中实现双赢(下)
- 如何实现关系表的级联删除(ON DELETE CASCADE的用法)
- xsd中包含有List、数组类型定义,在相应的xml中如何实现相应的值?
- MVC3学习第九章 葵花点穴手之势如闪电----MVC3下实现用户信息的查询以及通过实体模型建立商品和类别的主外键关系
- Hibernate如何实现数据表映射的继承关系
- 用xpo实现dc技术的关键点-XPO是如何处理接口类型与真实类型的对应关系的
- hibernate中如何实现两个无关系表的左联的问题
- c#如何实现从xml中加载树目录,并且显示完整的Text
- 如何在代码和xml中实现中划线的方法!
- xml 技术的有哪些方面?如何实现的?
- 如何删除有约束关系的数据
- 表之间关系,如何实现?
- 关于spring 2.0自定义xml 标记 (二 如何实现)
- XSLT如何实现xml的格式化输出
- schema实现对xml的约束