知识卡片
类型推理规则与RENAME运算符的必要性
内容
[[关系代数的闭包性质]]要求每个运算的结果都必须是一个具备恰当标题和主体的
关系,这意味着关系模型必须提供一整套关系类型推理规则(relation type inference
rules),用来在已知输入关系类型的情况下推导出输出关系的类型——比如连接运算的
规则规定:输出标题是输入两个标题在普通集合论意义下的并(公共属性只出现一次而
非两次)。闭包性质并不意味着系统必须真的先把每一步中间结果物化存储再传给下一
步——书中用连接后接选择的例子说明,系统完全可以边生成连接元组、边检验选择条件,
不满足就立即丢弃,这种逐元组产生并流转到下一运算的方式叫流水线(pipelining),
概念上的”闭包”只是保证结果在逻辑意义上是一个完整的关系,不代表实现层面必须
真的物化它。RENAME运算符的存在很大程度上正是为了配合类型推理规则:当两个关系
因为属性命名冲突或不匹配、导致某个运算(如连接)的命名要求无法直接满足时,
RENAME可以在不改变数据库里任何关系变量的前提下先构造出一个改了属性名的新
关系值,让后续运算能顺利进行——它只是一个表达式,不是像ALTER TABLE那样的
语句,因此可以像任何表达式一样自由嵌套在其他表达式内部。反观SQL在”结果类型
推理”上的支持相当薄弱:SQL根本没有真正的”关系类型”概念([[SQL没有真正的TABLE
类型生成器及类型与表的正交性]]),还可以产生匿名列(如SELECT PNO,2*WEIGHT
FROM P)和重名列(如SELECT DISTINCT P.CITY,S.CITY FROM P,S)的结果,这也
是[[SQL列命名与位置依赖关系化使用SQL的实践规则]]中列命名建议必须被严格遵守的
根本原因。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第6章"SQL和关系代数
I:原始运算符"6.2节"关于闭包的更多内容"(源文件:OEBPS/text00061.html)
- 结论依据:原文明确"我们需要明确一系列规则,具体说就是关系类型推理规则……
关系模型确实包含这样的一套规则……之所以需要第5章提到的RENAME运算符,很大
程度上是因为类型推理规则的存在……SQL对'结果类型推理'到底处理得怎么样呢?
答案是:不怎么样"。
- 原始内容:我们需要明确一系列规则,具体说就是关系类型推理规则……之所以需要
第5章提到的RENAME运算符,很大程度上是因为类型推理规则的存在……SQL对"结果
类型推理"到底处理得怎么样呢?答案是:不怎么样。