知识卡片

参照完整性是"元约束",及转换约束与状态约束的区别

普通读书笔记卡

内容

[[实体完整性与参照完整性及NULL的本质]]提到的参照完整性规则,本质上和本章 讨论的具体约束(如CX1到CX6)不属于同一层次——它是一条”元约束”(metaconstraint): 它本身不针对某个具体关系变量,而是规定”任何一个特定数据库,凡是声明了外键的 地方,都必须满足与之对应的具体参照约束”。就suppliers-and-parts数据库而言, 参照完整性这条元约束具体落地为”SP到S、SP到P这两条参照约束都必须满足”——如果 其中任何一条被违反,数据库就违反了参照完整性这条更高层次的元约束。另一个值得 区分的维度是约束按”是否限制状态变化路径”分类:本章目前讨论的约束绝大多数是 状态约束(state constraint),只判断数据库某一时刻的状态是否合法,不关心它 是怎么变化过来的;相对的还有一类转换约束(transition constraint),限制的 是变量取值随时间演变的”合法转换路径”本身,比如”供应商状态只能增不能减”—— 书中给出的表达方式是把更新前的关系变量值(用带撇号的S’表示惯例)和更新后的 新值按{SNO}连接,检查是否存在旧状态大于新状态的配对,若存在则约束被违反。 Tutorial D和SQL目前都不支持转换约束的声明式表达,只能靠过程式代码实现,这是 当前约束支持能力的又一处明确空白。本章最后的立场性总结呼应了全书对性能与 正确性优先级的一贯态度:实践中过度偏重”性能,性能,性能”,让易用性、物理 数据独立性、完整性这些同样重要的目标沦为性能的牺牲品——但性能再好,如果连 结果是否正确都不能信任,性能本身也就失去了意义。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第8章"SQL与约束" 8.9节"各种问题"(源文件:OEBPS/text00097.html) - 结论依据:原文明确"关系型数据库应该满足参照完整性规则……它实际是'元约束' (metaconstraint);这意味着每个特定的数据库都必须满足用于其上的特定参照 约束……转换约束就是针对合法转换的约束……相反,不是转换约束的约束有时称为 '状态(state)约束'……Tutorial D和SQL当前都不支持转换约束……如果我们不能 确保所得到结果的正确性,那么性能再好又有什么用?"。 - 原始内容:它实际是"元约束"(metaconstraint)……转换约束就是针对合法转换 的约束……不是转换约束的约束有时称为"状态(state)约束"……如果我们不能 确保所得到结果的正确性,那么性能再好又有什么用?