知识卡片
SQL没有真正的TABLE类型生成器及"类型与表的正交性"
内容
关系模型中RELATION{...}是通过调用RELATION类型生成器构造出的真正的类型,可以
用VAR S BASE RELATION{...} KEY{SNO};这样的语句明确声明一个关系变量的类型;
但SQL没有与之对应的、真正意义上的TABLE类型生成器——CREATE TABLE S(...)这条
语句里,找不到任何一个语言记号可以被指认为”对TABLE类型构造器的调用”,约束声明
(如UNIQUE、NOT NULL)可以散落出现在列定义之间的任意位置,这进一步说明SQL的表
变量在语法上并不是”某个TABLE类型的一个实例”,而更像是”行的包(bag of rows)”这样
一种没有真正类型名称的东西——它唯一有明确类型概念的部分只是每一行本身的ROW类型。
这个语法层面的缺失呼应了整章的核心结论:类型与表是正交的(types are orthogonal
to tables)——关系模型对属性能取什么类型完全没有限制,关系可以拥有任意类型的
属性,对类型系统的支持和对关系模型本身的支持是两件互不依赖的事情;第一范式的
真正含义仅仅是”每个元组每个属性位置只有一个恰当类型的单一值”,并不限定”恰当类型”
必须是简单类型。这条正交性规则也有两个例外,都与防止无限递归/破坏关系模型初衷
有关:一个类型为T的关系r本身不能拥有类型为T的属性;数据库中任何关系都不能拥有
指针类型的属性——后者是Codd设计关系模型时刻意要规避的,因为指针追踪会让应用
编程极易出错、也会让终端用户几乎无法直接存取数据。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第2章"类型和域"2.9节
"SQL中的行类型和表类型"、2.10节"小结"(源文件:OEBPS/text00027.html、
text00028.html)
- 结论依据:原文明确"SQL根本没有一个真正的TABLE类型生成器……本例中没有语言标记
序列能标记为'对TABLE类型构造器的调用'……可以认为变量S在SQL中具有任何类型,而
不管是什么类型它都只不过是'行包'(bag of rows)""类型与表是正交的(Types are
orthogonal to tables)……数据库中没有关系能够具有指针类型的属性"。
- 原始内容:SQL根本没有一个真正的TABLE类型生成器……可以认为变量S在SQL中具有任何
类型,而不管是什么类型它都只不过是"行包"……类型与表是正交的(Types are
orthogonal to tables)……数据库中没有关系能够具有指针类型的属性。