知识卡片

类型约束的精确定义: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没有这类特性。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第8章"SQL与约束" 8.1节"类型约束"(源文件:OEBPS/text00089.html) - 结论依据:原文明确"我们在定义一个类型的时候所要做的一件事就是指定构成 此类型的取值,这其实就是类型约束所要做的事……选择器运算符与可选表示一一 对应,而THE_运算符则与可选表示的组件一一对应……它们(类型约束)是在调用 选择器的时刻被检查的……将任何事物声明为某种类型就是对此事物施加约束"。 - 原始内容:选择器运算符与可选表示一一对应,而THE_运算符则与可选表示的 组件一一对应……何时检查类型约束……事实上,它们是在调用选择器的时刻被 检查的……将任何事物声明为某种类型就是对此事物施加约束。