知识卡片
类型约束的精确定义:POSSREP与选择器/THE_运算符的一一对应
内容
完整性约束的不严格定义是”必须为TRUE的布尔表达式”,本质上分两大类:类型约束
(定义构成某类型的合法取值)和数据库约束(在类型约束之上进一步限制特定数据库
中能出现的值)。类型约束靠POSSREP(可选表示,possible representation)机制
表达:定义类型QTY时声明它有一个名为QPR的可选表示,这个表示由一个INTEGER类型
的组件Q构成,并附加CONSTRAINT Q≥0 AND Q<5000——这条CONSTRAINT就是QTY类型
的类型约束。这里的关键洞察是:选择器运算符与可选表示一一对应(QPR(250)是
QTY的选择器调用),THE_运算符与可选表示的组件一一对应(THE_Q(QZ)取出QZ的Q
分量),可选表示概念之所以被置于[[类型的正式定义与类型生成器]]体系的核心
位置,很大程度上正是为了给类型约束的表达提供落脚点。类型约束的检查时机被
精确定死:恰好在选择器被调用的那一刻——QTY(250)成功,QTY(6000)必然失败,
因为”一个声称是类型T的值却不满足T的约束”本身就是自相矛盾的(不存在任何变量
能持有一个”类型正确但不满足类型约束”的值,因为生成T类型取值的唯一途径就是
调用T的选择器)。这也解释了为什么把任何事物声明为某种类型,本质上就是对它
施加了一层约束——把关系变量SP的QTY属性声明为QTY类型,等价于要求SP的每个
元组在QTY位置上的取值都必须先通过QTY类型约束的检验(这种约束也被称为”属性
约束”)。可选表示还有一个有趣的自由度:Tutorial D允许一个类型拥有多种不同的
可选表示(比如POINT既可以用笛卡尔坐标表示,也可以用极坐标表示;温度既可以
用摄氏度也可以用华氏度表示),SQL没有这类特性。