在软件开发世界中有20或30种流行的编程语言。但在数据库世界中,只有1种。
当时间的指针缓缓滑过半个世纪,SQL已经从一颗小小的种子,成为关系型数据库的主流查询语言。如今,它不仅支撑着政府、商业和全球经济的关键交易,更是数据库界的绝对统治者。然而,这一切的背后,隐藏着一段不平凡的故事。
名字里的秘密
虽然SQL是结构化查询语言(Structured Query Language)的缩写,但它最初被称为SEQUEL,这或许是对同时期竞争语言QUEL的一种致敬。
IBM的Donald Chamberlin和Raymond Boyce在1974 年发表了《SEQUEL:一种结构化的英语查询语言》论文,旨在解决IBM新提出的System R系统中的数据查询问题。System R是第一个体现Edgar Codd 论文所描述的关系模型的数据库。
Chamberlin表示,Codd的方法与当时数据系统的主流思想截然不同,需要一种全新的语言来支持。
“当时数据库行业的泰斗是Charles Bachman。他在通用电气工作,发明了数据库系统作为操作系统和应用程序之间的独立软件层,并开发了一个名为Integrated Data Store的特定数据库系统,”Chamberlin说。
Bachman的发明被称为网状数据库,但它并没有在行业中产生持久影响。
“Charlie认为你应该通过编写一个程序来访问数据库,告诉计算机如何找到答案。Codd 说,‘不,这完全错了,我们应该采用声明式方法,让计算机自己找出答案。’这就是 70 年代初行业内部的激烈争论,”Chamberlin说。
SQUARE 语言:听起来高大上,但输入难如登天
Chamberlin和Raymond Boyce在首次尝试为关系数据库创建语言时,创造了 SQUARE,即“关系环境中指定查询”。但它依赖于复杂的下标和上标符号组合,Chamberlin本人也承认,这很难输入。
1973 年,Chamberlin和Boyce从东海岸搬到IBM的圣何塞研究实验室,加入了System R团队。
“关系模型简单、优雅且功能强大。但Codd用大量数学术语表达了他的概念。他基本上是个数学家,我们第一次读他的论文时,并没意识到这个概念有多优雅、多简单。他把一个简单的概念复杂化了。另一个问题是,最初并不清楚这些想法是否能够在程序中有效实现,并且具有足够的性能,”Chamberlin说。
另一个数据库团队也在解决同样的问题
System R是IBM试图证明关系模型可以通过当时可用的计算机来实际执行,但因为Codd的论文发表在一本杂志上,IBM团队并不是唯一研究这个问题的团队。在旧金山附近的加利福尼亚大学伯克利分校,另一个团队也在进行类似的项目。
Chamberlin说:“实现关系数据库需要三样东西:就像一个三脚凳。我们有了数据模型。第二件事是人们可以理解的查询语言,即使他们不是数学专家,第三件事是一个优化编译器,可以将这种高级语言转换为性能良好的有效计划。这正是 IBM 和伯克利的人们都在做的事情。一场革命正在进行。计算成本正在下降,每个人都在将数据放到线上,这场革命的赢家是关系数据库。”
问题是选择哪一种,以及使用哪种语言。
20 世纪 70 年代初,在伯克利,博士后Michael Stonebraker和计算机科学家Eugene Wong开始了一个项目,与System R 同时构建另一个早期关系型数据库Ingres。为此,他们开发了自己的查询语言QUEL。
“Chamberlin和Boyce基本上把SQUARE变成了一种可以在键盘上输入的语言,但它具有嵌套结构,”Stonebraker 解释道。
SQL:一种不太标准的标准
尽管SQL在数据库市场上占据绝对主导地位,并得到国际标准化组织的支持,但在不同实现之间,SQL的表现却令人惊讶地有所不同。
卡内基梅隆大学数据库学副教授Andy Pavlo解释说,SQL的强大之处在于它能够吸收多年来试图取代和替换它的最佳想法。
“SQL之所以具有韧性的原因是它能够吸收最佳想法,并将其纳入其中。一个典型的例子是20世纪80年代和90年代的面向对象数据库。另一个是 XML。最近,文档存储MongoDB在21世纪后期兴起,然后SQL在2016年增加了JSON支持,”他说。
然而,对JSON数据类型的支持——这种类型广泛用于全球互联网上交换数据——揭示了SQL的一个问题:即它并不像许多人所假设的那样标准化。
Pavlo指出,尽管JSON在2016年成为SQL标准的一部分,但PostgreSQL 在 2012年就支持了JSON。Oracle和MySQL也有它们自己的JSON支持变体。
“就像每个人都在做自己的事情,然后你试图找到最低的共同点,并说,‘这就是标准应该是什么。’通常,一些数据库有自己的专有版本,或如何执行某种新操作的变体,然后当SQL标准出现时,它们不会回去改变,”Pavlo说。
这意味着不同的供应商有不同的SQL版本,这可能会让开发人员和数据库管理员陷入困境:例如,Microsoft 有 T-SQL,Oracle有PL/SQL,PostgreSQL有PL/pgSQL。
尽管如此,编写好的SQL还是有一些规则的。
开源数据库咨询公司Percona的创始人兼前首席执行官Peter Zaitsev表示,SQL在表达简单需求方面非常出色,但在更高级的情况下,它可能会变得“令人绞尽脑汁”,即使对于一个数学头脑来说也是如此。
“在我的业务中,你会看到程序生成长达五页长的SQL查询。在这种情况下,几乎不可能对其进行任何操作。它很难理解,也很难调试。这是许多开发人员的经验,”他说。
“一个SQL查询就像一个句子。你不想让它只有两个字,也不想让它有五页长。使用包含在单一思维中的表达式。
“我的建议是:聪明地使用SQL。不要过度使用它。人们试图在SQL中放入太多的应用逻辑,这并不容易维护,”Zaitsev说。
最佳技术解决方案赢了吗?
然而,有些查询无法用嵌套表示法表达。结果是,SEQUEL在嵌套表示法中添加了平面表示法,这使得语言“不必要地复杂”,Stonebraker说。
“另一方面,QUEL从一开始就使用了平面表示法。没有嵌套表示法。SEQUEL因包含嵌套表示法而受到阻碍。但问题是,一旦你把它放进去,就不能把它拿出来了,”Stonebraker说。
与此同时,SEQUEL(SQL的命名后来才出现)的主导地位远非板上钉钉,因为IBM最初对将System R开发成商业产品兴趣不大,因为它从现有的数据系统中赚了很多钱。
Chamberlin解释说:“这对我来说是一种挫折,这是肯定的,对System R 团队的其他成员也是如此。这是IBM做出的一个商业决定。他们有一个成功的商业数据库产品[层次结构的IMS]。他们为什么要推出一个与之竞争的产品呢?他们花了几年时间才弄明白。
“与此同时,System R小组在开放的技术文献中发表了关于SQL和优化编译器的论文。IBM非常慷慨地允许我们这样做,主要是因为他们从商业角度来看并没有太认真地对待这项技术:这是一项研究,”Chamberlin说。
Oracle的诞生和小型计算机的崛起
然而,有两家公司对生产商业关系型数据库感兴趣。除了Stonebraker的 Ingres之外,由Larry Ellison、Bob Miner和 Ed Oates创立的初创公司 Software Development Laboratories开发了Oracle数据库,后来该公司以Oracle命名。
Oracle采用了SEQUEL,并声称是第一个商用的关系型系统,而Ingres比 IBM 有一个显著优势,Stonebraker说。两者都是为小型计算机系统开发的,与20世纪60年代和70年代流行的大型机截然不同。
数据库先驱英年早逝,但他的代码永存
Raymond Boyce在20世纪70年代初与Donald Chamberlin一起在 IBM 工作时共同开发了SQL,但他没有活着看到它在全球大多数数据库中得到使用。他在20多岁时因突发脑动脉瘤去世,留下了他的妻子和年幼的女儿。
他毕业于普罗维登斯学院,拥有印第安纳州普渡大学的计算机科学博士学位,在加入IBM纽约公司后,遇到了Chamberlin,然后在1972年一起搬到圣何塞为System R团队工作。
但他对Chamberlin来说不仅仅是一个同事。
“Ray是我最好的朋友。我们一起搬到加利福尼亚,当我们第一次被分配到我们的项目时,我们一起买了房子,一起拼车去上班。和Ray一起工作是一次非常愉快的经历。我们过去常常玩一个叫做查询游戏的东西,我们每个人都会编查询,并挑战对方找到一些语法来表达它们,”Chamberlin说。
“这是一次非常成功的专业合作。我仍然与Ray的女儿保持联系,她在他去世时只有一岁,现在已经50岁了。我们每年夏天仍然和她一起去露营,”Chamberlin说。
“在80年代初到中期,主要的数据库系统都在IBM硬件上运行,这对这两家公司来说是非常有利的,它们都是用 IBM 汇编语言编写的,所以它们不能移植到DEC和Data Genera小型计算机上。80年代是小型计算机的兴起,这为甲骨文和 Ingres 提供了一片空白领域,”Stonebraker说。
他说,Ingres中Quel的实现比Oracle采用的SQL要好得多。Stonebraker 说,Oracle起步较早,并且使用“我不赞同的销售策略”实现了强劲增长。然而,他说,如果不是IBM的干预,Ingres可能会在1985年超越Oracle。
1983年底,IBM推出了Db2,尽管这不是它的第一个商业关系型数据库,但很快就成为了一个新的先锋的旗舰产品。Db2使用SQL,随着IBM在大型机市场的主导地位,对于竞争对手的语言来说,游戏结束了,无论它们在技术上是否更优越,都结束了。
标准机构和政府采购决定
但对Chamberlin来说,是国家标准机构和美国政府采购机构的批准,帮助 SQL 赢得了胜利。
随着Ingres和甲骨文的成功,关系型数据库变得越来越普遍,美国国家标准协会(ANSI)决定对此产生兴趣并研究查询语言。
“嗯,他们有一个名为H2的委员会,该委员会有来自许多不同软件供应商的代表,包括IBM和甲骨文,这两家当时都在销售SQL产品。至关重要的是,Ingres的人没有参加那个委员会。如果Ingres能在那个委员会中有代表,世界可能会有所不同,”他说。
相反,ANSI委员会看到市场上有两个关系产品,它们都使用SQL,所以它们是兼容的,所以他们认为如果基于商业上可用的SQL实现作为其标准,将获得最大的吸引力,Chamberlin说。
与此同时,美国政府发布了联邦信息处理标准127。“你必须通过那个标准才能向政府销售软件。FIPS 127与ANSI标准完全相同。从向政府销售SQL系统的角度来看,这是非常有益的,”Chamberlin说。
在ANSI标准之后,国际标准化组织(ISO)于1986年制定了SQL的标准。2023年的最新更新包括与JSON 和属性图相关的新功能。随着SQL在世界范围内的主导地位得到保证,Chamberlin反思他的团队本可以做些什么不同的事情。他说,那些指出SQL不“正交”的人——即操作只改变一件事的想法——提出了一个有效的批评。
然而,创建SQL的目标并不是创建一种编程语言,而是创建一种非程序员(如业务分析师等)可以用来处理他们数据的方法。
“我们希望语言尽可能接近自然语言,以便他们可以阅读和理解它,就像它是一个英语句子。但当然,英语不是一种“正交”语言,所以我们在这方面做了一些妥协,”他说。
最终,SQL主要由程序员、数据库管理员和数据科学家使用。“从长远来看,在使语言更“正交”方面多一点关注会更有益,”他说。
尽管SQL取得了成功,Chamberlin认为NoSQL数据库和语言对于帮助满足现代应用程序中的数据需求是必要的。但现有关系型数据库中的数据量庞大,加上像MySQL、PostgreSQL和SQLite这样的开源关系数据库的流行,意味着SQL不太可能被取代。
尽管他的语言输了,Stonebraker说,数据库行业从拥有一个统一的、被广泛接受的SQL标准中获得了好处。
“目前我看不到有任何东西取代它,除非出于某种原因关系数据库失宠,但我看不到这种情况发生。人工智能可能允许人们使用自然语言编译SQL,但这只是在它上面添加了另一个前端,”他说。
“在软件开发世界中有20或30种流行的编程语言。在数据库世界中,只有1种。”
参考资料:
https://www.theregister.com/2024/05/31/fifty_years_of_sql/?td=rt-4a