知识卡片
约束与谓词:逻辑正确与现实正确的分离及爆炸原理
内容
[[关系变量谓词与命题及闭合世界假设]]中已知每个关系变量都关联一个谓词,理想
情况下这个谓词理应就是判断”某次更新是否可接受”的标准,但这个理想目标永远
无法真正实现,原因有两层:系统无法理解谓词里”签订了合同”“位于哪里”这类自然
语言含义本身(那只是给人看的解释);即便系统能理解含义,也没办法知道用户
断言的内容在现实世界中是不是真的——系统能做、也只能做的,是检查用户的断言
会不会违反已声明的完整性约束,一旦通过就默认接受为真,直到未来某次更新明确
推翻它。这引出一条精炼的总结:系统不能强制执行真实,只能强制执行一致性。
形式化地说,给定关系变量R及其所有约束C1到Cm,(C1)AND(C2)AND...AND(Cm)AND
TRUE就是R的总体关系变量约束(末尾的AND TRUE是为m=0这种理论上存在但实践中
几乎不可能出现的情况兜底,因为每个关系变量至少该服从一条键约束);进一步
把所有关系变量的约束都AND起来就得到整个数据库的总体约束。据此得到”黄金规则”
的最终版本:任何更新运算都不能使针对任何数据库的数据库约束变为FALSE。这个
框架也直接证明了为什么绝不能信任一个不一致数据库给出的任何答案:把数据库
看作命题集合,假设这个集合不一致(同时蕴含p为真和非p为真),那么对任意命题
q,可以先由p为真推出”p或q”为真,再结合非p为真推出q必然为真——但q是完全任意
的命题,这意味着一旦数据库存在不一致,包括”1=0”这种明显荒谬的命题在内,任何
命题都能被”合法地”推导为真(这就是经典的爆炸原理,ex falso quodlibet),
不一致数据库给出的一切结果因此都彻底不可信。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第8章"SQL与约束"
8.8节"约束与谓词"(源文件:OEBPS/text00096.html)
- 结论依据:原文明确"系统不能强制执行真实,只能强制执行一致性……任何更新
运算都不能使得针对任何数据库的数据库约束为FALSE……假设此集合是不一致的
……从p为真出发,可以推出p OR q为真……从p OR q为真以及NOT p为真出发,
可以推出q为真。然而q是任意一个命题!……不管是什么命题……在不一致的系统
中都会为'真'"。
- 原始内容:系统不能强制执行真实,只能强制执行一致性……任何更新运算都不能
使得针对任何数据库的数据库约束为FALSE……不管是什么命题(即使是类似1=0
这样明显为假的命题)在不一致的系统中都会为"真"。