XSD的xs:key和xs:keyref怎么实现主键外键约束

月夜之吻
发布: 2025-12-24 11:09:10
原创
359人浏览过
xs:key和xs:keyref是在XSD中实现XML实例内引用完整性验证的机制,非数据库主外键;xs:key定义作用域内唯一非空标识,xs:keyref强制字段值匹配某xs:key值,二者均受限于作用域、简单XPath及单文档约束。

xsd的xs:key和xs:keyref怎么实现主键外键约束

xs:keyxs:keyref 是 XSD 中用于在 XML 文档内实现“类主键-外键”约束的机制,但要注意:它们**不是数据库意义上的主外键**,而是在 XML 实例验证阶段强制要求的引用完整性检查,不涉及存储或执行逻辑。

xs:key 定义唯一标识(类似主键)

它声明某个元素(或属性)的值在整个文档范围内必须唯一,且非空。常用于标记“可被引用的主标识”。

  • 必须放在 <element></element><complextype></complextype> 内的 <unique></unique><key></key><keyref></keyref> 中(推荐用 <key></key> 表示主标识)
  • 作用域是其所在元素及其所有后代(即“当前作用域”),不是整个文档全局——这点容易误解
  • <selector></selector> 指定候选元素范围,用 <field></field> 指定提取哪个字段(支持 XPath 表达式,但仅限一级路径如 @idname

示例:为每个 <book></book> 定义唯一 isbn

趣问问AI
趣问问AI

免费可用的国内版chat,AI写作和AI对话

趣问问AI 97
查看详情 趣问问AI
<xs:key name="bookKey">
  <xs:selector xpath="book"/>
  <xs:field xpath="@isbn"/>
</xs:key>
登录后复制

xs:keyref 建立引用关系(类似外键)

它声明某元素/属性的值,必须匹配某个 xs:key(或 xs:unique)定义的值,从而形成引用约束。

  • refer 属性必须指向一个已定义的 xs:keyxs:uniquename
  • 它的 <selector></selector> 范围和 <field></field> 路径,要能提取出待校验的“外键值”
  • 被引用的 xs:key 必须在同一作用域或更外层作用域中定义(不能在子作用域里定义 key 再在外层 keyref 引用)

示例:让 <order></order> 中的 bookIsbn 引用上面定义的 bookKey

<xs:keyref name="orderBookRef" refer="bookKey">
  <xs:selector xpath="order"/>
  <xs:field xpath="@bookIsbn"/>
</xs:keyref>
登录后复制

关键限制与常见陷阱

  • 不支持跨文档引用:所有 key/keyref 必须在同一 XSD 文件中定义,且目标元素必须在同一个 XML 实例中存在
  • XPath 表达式能力有限:只支持 @attrelementelement/@attr 这类简单路径,不支持函数(如 string())、轴(如 ../)或谓词复杂条件
  • 作用域易错:key/keyref 只对 <selector></selector> 选中的元素及其后代生效;若把 key 定义在局部 complexType 里,那它只管该类型实例内部,无法被父级 keyref 引用
  • 空值不通过:key 字段值为空(包括空白字符串)会导致验证失败,所以确保被 key 约束的属性/元素有值

实际使用建议

  • 优先将 key/keyref 放在顶层 <element></element>(对应根元素)内,保证最大作用域
  • 给 key 和 keyref 起清晰名字,如 user_id_keyorder_user_ref,便于维护
  • 用支持 XSD 1.0 验证的工具测试(如 xmllint、Oxygen、Java 的 SchemaFactory),注意多数解析器默认不启用 identity constraint 检查,需显式开启
  • 别指望它替代数据库约束:它只做静态结构验证,不保证运行时一致性,也不参与查询优化
基本上就这些。用好 xs:key 和 xs:keyref 能显著提升 XML 数据的自描述性和结构健壮性,但得清楚它的边界在哪里。

以上就是XSD的xs:key和xs:keyref怎么实现主键外键约束的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号