知识卡片

补偿操作机制:级联规则维持多关系变量间派生约束

普通读书笔记卡

内容

承接[[互换性原理及其重要推论]]开头”S与LS/NLS哪个是基表哪个是视图本质上 可以互换”的论证,本节把LS、NLS、S全部设为基关系变量,逐一推导要维持 LS=S WHERE CITY='London'等约束成立所需的补偿操作(compensatory action) ——补偿操作是DBMS在用户请求的更新之外自动追加执行的附加更新,目的是防止 违反完整性约束,[[外键的精确定义与SQL_FOREIGN_KEY语法差异]]中的级联删除 正是补偿操作最典型的实例。具体到本例:从LS或NLS删除一行,需要级联删除S中 对应的行;反过来从S删除一行,需要级联删除LS或NLS中匹配的行;插入方向同理 需要”级联插入”规则。UPDATE可以理解为DELETE加INSERT的组合,用一个具体例子 说明补偿操作如何联动:把供应商S1的城市从S1所在城市改成Oslo,如果这条UPDATE 是针对S执行的,会先级联删除S1在旧的LS(假设原来在London)里的行,再级联 插入到NLS(因为Oslo不是London)——本质上S1这个”元组”看起来像从LS”搬”到了 NLS(书中特别提醒这个说法很不严谨);但如果同一条UPDATE换成直接针对LS执行, 则会先级联删除LS和S里的旧行,再尝试往LS里插入CITY为Oslo的新行,这次插入 会因为违反”LS的CITY必须是London”这条约束而失败,导致整个更新连同第一步的 删除都必须回滚,数据库保持不变——这正是[[数据库约束必须立即检查的理由与 语义优化]]和[[多重赋值解决延迟检查困境的更优方案]]主张的立即检查/原子回滚 语义的具体体现。最后要强调的是:这整套关于约束、补偿操作的推导,并不要求 DBA为每个视图手工穷举声明——理想情况下DBMS应该有能力从视图定义本身自动 推导出这些约束和配套的补偿操作,这与[[视图更新失败的本质是违反黄金规则或 赋值原理]]中对”约束推导”能力的期望完全一致。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第9章"SQL与视图" 9.5.3节"重新审视伦敦供应商和非伦敦供应商"(源文件:OEBPS/text00104.html) - 结论依据:原文明确"一个补偿操作就是(在用户请求的更新的基础上)由DBMS 自动执行的附加更新,其目的是防止发生违反完整性约束的情况。级联删除就是 一个典型示例……此尝试会失败,因为它违反了关系变量LS上'CITY取值必须总是 London'的约束。所以整个更新会失败……1)运算……要被撤销,实际结果就是 数据库保持不变……我相信DBMS应该能够自己从相关视图定义中自动确定这些 约束和运算"。 - 原始内容:一个补偿操作就是由DBMS自动执行的附加更新,其目的是防止发生 违反完整性约束的情况……所以整个更新会失败……数据库保持不变……我相信 DBMS应该能够自己从相关视图定义中自动确定这些约束和运算。