1970 年,IBM 研究员埃德加·科德(Edgar Codd,全名 Edgar Frank Codd)发表了一篇 11 页的论文:《大型共享数据库的关系数据模型》("A Relational Model of Data for Large Shared Data Banks")。
这篇论文描述了一种全新的数据组织方式,用二维表(关系)存储数据,用数学集合论定义操作,用代数公式表达查询。它完全颠覆了当时数据库的设计方法,最终成为计算机行业价值数万亿美元的整个关系数据库产业的理论基础——包括 Oracle、MySQL、PostgreSQL、SQL Server 和 SQLite。
令人唏嘘的是:科德的雇主 IBM 最初拒绝了他的想法,认为它威胁到了现有产品的商业利益。第一个将关系数据库商业化的,是一家小公司——Relational Software Inc.,后来改名 Oracle。
破除误解:关系数据库不是"把数据放进表格"
"关系数据库就是把数据存进表格"——这个理解遗漏了最关键的部分。"关系"(Relation)在科德的框架里有严格的数学含义:它是集合论意义上的笛卡尔积的子集,每个元组(行)是一个有序的属性值组合。
更重要的是,科德的贡献不只是数据存储方式,而是一套完整的操作代数(关系代数):选择(Selection)、投影(Projection)、连接(Join)、除(Division)……这些操作定义了如何对数据进行查询和变换,其数学性质保证了查询结果的一致性和可预测性。
今天的 SQL 语言是这套代数的一个(不完全精确的)实现。
现场:1960 年代的数据库混乱
在科德的论文之前,数据库主要有两种形式:
层次型数据库(Hierarchical Database,如 IBM 的 IMS):数据按树状结构组织,父记录包含子记录。查询效率高,但数据结构固定,改变结构代价极大,且不同树之间的关联数据难以查询。
网状型数据库(Network Database,如 CODASYL 标准下的系统):数据按图状结构组织,记录之间可以有多种关联。比层次型更灵活,但编程极其复杂,程序员必须显式地在数据结构中"导航"。
两种模型共同的缺陷:程序与数据紧密耦合——换句话说,数据的物理存储结构直接影响应用程序的编写方式。如果数据库的组织方式改变,应用程序几乎必须重写。
科德 1923 年 8 月 19 日生于英格兰多塞特郡波特兰岛。他在牛津大学初读化学,二战期间志愿加入皇家空军、任海岸司令部飞行中尉,战后返回牛津改学数学,1948 年获学位。同年移居纽约,1949 年加入 IBM 任数学程序员。他在密歇根大学获得博士学位(1965 年,导师为遗传算法之父 John Holland),论文研究细胞自动机(cellular automata)的自我复制。1960 年代后期,他在 IBM 圣何塞实验室开始研究数据库组织的基础问题。
关系模型的核心思想
科德的关系模型建立在三个数学概念上:
1. 关系(Relation):用二维表表示数据。每张表有固定的列(属性,Attribute),每一行(元组,Tuple)是一条记录。表中行的顺序不重要(因为集合没有顺序),任意两行不完全相同(集合中没有重复元素)。
2. 关系代数(Relational Algebra):对关系(表)进行操作的代数系统,操作的输入和输出都是关系(封闭性): - 选择():过滤满足条件的行 - 投影():选取特定的列 - 连接():按共同属性合并两张表 - 并()、交()、差($-$):集合运算
3. 数据独立性(Data Independence):应用程序通过逻辑视图(logical view)访问数据,而不直接操作物理存储。当物理存储改变时(如新增索引、改变磁盘布局),应用程序不需要修改。
最后这一点——数据独立性——是关系模型最深刻的工程贡献。它实现了数据和程序的解耦,使得数据库管理员可以自由优化存储,而不影响应用层。
三根支柱与一阶逻辑
把关系模型拆开,它由三根支柱构成:结构(数据只以关系这一种形态呈现)、操作(关系代数与关系演算)、完整性(实体完整性——主键不为空,保证每行可标识;参照完整性——外键必须指向存在的行,保证表间引用不断链)。三根支柱合起来回答一个问题:如何让用户只关心"数据是什么",而不必关心"数据存在哪、怎么连"。
操作这根支柱里,科德其实给了两套等价的形式系统。关系代数是过程性的:写出选择、投影、连接的操作序列;关系演算是声明性的:直接用一阶谓词逻辑写出结果应满足的条件,比如"找出所有工资高于其经理的雇员"就是一个带量词的公式。科德证明了两套系统等价(后来称为科德定理)——这意味着用户可以用逻辑语言"说什么",由系统负责用代数计划"怎么做"。1971 年他进一步提出基于关系演算的数据子语言 ALPHA,为声明式查询语言立下样板。
用一阶逻辑替代指针导航,是关系模型与 CODASYL 网状模型最本质的分野。在网状数据库里,查询是程序员的"导航":从一条记录出发,沿指针逐条走到目标,路径写在程序里,数据物理结构一变,程序就作废。1973 年图灵奖得主、CODASYL 阵营的旗手查尔斯·巴赫曼(Charles Bachman)干脆把获奖演讲命名为《作为导航员的程序员》("The Programmer as Navigator")——这正是科德要终结的范式。1974 年 ACM SIGFIDET(SIGMOD 前身)会议上,两人进行了一场著名的公开辩论:巴赫曼主张导航式访问的性能与可控性,科德主张声明式接口带来的数据独立性。历史最终站到了后者一边,但原因不只是理论优雅。
十二项规则:定义"真正的"关系数据库
1985 年,科德发表了著名的"科德十二规则"(Codd's Twelve Rules,实际上是 0 到 12 共 13 条规则),定义了一个系统必须满足哪些条件才能被称为"真正的关系数据库管理系统"。
这些规则的背景是:许多数据库厂商,包括 IBM 自己,开始在市场上宣传自己的产品为"关系数据库",但实际上并不完全符合科德的关系模型。他写这些规则,部分是为了捍卫自己理论的纯洁性。
部分代表性规则: - 规则 1:所有数据都必须以关系(表)的形式表示,且只以这种方式表示。 - 规则 6:所有视图(view)必须是可更新的(这条规则至今没有任何数据库完全实现)。 - 规则 9:应用程序不应受到物理数据组织方式改变的影响(物理数据独立性)。
今天主流的关系数据库(Oracle、MySQL、PostgreSQL)都没有完全满足这十三条规则,但它们在商业上已经足够成功。
IBM 的拒绝与 Oracle 的崛起
科德的论文发表后,IBM 内部的反应充满抵制。原因是商业性的:IBM 当时的旗舰数据库产品 IMS(Information Management System)是层次型的,已经有大量客户,而关系模型会使 IMS 过时。
IBM 允许科德做学术研究,但迟迟不将关系数据库商业化。与此同时,劳伦斯·埃里森(Larry Ellison)、鲍勃·迈纳(Bob Miner)和埃德·奥茨(Ed Oates)受科德论文启发,决定抢先实现它。1977 年,三人创立了 Software Development Laboratories(1979 年改名 Relational Software Inc.,1982 年再改名 Oracle);1979 年发布了商业 SQL 关系数据库产品,早于 IBM 自己的 DB2(1983 年)。
这是计算机历史上最著名的"发明者未能商业化自己发明"的故事之一。
为什么关系模型最终赢了:优化器
理论上,批评者有一个致命质疑:声明式查询必然慢——程序员不写导航路径,机器怎么知道去哪取数据?1970 年代中期的两个实验系统回答了这个问题。IBM 圣何塞实验室的 System R(1974 年启动)和伯克利的 Ingres(斯通布雷克等人开发)先后证明关系模型可以被高效实现。System R 团队的唐·钱伯林(Don Chamberlin)与雷·博伊斯(Ray Boyce)在 1974 年设计的查询语言 SEQUEL,就是后来 SQL 的前身。
真正的突破在 1979 年:System R 的塞林格(Pat Selinger)等人发表了基于成本的查询优化器。机制是这样工作的:优化器为一条声明式查询枚举候选执行计划(连接顺序、是否走索引),用表大小与数据分布的统计信息估算每个计划的 I/O 与 CPU 代价,再用动态规划在指数级大的计划空间里高效选出近似最优者。这意味着一条几行的 SQL,背后可以由机器生成堪比老练程序员手工导航的访问路径——"声明什么"与"如何做到"被彻底分离,数据独立性从纸面承诺变成工程现实。今天所有关系数据库的优化器,架构上都是塞林格优化器的后代。
1981 年图灵奖
科德因"在数据库系统中对关系型数据库的基础性和定义性贡献"获得 1981 年 ACM 图灵奖。他还于 1974 年当选英国计算机学会会士,1976 年成为 IBM 会士(IBM Fellow)。
2003 年 4 月 18 日,科德在佛罗里达州家中去世,享年 79 岁。
代价与历史张力
关系模型并非完美。它最受诟病的地方是对象-关系不匹配(Object-Relational Impedance Mismatch):面向对象编程语言用对象表示现实世界,而关系数据库用表,两者之间的映射充满摩擦,催生了整个 ORM(对象-关系映射)工具产业。
2000 年代兴起的 NoSQL 数据库(MongoDB、Cassandra、Redis 等)在某种程度上是对关系模型局限的反动——它们牺牲了关系完整性和事务保障,换取横向扩展能力。然而今天,关系数据库仍然是绝大多数应用的首选,因为 ACID 事务保障(原子性、一致性、隔离性、持久性)在许多关键场景中是不可替代的。
事务与 ACID:关系帝国的另一块基石
关系模型定义了数据的形态,但关系数据库之所以能统治金融、电信与政务系统,还靠另一半保障:事务(transaction)——把一组操作打包成"要么全部生效、要么全部不生效"的单元。事务概念的系统化主要归功于吉姆·格雷(Jim Gray),他在 1981 年的论文《事务概念:优点与局限》("The Transaction Concept: Virtues and Limitations")中给出了原子性、一致性、持久性的经典刻画;1983 年,特奥·黑尔德(Theo Härder)与安德烈亚斯·罗伊特(Andreas Reuter)在综述《面向事务的数据库恢复原理》中补上隔离性,把四条性质缩写为 ACID。
需要说明的是,ACID 并不是科德提出的——它属于事务处理这条与关系模型平行发展的线索。但两者在工程上互相成就:关系模型的声明式接口需要事务来保证并发与故障下的语义清晰,事务机制则借关系数据库的统治地位成为行业标准。科德本人晚年的工作回到了模型本身,继续清理厂商实现中对关系模型的偏离。
跨域连接
- 集合论:把表定义为笛卡尔积的子集,带来的不是"更数学",而是三条能用的性质:行无序、无重复、运算封闭。封闭性是关键——关系进、关系出,查询才能任意嵌套与重写。今天优化器敢于改写连接顺序而保证结果不变,靠的正是这些代数等式,而不是靠试出来的经验。
- 创造性破坏:雇主的抵制并不愚蠢,而是理性的:新模型会让既有产品的客户与配套资产贬值,收益却在未来且不确定。推论因此可预期——颠覆通常由没有存量要保护的新进入者完成,哪怕技术本身诞生在在位者自己的研究部门里。这条故事在数据库产业里演了一遍,此后还会反复上演。
- 线性变换:"所有视图都必须可更新"这条规则至今无人完全实现,原因不在实现懒惰。投影把一族原像压到同一个像上,反向映射一般没有唯一解——视图丢掉的信息无法凭空补回,除非外加约束。凡是模型里带投影的地方,更新的歧义都是结构性的。
- 语义学:SQL 允许重复行、又用三值逻辑处理空值,这两点都偏离了集合语义。后果是同一个查询在改写前后可能不等价,优化器必须为此保留一串例外。这与自然语言语义面对的是同一个问题:同义改写何时保真。凡模型与实现有偏差,最终都以"某类重写被禁止"的形式付账。
- 数据库索引与查询优化:数据独立性把"怎么算"整个交给系统,这才给优化器腾出了存在空间——用户声明要什么,系统挑路径。同一条设计也是关系模型最脆弱的地方:性能取决于统计信息与优化器判断,因而不可预测,调优于是变成与优化器博弈。
参考文献
- Codd, E. F. A Relational Model of Data for Large Shared Data Banks. Communications of the ACM 13(6) (1970): 377–387. (奠基性论文,可在 ACM Digital Library 获取)
- Codd, E. F. A Data Base Sublanguage Founded on the Relational Calculus. Proc. 1971 ACM SIGFIDET Workshop (1971). (关系演算与 ALPHA 语言)
- Selinger, P. G. et al. Access Path Selection in a Relational Database Management System. Proc. ACM SIGMOD (1979): 22–34. (基于成本的查询优化器,关系模型工程化的关键)
- Codd, E. F. The Relational Model for Database Management: Version 2. Addison-Wesley (1990). (科德本人对关系模型的完整系统阐述)
- Date, C. J. An Introduction to Database Systems. 8th ed. Addison-Wesley (2003). (标准数据库教材,对科德工作的系统解释)