知识卡片
类型的正式定义与类型生成器
内容
类型的精确定义是:一个已命名的、有限的值集合——某种特定类型的全部可能取值(如
所有可能的整数、所有可能的供应商编号)。”已命名”意味着不同名字的类型是不同的
类型;”有限”是因为计算机本身就是有限的;每个值总是且只属于一种类型(除非引入
类型继承,本书不讨论),因此类型按定义是互斥的。定义一个新类型至少要包含六项
工作:起名字、定义构成该类型的合法值集合、定义隐藏的物理表示(属于实现层不属于
模型层)、定义选择器运算符(用于选取/指定该类型的某个具体取值)、定义应用于该
类型的运算符(至少包括赋值”:=“、相等比较”=“和THE_运算符)、为每个返回结果的
运算符定义结果类型。任何类型的值和变量都只能用与该类型绑定的运算符来操作——比如
整数有算术运算符但没有字符串连接运算符,供应商编号即使物理上用CHAR表示,也不能
直接套用字符串连接运算符,除非专门为该类型定义了连接运算这个操作。这种类型-运算符
绑定关系还引出了类型生成器(type generator)的概念:像RELATION、TUPLE这类特殊
运算符,输入不是值而是类型定义、返回的也不是值而是一个新类型,且在编译期而非
运行期被调用——RELATION{SNO CHAR,...}就是调用RELATION类型生成器构造出的一个
生成式类型。另外,选择器调用是”字面值”这个更常见概念的一般化:所有字面值都是
选择器调用,但只有当选择器调用的全部实参本身也是字面值时,这次调用才算是字面值
(例如POINT(1.0,2.5)是字面值,POINT(X,Y)只是选择器调用)。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第2章"类型和域"2.4节
"类型是什么"(源文件:OEBPS/text00022.html)
- 结论依据:原文明确"类型……它就是已命名的、有限的值集合……在定义一个新类型时至少
要包括下述所有工作:1.为类型定义名称……4.为选择或者指定该类型的取值定义一个
选择器运算符……根据定义,某个确定的类型的值和变量只能使用与该类型相关的运算符
进行运算""所有的字面值都是选择器调用,但并非所有的选择器调用都是字面值"。
- 原始内容:类型……它就是已命名的、有限的值集合……根据定义,某个确定的类型的值
和变量只能使用与该类型相关的运算符进行运算……所有的字面值都是选择器调用,但
并非所有的选择器调用都是字面值。