知识卡片
关系值属性(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填充造成的语义失真,就已
经值得被认真对待。