知识卡片
关系代数的闭包性质
内容
关系代数里每一个运算符都遵循同一条结构约束:输入一个或多个关系,输出还是另一个 关系——这条”输出仍是同类型对象”的性质叫作闭包(closure)。闭包性质的价值不在于 它本身有多精巧,而在于它带来的直接后果:既然一个运算的输出和输入属于同一类型 (都是关系),这个输出就可以直接作为另一个运算的输入,运算可以像搭积木一样任意 嵌套组合——比如先做差运算r1 MINUS r2,把结果和r3一起做并运算,再把并运算的结果 和r4一起做交运算,可以这样无限叠加下去而不需要在中间插入任何”类型转换”步骤。这个 性质可以类比成一种更基础的编程语言设计原则:如果一种语言里”表达式求值的结果”和 “表达式能接受的输入”是同一种类型,那么表达式就能自由嵌套组合而不被类型系统卡住; 反过来,如果某个运算的输出是一种特殊类型、不能直接喂给下一个同类运算,组合能力就 会被打断,用户不得不在中间手动做转换或拆分成多条独立语句。关系代数从设计之初就 保证了这种可组合性,这也是为什么复杂的关系查询往往能写成一条嵌套表达式,而不需要 分成多个中间步骤分别执行。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第1章"做好准备"1.4.3节
"操作特征"(源文件:OEBPS/text00010.html)
- 结论依据:原文明确"每个这样的运算符都是用一个或多个关系作为输入,并产生另一个
关系作为输出。比如,差(MINUS)使用两个关系作为输入,并从一个中'减去'另外一个,
以此产生一个作为输出的关系。非常重要的是,输出是另一个关系:这也正是关系代数
有名的闭包(closure)性质。正是闭包性质使我们能写出嵌套的关系表达式,因为任何
运算的输出都和输入属于同一类型,一个运算的输出可以成为另一个运算的输入"。
- 原始内容:非常重要的是,输出是另一个关系:这也正是关系代数有名的闭包(closure)
性质。正是闭包性质使我们能写出嵌套的关系表达式,因为任何运算的输出都和输入属于
同一类型,一个运算的输出可以成为另一个运算的输入。