图源:Google
1971年3月,英特尔公司推出了世界上第一个通用微处理器,即英特尔4004,它有2300个晶体管,售价60美元。将时间快进50年左右,最新的苹果手机有将近120亿个晶体管(可惜比60美元更贵一些)。
直至90年代,许多我们目前使用的编程语言才被引入(Java是1996年引入的)。然而,有一种编程语言50年前就被引入,但热度仍然不减当年,那就是SQL。
早期数据库管理史——IDS和CODASYL
1962年,查尔斯·W·巴赫曼(Charles W.Bachman)(与硅谷的埃里希·巴赫曼[ErlichBachman]非亲)是通用电气公司一个小团队的成员。一年后,巴赫曼的团队推出了集成数据储存系统(IDS),该系统后来被公认为首个数据库管理系统。
10年后,巴赫曼获得了众人向往不已的图灵奖,也称为计算机科学领域的诺贝尔奖,以此表彰他对IDS计算的贡献。
什么是IDS?
20世纪60年代初,计算机科学才刚刚开始成为一个学术领域。在这样的大背景下,美国信息交换标准代码(ASCII)直到1963年才被引入。要想理解IDS,我们得先了解促进其发展的两个主要动力:
· 磁盘存储器的引入
· 向高水平编程的转变
磁盘存储器
图:工人正在搬动一台RAMAC305
1956年,IBM推出了第一个商用硬盘驱动器——RAMAC 305。磁盘驱动器的引入,使程序员能直接跳转到磁盘的某个位置来检索和更新数据。相比它的前身磁带驱动器,这是一个巨大的进步,后者需要在磁带中顺序移动来检索一个特定片段的数据。
但目前开发者必须找出磁盘上存储记录的位置。由于早期操作系统中的文件管理系统具有局限性,这是一项只有经验丰富的程序员才能完成的高级任务。开发者需要一个解决方案,以简化磁盘驱动器的运作。
高水平编程
与此同时,在采用曲线上,计算机科学开始从创新者向早期采用者转变。像Assembly这样的低级编程语言在早期学术领域内很流行,但普通程序员会转而使用更高级的编程语言,如COBOL,因为其更易使用。
什么是IDS?IDS解决了磁盘存储和高级编程问题,允许开发者使用COBOL之类的高级编程语言,以此来构建应用程序,从磁盘存储中输入及检索数据。由于这个功能,IDS成为了第一个数据库管理系统。
CODASYL——数据库管理的新标准
1969年,数据系统语言委员会(CODASYL)发布了一份报告,提出了一个数据库管理的标准。巴赫曼是该委员会的一员,且该报告大量引用了IDS。
CODASYL数据模型引入了许多如今数据库管理系统的核心特性:
· 模式数据定义语言(DDL)
· 数据操作语言(DML)
最重要的是,IDS和CODASYL引入了一种新的数据建模方法,这种方法影响了SQL的最终开发,即网络数据模型。
网络数据模型——比如今的关系模型更胜一筹?
图:网络模型范例
数据模型是用于描述(模拟)世界(数据)的标准方法。
从前的分层数据模型使用树状结构来描述数据,但其仅限于一对多的关系。新的网络模型允许子记录有多个父记录,从而创建一个图形结构。通过允许多个父记录,网络模型能对多对一和多对多的关系进行建模。
在网络模型中,表之间的关系存储于集合中。每个集合都有一个所有者(即教师)和一个或多个成员(即班级和学生)。
网络模型的一个关键优势是,集合中的相关记录是通过指针直接连接的。集合是通过next,prior,以及owner指针实现的,能像链表一样方便遍历。
网络数据模型的底层特性提供了性能上的益处,但这是有代价的。网络数据模型增加了存储成本,因为每条记录都必须存储额外指针,这些指针指向先前的记录和父记录。
关系模型的来临
图:关系模型的范例
1970年,在IDS之后的8年, 埃德加· F· 科德(Edgar F. Codd)在他的开创性论文《大型共享数据库的数据关系模型》中引入了关系模型(这篇论文也让他和巴赫曼一样,成为了图灵奖得主)。
科德表明,数据库里所有的数据都能用元组(SQL中的行)表示,这些元组被分组为关系(SQL中的表)。为了描述数据库查询,他发明了一阶谓语逻辑的形式,叫元组关系演算。
元组关系演算引入了一种用于查询数据的声明式语言。声明式编程语言使程序员可以在不描述“如何做”的情况下,直接说出他们“想做什么”。
这种新的声明式语言对开发者来说更容易使用。关系模型公开展示了所有数据。开发者能从表中检索所有数据,或在单个命令中读取单个行(多亏查询优化器)。跟着指针迷宫寻找数据的日子已经一去不复返了。
关系数据模型vs.网络数据模型
通过规范数据,关系数据库能降低网络数据库的高存储成本。规范化是一个分解表以消除冗余的过程,从而减少数据占用的磁盘空间。
然而,关系数据库增加了CPU成本。为了运行规范化数据,关系数据库必须将表加载到内存中,并使用计算能力将表“连接”在一起。让我们通过一个关系模型来完成为某个特定教师找到所有班级和学生这一过程。
数据库系统首先会执行一个操作来检索所有相关的班级。接着,它的第二步操作就是检索学生数据。所有的数据都会被存储到内存中,在返还结果前,它会进行第三步操作来合并数据。
关系模型和网络模型性能对比图
在使用真实数据的性能案例研究中,雷玛数据管理公司(Raima)发现,网络数据库模型的插入性能优于实际数据23倍,且查询数据的速度比实际数据快123倍。
所以,为什么关系数据库会成为领先的数据库解决方案呢?
· 易用性
关系模型能更加灵活地应对变化,而且它的声明句法简化了程序员的工作。摩尔定律在其背后发挥着神奇的作用。计算成本持续降低,最终,关系模型中增加的计算成本与生产力提高所带来的收益相抵消。时间再快进50年,如今,数据中心最昂贵的资源就是CPU。
· SQL时代的崛起
在科德的文章发表4年后,唐纳德·张伯伦(Donald Chamberlin)和雷蒙德·博伊斯(Raymond Boyce)发表了《SEQUEL:结构化英语查询语言》。
他们将SEQUEL描述为“一组在一阶谓语演算幂上的…关于表格结构的简单操作”。IBM发现了这种潜力,并在20世纪70年代初迅速开发了第一版SEQUEL,作为其System R项目的一部分。
后来之所以更名为SQL,是因为与英国供应商霍克西德利飞机公司(Hawker Siddeley)存在商标纠纷。SQL的下一次飞跃是在近十年后了。1986年,美国国家标准协会(ANSI)和国际标准化组织(ISO)发布了第一个官方的SQL标准:SQL-86。该标准将SQL分割成以下几个部分:
· 数据定义语言(DDL):用于定义和修改模式和关系的命令。
· 数据操作语言(DML):用于从数据库中查询、插入和删除信息的命令。
· 事务控制:指定事务时间的命令。
· 完整性:在数据库信息中设置约束的命令。
· 视图:用于定义视图的命令。
· 权限:指定用户访问的命令
· 嵌入式SQL:指定如何在其他语言中嵌入SQL的命令。
1974年至今,无数竞争者试图从占统治地位的查询语言SQL手中夺取市场份额。这些新的句法通常针对特定的新技术:
Lisp -> CLSQL.NET -> LINQRuby on Rails -> ActiveRecord
35年之后,SQL仍然在数据库中无所不在。它是如何保持其作为查询语言的统治地位的,我们又能从它的故事中学到什么?
SQL统治50年的秘诀——我们能从中学到什么?
图:2017年堆栈溢出开发者调查
我们从巴赫曼引入第一个数据库管理系统IDS讲起,讨论了从磁盘存储向高级编程转变,催生了对处理数据新方法的需求。接着迎来了CODASYL和标准化数据库管理。IDS和CODASYL引入了新的网络数据模型。最终,科德放弃了关系模型。这一切发展用了超过8年的时间。
SQL是如何成功在后来的50年间保持流行的?我认为有4个主要原因:
· 建立在基本原则之上
基本原则是一个基本命题,不能从其他任何命题或假设中推导出来。例如,将碳氢化合物和氧气结合,产生化学反应,这仍然是驱动每辆汽车内燃机的原理。
1970年,科德创造了新的数据库基本原则:元组关系演算。这个新逻辑的创建产生了关系模型,之后引出了SQL。元组关系演算就是化学反应,关系模型就是内燃机,而SQL就是汽车。
· 布什内尔定理
仅仅建立在基本原则的基础上不能保证成功。Assembly是程序员能做出的最接近1和0的程序,但仍然被COBOL(以及后来的C)所取代,其中缺失的成分就是易用性。
无独有偶,在从网络模型到关系模型的转变中,网络模型性能更好,但如今每家公司都在使用关系数据库,因为它更容易(上手)。
Assembly不仅精通难,入门也很难。SQL在二者之间达到了完美的平衡。通过10个左右的SQL命令,任何人都能学会20%,然后进阶到80%,但要想成为一名大师,需要经过长期的索引、视图和优化过程。
· 倾听和适应
查询语言不是永恒的单一语言,而是一组与时俱进的适应性标准。SQL标准一直在随时间进行调整,并吸收来自用户的反馈。
从最初的概念以来,我们已经看到了10种不同的SQL标准,每种都做出了重要的改变。以下是其中的3大更新:
1.SQL:1999:添加了正则表达式匹配、递归查询(如传递闭包)、触发器、对过程语句和流控制语句的支持、非标量类型(数组)和一些面向对象特性(如结构化类型)。支持在Java中嵌入SQL(SQL/OLB),反之亦然(SQL/JRT)。
2.SQL:2003:引入了与XML相关的特性(SQL/XML)、窗口函数、标准化序列和自动生成值的列(包括标识列)。
3.SQL:2016:增加行模式匹配、多态表函数、JSON。
SQL还展示了创造轨道的能力,且其他产品都建立在该轨道之上。SQL没有需要强制执行的语法,而是为每个数据库提供一个标准,让其完成自我实现(T-SQL, MySQL, PSQL, etc)。
· API的采用
SQL成功的最后一个秘诀,是应用程序编程接口(API)的兴起。API通过抽象底层操作简化了编程,只公开开发人员需要的对象或操作。API使SQL得以使用特定句法来持续适应新科技。
2006年,Hadoop引入了分布式文件系统(HDFS),起初SQL句法无法访问该系统。然而到了2013年,Apache创建了Apache Impala,使开发者可以使用SQL来查询HDFS数据库。
SQL是如今最普遍使用的编程语言之一,我们不该忘记它悠久的历史。它的旅程始于现代计算的黎明,在两位图灵奖得主的努力下焕发生机。
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/222034.html