回顾关系数据库的诞生和发展历史,介绍如今成为主流的技术是在什么背景下出现的,以及它为什么能够确立自己作为数据库标准的地位等。对于伴随时代变迁而衍生出来的新课题,关系数据库遇到了哪些瓶颈。
关系数据库的历史
关系数据库(Relational Database,RDB)及其操作语言SQL现在几乎用在所有的系统中。使用它们的系统也多种多样,比如B2C或C2C等Web服务、企业或政府的基础系统BI/DWH等分析系统,等等。这种高通用性正式关系数据库的最大特征。对于工程师来说,关系数据库就像是一种基础设施。
关系数据库的出现是一种破坏性创新,是改变数据库世界模式的大变革,而NoSQL不是(至少现在不是)替代关系数据库的第二次破坏性创新,它于关系数据库是互补的。
关系数据库出现之前的状况
在关系数据库出现之前,数据库市场的主流是基于层次模型的产品。顾名思义,层次模型以层次关系来表示数据之间的关系,使用程序来确定数据的位置以获取数据。现实中的“数据”大多拥有某种层次关系,如公司或学校等组织、组成机器的部件等,因此数据库就根据这些关系来表示数据。
这类数据中具有代表性的产品使IBM公司的IMS(Information Management System)数据库。该产品拥有非常高的可靠性和性能,因此被用于政府和金融机构等承担重要社会基础设施职能的大型系统中。最著名的IMS数据库应用系统是美国航空航天局从1961年开始的阿波罗计划。表示最终产品组成部件的层次关系的列表称为物料清单(Bill Of Materials,BOM).
悄悄启动
1969年,IBM公司内部期刊上发表了一篇论文。论文的作者是40多岁的工程师埃德加·佛兰克·科德,题目是《大型共享数据库的关系模型》。1969年,科德稍加修改,将论文发表在了学术杂志上。对这篇论文感兴趣的工程师由此掀起了这场关系数据库的“革命”。1973年加利福尼亚大学的迈克尔·斯通布雷克(Michael Stonebraker)等人开始开发Ingre。斯通布雷克现在以PostgresSQL而闻名。准确地说,他开发的是PostgreSQL的前身Postgres,这个名称便来自“Post”和“Ingres”。于此同时,受科德论文的启发,拉里·埃利森(Larry Ellison)开始开发Oracle Database,并于1979年发布了第一版。另外,参与Ingres开发的罗伯特·爱泼斯坦(Robert Epstein)等人在1984年成立了Sybase公司。这家公司与Ingres团队和IBM公司通过人员交流,为关系数据库技术的发展做出了贡献。Sybase公司从1988年到1993年与微软公司进行技术合作,对微软公司的SQL Server开发也做出了很大贡献。20世纪80年代,Informix(后被IBM公司收购)、Teradata(至今仍是面向DWH的具有代表性的数据库产品)等产品相继出现。到了20世纪90年代,关系数据库呈现出百花齐放的状态。
关系数据库的时代
回顾关系数据的发展历史可以发现,现在关系数据库市场上的主角基本上出现于20世纪70年代到20世纪80年代。唯一例外就是20世纪90年代发布的MySQL,该数据在短时间内迅速占领了市场。
以“用户视角”的系统为目标
与层次数据库相比,关系数据库的优点有很多,其中对它增加市场份额帮助最大的,就是方便用户使用的数据结构和接口,即表和SQL的发明。
在关系数据库中,所有的数据仅使用“表”这一种形式来表示。表看起来与“二维表”相似,对于用惯了微软公司的Excel或Google文档等电子表格的人来说,这种存储数据的方法非常直观。在表中,数据的表示方法完全去除了“数据位置”的概念。数据在表中是哪一行或哪一列没有任何含义。这样,即使不使用地址或指针等难以处理的位置表示方法,我们也可以操作数据。
关系数据库的破坏性创新
回顾关系数据库的发展历史,我们可以发现这是典范转移(paradigm shift)的一个类型:破坏性创新。
破坏性创新和引起它的破坏性技术,是哈佛大学商学院的克莱顿·克里斯坦森教授在其著作《创新者的窘境》中提出的著名的经营学概念,用来说明技术产品市场中发生典范转移的原因。所谓破坏性技术,就是该技术或产品如果按传统市场中的评价标准(大多是可靠性或性能)来评价会得到较差的结果,而如果按其他标准来评价,就会发现它有优于现有产品的地方(使用方便等)。破坏性技术的特征是通过吸引早期采用者来获得小规模的市场份额,具体示例有小型硬盘驱动器(HDD)、数码相机和智能手机等。
回顾关系数据库的出现及其后来的发展,我们可以知道这就是破坏性创新的过程。最典型的例子就是迈克尔·斯通布雷克等人最初开发的Ingres的时候,他们开发的就是在低端UNIX机器上运行的关系数据库。与运行于大型机上、支撑大型社会基础设施的层次数据库相比,无论是可靠性还是性能,Ingres都无法与其相提并论。如今,关系数据库是“可靠性高、运行稳定”的代名词,但早期的关系数据库运行不稳定,性能也低,无法满足非常重要的任务需求。
破坏性创新会重复吗
关系数据库以简单、直观的数据模型“表”和便于用户使用的接口语言SQL作为务器,称为主流数据库,但并不是说关系数据库是万能的。
[问题1]性能与可靠性的平衡
近年来,关系数据库比较突出的问题是性能问题。性能的构成元素不止一个,我们可以将其简单理解为“系统的处理速度”。数据库一直一来都在存储大量数据,但近年来,随着数据量的不断增大,关系数据库成为系统中最容易遇到瓶颈的地方。
关系数据库容易遇到瓶颈的原因主要有两个。一个原因是,为了用以管理数据,进行严格的事务管理,系统需要采用共享存储设备的结构,这使得存储设备会成为单点瓶颈。换句话说,就是“无法横向扩展”。
另一个原因是,SQL因其强大的表达能力和灵活性可以执行复杂的处理,特别是对大规模数据执行连接或子查询等复杂处理,但这会导致系统变得非常缓慢。
[问题2]数据模型的局限性
关系数据库使用二维格式的表来表示数据。这是简单表示现实世界中大量数据的强大手段,但实际上,也有一些类型的数据很难通过这种手段来表示。其中,具有代表性的就是图和非结构化数据。
图是数学术语,图通常包括组织图等树形图和表示社交网络服务(SNS)中间用户关系的网状图。前一种称为非循环图,后一种成为循环图。树形图正是被关系数据库抢占主流位置的曾测数据库的数据模型,而讽刺的是,关系数据库并不擅长表示树形图。
表示二维的,但层次结构是递归的。在平面二维表中,我们很难表示这种递归结构。关系数据库的表中方便存储的数据(CSV等)最初被称为“结构化数据”,与此相对,不容易使用表来处理的数据则称为“非机构化数据”。具有代表性的非结构化数据是XML和JSON。
对于关系数据库面临的这连个问题,存在两种解决方法。
1.改进关系数据库的功能
2.使用关系数据库之外的数据库。(NoSQL)
NoSQL的类型和解决方案
NoSQL泛指那些“基于不同于关系数据库的架构和数据模型的数据库”。不过,无论是哪种数据库,它们基本上都是用于解决前面介绍的性能和数据模型的问题。
性能问题的解决方案
关系数据性能问题的解决方案的思路大致如下两个:
1.简化数据模型,限制复杂的数据操作
2.消除单点瓶颈,使其可横向扩展。
遵循这种思路的解决方案在某种程度上牺牲了关系数据的优点,如“通过严格的试无控制确保数据完整性”“使用SQL实现高级数据操作”,以此来换取性能。
实现第一种思路的典型NoSQL是KVS(Key-Value Store,键值存储)。KVS的用途是使用唯一的键来实现高速查找(但无法执行连接等高级处理)。在熟悉编程的人看来,它是一个以关联数组为基本结构的数据库。Redis和memcached等产品拥有KVS功能。有的产品还会提供一些选项来提高性能,如进一步将这种简化的数据结构加载到内存中。另外,许多包含KVS的NoSQL产品使用多个数据实例来组成集群,从而横向扩展、提高性能。
非结构化数据的解决方案
为了处理非结构化数据而出现的一种NoSQL类型称为面向文档的数据库(也称文档数据库)。这种数据库无须将JSON或XML等自由度高的文档转换为关系数据的表就能够进行处理。这种类型的数据库产品有MongoDB、CouchDB等。另外,我们在前面还讲到关系数据库难以处理图这种数据模型,为了解决该问题,近年来人们也在不断开发图数据库,出现了Neo4h等产品。
NoSQL会替代关系数据库吗
现阶段还不是。这样说的原因有两个。
第一个原因是,在大多数情况下,使用NoSQL数据库是一种权衡利弊后的选择。当然,NoSQL系列产品的设计目的是弥补关系数据的缺点,从这个意义上来看,根据“新的评价标准”,它们确实超越了关系数据库。但是,(在用户知青的情况下)它们同时也牺牲了通过ACID事务管理原则实现的数据完整性和持久性,牺牲了使用SQL实现的高级数据操作和显示表间关联等功能。要实现破坏性创新,NoSQL必须在这些传统的评价标准中也超越关系数据库才行,而在这之前,关系数据库和NoSQL数据库从长远看仍是一种互补的关系。NoSQL刚出现时按字面意思被解释为“NO SQL”,给人感觉它时关系数据的反向存在,近年来,“Not Only SQL”的解释则更符合实际情况,原因之一就是它能够反映二者之间的互补关系。
第二个原因是,关系数据库也支持NoSQL的功能,二者之间的差距在开始缩小。随着Oracle、Db2、MySQL和PostgreSQL等主流关系数据库产品开始支持处理JSON和XML的功能,关系数据库和NoSQL之前的区别越来越模糊。Oracle和Db2等也开始支持图数据库,从这一点来看,NoSQL在将来很可能成为关系数据库的一个功能。
本节小结:
1.关系数据库取代层次数据库可以说是破坏性创新的一个很好的例子。以往,数据库只能由程序员和工程师来处理,而关系数据库使终端用户也参与到处理中,这一点具有划时代的意义。
2.破坏性创新是由具有传统评价标准无法衡量的新功能的产品引发的,但仅有新功能还不够,还需要在传统评价标准中也超越现有的产品。如果新旧产品各有取舍,则不会发生破坏性创新。
3.进入21世纪后,关系数据库的新能扩展和非结构化数据的处理等问题日益凸显,作为解决方案,NoSQL系列产品相继出现。不过,它们更有可能与关系数据库互补、共存,而不是第二次破坏性创新。




