知识卡片
关系常量与命名常量的逻辑区别
内容
[[视图是关系变量表和视图并非不同事物]]中的视图定义要求定义表达式至少涉及 一个关系变量,原因是:如果一个”虚拟关系变量”的定义完全不依赖任何关系变量, 它就根本不是变量——不可更新,因此也不配称为关系变量。SQL允许写一个不引用 任何表的CREATE VIEW语句,但这样的”视图”注定不可更新,它更准确的名字应该是 “命名关系常量”(named relation constant)。这引出一组值得厘清的逻辑区别: 常量和值是同义词,但常量和字面值是两回事——字面值只是代表常量的符号(呼应 [[类型的正式定义与类型生成器]]中”字面值是选择器调用的特例”);更精细地看, 常量本身和”已命名的常量”也存在逻辑差异——常量是值,值不可更新,但已命名 常量除了”值不能改变”这一点外,行为上更像一个变量(有名字、可以被引用)。 关系常量(类型为关系的常量)是这套区分体系里的一个特例:Tutorial D目前还 不直接支持关系常量语法,但已经内建了两个系统定义的关系常量——[[TABLE_DUM 与TABLE_DEE关系代数中的0]]。虽然普通的视图机制在功能上可以模拟出关系常量 的效果,但书中强调这两者存在重要的逻辑差异,”假装常量是变量”无助于真正理解 这层区别本身,值得作为独立概念保留。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第9章"SQL与视图"
9.1.2节"关系常量"(源文件:OEBPS/text00100.html)
- 结论依据:原文明确"如果不是至少涉及一个关系变量的话,'虚拟关系变量'就
根本不会是一个关系变量!……它更应该称为'命名关系常量'……常量和已命名
常量之间也存在逻辑差异;常量是值,而命名常量除了值不能改变之外更像是
变量……Tutorial D已经提供了两个系统定义的关系常量:TABLE_DUM和TABLE_DEE
……对关系常量的支持可以通过常用的视图机制进行模拟;然而,这两者是有重要
的逻辑差异的"。
- 原始内容:它更应该称为"命名关系常量"……常量和已命名常量之间也存在逻辑
差异……Tutorial D已经提供了两个系统定义的关系常量:TABLE_DUM和TABLE_DEE
……这两者是有重要的逻辑差异的。