知识卡片
不一致数据库中量词求值的具体演示
内容
[[约束与谓词逻辑正确与现实正确的分离及爆炸原理]]里已用纯逻辑推导证明”不
一致数据库中任何命题都能被推出为真”,本节给出一个更具体、更贴近查询执行
层面的演示。假设:S非空、存在约束要求”至少存在一种零件”、但P当前为空——
数据库已经处于不一致状态。此时对{SX}WHERE EXISTS PX(TRUE)求值会出现两个
截然不同、但各自”看起来都合理”的答案:如果直接机械计算这个表达式,EXISTS
PX(TRUE)因为P为空而恒假(呼应[[空区间陷阱FORALL在空集合上恒为真的反直觉
后果]]),结果是空集;但如果系统(或用户)注意到”至少存在一种零件”这条约束
本应保证EXISTS PX(TRUE)恒为TRUE,进而把WHERE子句简化成WHERE TRUE,结果
就会是全部供应商——两个结果不可能同时正确,而且从数据库已经不一致这个前提
出发,”正确性”本身已经失去了良定义,两个答案没有一个能被认定为更可信。
书中进一步用一个更贴近真实SQL代码的例子加固这个论证:
SELECT DISTINCT CASE WHEN EXISTS(SELECT * FROM P)THEN x ELSE y END FROM
S会依据EXISTS这次具体求值是TRUE还是FALSE,返回x或y这两个完全不同的结果
——如果x是一个计算所有零件总重量的表达式、y是字面值0,这种不确定性在实践
中会具体表现为”零件总重量该显示为0、还是该显示为一个从null传播出来的错误
结果”这类真实的业务级歧义,而不只是抽象的理论问题。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第10章"SQL与逻辑"
10.7.2节"一致性的重要性"(源文件:OEBPS/text00115.html)
- 结论依据:原文明确"如果直接计算此表达式,那么结果会是空。或者,如果
系统(或用户)注意到约束要求EXISTS PX(TRUE)必须为TRUE……那么WHERE
子句就可以简化为WHERE TRUE,而结果就会是所有供应商。这两种结果中至少
一个肯定是错的!……对于不一致的数据库而言两者都是错的,而此时就没有
(也不会有)对于正确性的良好定义"。
- 原始内容:这两种结果中至少一个肯定是错的!……对于不一致的数据库而言
两者都是错的,而此时就没有(也不会有)对于正确性的良好定义,所有答案
都差不多好,也差不多坏。