知识卡片

关系值属性(RVA)使外连接变得多余

普通读书笔记卡

内容

[[数据值原子性没有绝对含义]]中已提到关系值属性(RVA)是合法的关系设计, GROUP/UNGROUP运算符负责在”无RVA的关系”和”有RVA的关系”之间互相转换(GROUP 的语义完全可以用EXTEND加映像关系解释:R1 GROUP({PNO} AS PNO_REL)等价于 EXTEND R1{SNO}:{PNO_REL:=!!R1},但作者仍认可GROUP作为独立命名运算符的 实用价值,因为一门语言只提供UNGROUP而不提供对称的GROUP在人体工程学上说不过 去)。本节的核心论点是:RVA的存在让外连接彻底成为多余之物。用EXTEND S: {PQ:=!!SP}构造一个关系变量SPQ,供应商S5(没有任何出货)在这个结果里的PQ 属性值会是一个空关系;相比之下,如果用S NATURAL LEFT OUTER JOIN SP达到 类似效果,S5对应的PNO、QTY两列会被填成[[NULL违反信息原理及SQL自身3VL支持的 内在缺陷]]里讨论过的问题值NULL。这两种表示”S5没有任何出货”的方式有本质区别: 用空关系表示空的集合,语义上准确无误——它就是在说”这个集合恰好是空的”;用 NULL表示同样的情况,则彻底表达错了含义,因为NULL的标准含义是”值未知”,而 “S5的出货集合为空”这个事实本身是完全已知、确定的,不存在任何”未知”成分—— 用NULL来表达”我知道这个集合是空的”,是对语义的错误编码,而不仅仅是[[NULL与 三值逻辑逻辑正确与现实正确的分离]]中讨论过的那类逻辑计算问题。这也是RVA 相比外连接的一个独立、单凭这一点就足够有分量的优势:即便RVA没有其他任何 好处,只凭它能用准确的空集合语义替代外连接靠NULL填充造成的语义失真,就已 经值得被认真对待。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第7章"SQL和关系代数 II:附加运算符"7.10节"分组、去分组和关系值属性"(源文件:OEBPS/text00083.html) - 结论依据:原文明确"RVA的存在使得外连接成为多余之物……使用空集来表示空的 集合看起来显然是一个好主意!……供应商S5没有任何出货也就意味着'供应商S5的 出货集合为空'……它肯定不意味着供应商S5提供了未知数量的未知零件,而'未知' 正是通常用来解释null的方法……图7.3的问题不仅仅是包含null的问题……实际上 更是对语义进行了错误表达"。 - 原始内容:RVA的存在使得外连接成为多余之物……使用空集来表示空的集合看起来 显然是一个好主意!……图7.3的问题不仅仅是包含null的问题……实际上更是对 语义进行了错误表达。