编译:袁钰涵 | 发自:思否编辑部
1971 年 的 3 月,英特尔推出了世界上第一个通用微处理器,即 [Intel 4004],成本 60 美元的它,拥有约 2,300 个晶体管。
如今,最新款的 iPhone 拥有近 120 亿个晶体管,以及略高于 60 美元的成本。
50 年带来的改变是巨大的,但是有的东西却一直不变。
20 世纪 90 年代有一大批编程语言开始引入,其中 1996 年引入了 Java,岁月无声,这么多年过去了,SQL 在众多编程语言中仍旧拥有着属于自己的一席之地,甚至和 50 年前一样流行。
这篇文章将从为何引入关系数据库以及 SQL 为什么越来越流行进行分享,同时思考我们能从中学到什么。
数据库管理的早期历史——IDS 和 CODASYL
1962年,Charles W. Bachman 在 General Electric 的一个小团队中工作。
一年后,Charles W. Bachman 的团队推出了人们口中说的第一个数据库管理系统——the Intergrated Data Store(IDS)。
10年后,巴赫曼对 IDS 计算的贡献获得了被人们成为计算机界诺贝尔奖的图灵奖。
什么是IDS?
19 世纪 60 年代初,计算机科学刚开始成为一个学术领域。
也是在这个时期,美国信息交换标准码(ASCII)才被引入。
想要了解 IDS,我们需要先了解推动其发展的两个主要力量:
一,磁盘存储的推行
移动 RAMAC 305
1956年,IBM 推出了第一个商用硬盘驱动器: RAMAC 305。
以前使用磁带驱动器的时候,需要依次在磁带中移动以检索特定的数据,但磁盘驱动器的引入使程序员可以直接跳转到磁盘上的某个位置来检索和更新数据,为程序员带来了极大的便利。
只是这样一来,开发人员必须对于磁盘上的存储位置非常了解,受限于早期操作系统中的文件管理系统 ,磁盘带来的便利仅供经验丰富的程序员享受。
于是开发人员需要一个能简化磁盘驱动器使用的解决方案。
二、编程语言从低级向高级的迁移
同时,计算机科学在采用曲线上,人们开始从创新者转变为早期的采用者。早期流行像 Assembly 这样的低级编程语言,但随着对语言的进一步使用,更多程序员出于可用性的考虑,改用像 COBOL 这样的高级编程语言。
到这个时候,我们或许能猜到 IDS 为何存在了,它解决了磁盘存储的问题,同时方便了高级编程语言的使用。
IDS 允许开发人员使用高级编程语言(例如COBOL)来构建可从磁盘存储中输入和检索数据的应用程序,因此,IDS 作为第一个数据库管理系统获得了殊荣。
CODASYL——数据库管理的新标准
1969年,数据系统语言委员会(CODASYL)发布了一份报告,报告中提出了数据库管理标准,巴赫曼是这个委员会的成员,这些标准主要来自于 IDS。
CODASYL 数据模型引入了我们今天使用的数据库管理系统的许多核心功能,其中包括了:
- 数据定义语言(DDL)
- 数据操作语言(DML)
最重要的是,IDS 和 CODASYL引入了一种新的数据建模方法,该方法影响了 SQL 的最终开发,那就是——网络数据模型。
网络数据模型与关系模型
数据模型是描述建模世界数据的标准。
以前的分层数据模型使用树结构来描述数据,让关系限制在了一对多的组合中。
新的网络模型允许记录具有多个父级,从而创建了一个“图结构”,多个父级存在后,网络模型便能对多对一以及多对多的关系进行建模。
在网络模型中,表之间的关系存储在“集”中。每组都有一个所有者和一个或多个成员 ,就像一个老师会拥有一位或多位学生一般。
网络模型的主要优点之一就是集合中的相关记录通过指针直接连接。集合是用 next、prior、owner ponters 实现的,这类似于列表的链接,方便了开发者的查阅。
网络数据模型的 低级性质(low-level nature) 提供了性能优势,但因为每个记录都必须存储指向其先前记录和父记录的额外指针,它让我们付出了高储存成本。
关系模型的到来
一个关系模型的例子
1970年,即 IDS 推出 8 年后,埃德加·科德(Edgar F. Codd)在他的开创性论文“大型共享数据库的数据关系模型”中介绍了关系模型,这篇论文也为他赢得了图灵奖。
埃德加·科德(Codd)表明,数据库中的所有数据都可以用元组( SQL中的行)表示,这些元组被分组为关系 ( SQL中的表)。为了描述数据库查询,他发明了一种称为元组关系演算的一阶谓词逻辑 。
元组关系演算引入了一种用于查询数据的声明性语言。在声明性编程语言中,程序员不需要说如何执行,只需要说想做什么,目的就可达成。
对于开发人员而言,这种新的声明性语言要容易得多。关系模型将所有数据公开,开发人员可以通过一个命令从一个表中检索所有数据,或读取一行(这要感谢查询优化器),从此人们告别了用迷宫般的指针来查找数据的日子。
关系与网络数据模型
规范化是分解表以消除冗余,从而减少磁盘上数据占用量的过程。关系数据库通过规范化数据减少了网络数据库具有的高存储成本 。
但是,为了处理规范化的数据,关系数据库必须将表加载到内存中,并利用计算能力将表“联接”在一起,它又增加了 CPU 成本。
通过介绍如何使用关系模型方便老师查找所有班级和学生,你将会明白为何有如此高的 CPU 成本了:
当老师开始输入需要查找的数据时,数据库系统将首先检索所有相关类,然后它再进行第二次操作,检索学生数据。在这个过程中,所有的数据都将存储在内存中,在返回结果之前,将运行第三次操作把数据合并。
关系模型和网络模型之间的性能比较
在使用实际数据的效果案例研究中, Raima 发现网络数据库模型的插入性能是关系模型的 23 倍,查询性能更是它的 123 倍。
那么,为什么关系数据库是领先的数据库解决方案?
关系模型修改的时候更灵活,它的声明性语法简化了程序员的工作。
摩尔定律让计算机的性能获得极大的提高,计算成本持续下降,最终关系模型的计算成本被提高的生产率抵消了。
时间线拉到 50 年后的今天,以上综合种种影响下,数据中心中最价格最贵的配置就是 CPU。
SQL 的兴起与统治
顺着时间往下走,我们遇见了我们所喜爱的 SQL。
埃德加·科德(Codd)发表论文 4 年后,Donald Chamberlin 和 Raymond Boyce 发表了名为“ SEQUEL:一种结构化的英语查询语言”的论文。
他们将 SEQUEL 描述为“对表格结构的一组简单操作,等效于一阶谓词演算”。IBM看到了这种潜力,并在 19 世纪 70 年代初迅速开发了 SEQUEL 的第一个版本,将其作为 System R 的一部分。
后来因为与英国霍克·西德利飞机公司的商标发生冲突,SEQUEL 更名为 SQL。
1986年,美国国家标准协会(ANSI)和国际标准化组织(ISO)发布了第一个正式的 SQL 标准:SQL-86,这是 SQL 被用了十年后走出的重要一步。该标准将 SQL分为几个部分:
数据定义语言(DDL): 用于定义和修改架构和关系的命令数据操作语言(DML): 用于查询,插入和删除数据库信息的命令
交易控制: 用于指定交易时间的命令
完整性: 用于设置数据库信息约束的命令
视图: 用于定义视图的命令
授权: 用于指定用户访问权限的命令
嵌入式SQL: 指定如何以其他语言嵌入SQL的命令
从 1974 年到今天,许多人研发了语法,试图与 SQL 争夺查询语言的市场份额。这些新语法通常迎合了当时特定的新技术:
[Lisp-] > [CLSQL .NET-]> [LINQ] Ruby on [Rails-]> [ActiveRecord]
35年过去了,SQL 在数据库中仍无处不在,SQL如何维持其作为查询语言的统治地位,我们又可以从它的故事中学到什么?
SQL 50 年统治的秘诀,以及我们可以学到什么
2017年堆栈溢出开发人员调查
我们从巴赫曼与第一个数据库管理系统 IDS 开始这个故事,讨论了磁盘存储和高级编程的转变以及如何需要一种新的数据处理方式,然后 CODASYL 进行了标准化的数据库管理,IDS 和 CODASYL 引入了新的网络数据模型,最后埃德加·科德(Codd)放弃了关系模型。
八年就发生了以上的种种变化。
在接下来的50年中,SQL如何成功地坚持下去?我认为有四个主要原因:
一、建立在第一性原理上
第一性原理是不能从任何其他命题或假设中推论得出的基本命题。例如,将碳氢化合物与氧气结合以产生化学反应,这是为每辆汽车的内燃机提供动力的最基本原理。
1970年,埃德加·科德(Codd)为数据库创建了一个新的第一性原理:元组关系演算。这个新逻辑保住了关系模型与 SQL 的产生。在这三者中,元组关系演算是化学反应,关系模型是内燃机,SQL 是汽车。
二、布什内尔定律
仅凭第一性原理还不能保证成功,汇编程序与程序员可以一键输入的 1 和 0 某种程度上非常接近,但它仍被 COBOL(以及后来的C)取代了,因为它缺少了可用性。
从网络到关系模型的转变,我们也看到了同样的故事。网络模型具有更快的性能,但是如今,每个公司都使用关系数据库,因为它初期使用起来非常简单。
“最好的游戏总是容易上手但很难掌握”——诺兰·布什内尔(雅达利公司创始人)
这句话中,诺兰·布什内尔(Nolan Bushnell)说出了让人们使用新产品的秘密。
在难学又难掌握的汇编中,SQL 找到了完美的平衡。借助约 10 条 SQL 命令,任何人都可以从 20% 的知识中获得 80% 的学习效率。但是,要做到母版、索引、视图、优化,后续学习则还有很长的路要走。
三、倾听反馈与适应环境
查询语言不是永恒的整体,而是随时间变化适应环境的标准组,年复一年中,SQL 标准不断地调整,吸收用户的反馈完善着自己。
从最初的构想开始统计,我们已经看到 10 种不同的 SQL 标准,每一个标准都有着很重要的更新。其中有 3 个更新非常大,这里列了出来:
1、1999 年,增加了正则表达式匹配,递归查询(例如,传递闭包),触发器,对过程和流程控制语句的支持,非标量类型(数组)和一些面向对象的功能(例如结构化类型)。支持在 Java(SQL / OLB)中嵌入 SQL,反之亦然(SQL / JRT)。
2、2003 年,引入了与 XML 相关的功能(SQL / XML),窗口函数,标准化序列以及具有自动生成的值(包括身份列)的列。
3、2016 年,添加行模式匹配,多态表函数,JSON。
SQL 还创造了其他产品可以使用的 Rails 构架。在 SQL 中没有强制语法,它只是为每个数据库提供了方便他们自行组建(T-SQL,MySQL,PSQL等)的标准。
四、采用API
SQL 成功的最终秘诀是应用程序编程接口(API)的兴起。API 的抽象化底层实现、仅公开开发人员需要的对象与操作,大大简化了编程。
Hadoop 在 2006 年引入了分布式文件系统(HDFS),最初 SQL 语法无法访问,但 2013 年,Apache 创建了 Apache Impala,自此开发人员可以使用 SQL 查询 HDFS 数据库。API 让 SQL 以其特殊语法适应着新技术。
总结
SQL 是当今使用最广泛的编程语言之一,它始于现代计算的曙光,并由 2 位图灵奖获得者赋予了它生命。
SQL 能保持其主导地位是因为:建立于第一性原理、布什内尔定律的出现、它的自适应性和 API 被使用。
如果你有其他看法,可以留言评论,我们一同分享 SQL 成功多年的原因是什么。