知识卡片

不一致数据库中量词求值的具体演示

普通读书笔记卡

内容

[[约束与谓词逻辑正确与现实正确的分离及爆炸原理]]里已用纯逻辑推导证明”不 一致数据库中任何命题都能被推出为真”,本节给出一个更具体、更贴近查询执行 层面的演示。假设: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,而结果就会是所有供应商。这两种结果中至少 一个肯定是错的!……对于不一致的数据库而言两者都是错的,而此时就没有 (也不会有)对于正确性的良好定义"。 - 原始内容:这两种结果中至少一个肯定是错的!……对于不一致的数据库而言 两者都是错的,而此时就没有(也不会有)对于正确性的良好定义,所有答案 都差不多好,也差不多坏。