从SQL到NoSQL:细说数据库的前世今生
SQL, or NoSQL, that is the question.
这是数据库行业的一个段子,这是很多公司实际遇到的问题。本篇将对关系型和NoSQL(非关系型)两大类数据库的发展史进行阐述。
了不起的Codd和他的关系模型
正如我们过去很久以来了解到的,SQL是传统的关系型数据库的通用查询语言,用以查询、更新和管理关系型数据库系统。所谓关系型数据库,就是指使用关系模型来组织数据的数据库。1970年,IBM的研究员E.F.Codd博士在刊物Communication of the ACM上发表题为A Relational Model of Data for Large Shared Data Banks(《大型共享数据库的关系模型》)的论文,文中首次提出了数据库的关系模型的概念。20世纪70年代末,关系方法的理论研究和软件系统的研制均取得了很大的成果,IBM公司的San Jose实验室研制的关系数据库实验系统System R获得成功。在之后的几十年中,关系模型的概念得到了充分的发展。20世纪80年代后,计算机厂商推出的数据库管理系统几乎都支持关系模型,一直以来数据库领域的研究工作大都以关系模型为基础。
而关于Codd博士的身世,也是充满了传奇的色彩。1923年8月19日,Edgar Frank Codd出生于英格兰南部海岸多塞特郡的波特兰岛上。他的父亲是一个皮革制造商,母亲是一名教师。20世纪30年代,他就读于多塞特的普尔文法学校,而后获得了牛津大学埃克塞特学院的全额奖学金,最初在那里学习化学。1942年,随着第二次世界大战的战火不断蔓延,Codd自愿服役成为皇家空军海岸司令部的飞行中尉,此后几年参与了许多重要空战。战争结束后,Codd回到牛津大学完成学业,转而学习数学,并于1948年获得学士学位。
Edgar Frank CoddCodd在皇家空军服役期间,曾被派往美国接受航空训练,正是这次经历让他认识到大洋彼岸可以为有创造力的人提供很多机会。因此,1948年从牛津大学毕业后不久后,Codd便移民到了美国。在纽约短暂从事售货员工作后,Codd在田纳西大学找到了一份数学讲师的工作。Codd进入计算机领域实际上是在1949年,那时他以编程数学家的身份加入了IBM,最初为IBM SSEC计算机开发程序。20世纪50年代初,他开始参与IBM 701计算机(IBM第一台商用计算机)的设计和开发。在IBM的资助下,Codd于1961年搬到了密歇根州开始在密歇根大学学习,并于1965年获得了通信科学的理学硕士和博士学位。
在回到IBM之后,Codd将他的注意力转向数据库问题。当时市面上已经存在一些数据库产品,然而它们的实现缺乏理论基础,而且几乎全都臃肿到难以使用,只适用于具有高度专业技术技能的人。Codd清楚地意识到,非常有必要建立一个数据库的理论基础,于是那项改变世界的重要发明——关系模型就这样诞生了。时至今日,在人们的日常生活中,仍然有数以千万计的设备依赖于关系型数据库。
从IBM到Oracle到ANSI/ISO标准:SQL的诞生
1971年,刚刚从斯坦福大学博士毕业的Don Chamberlin进入了IBM的Watson研究中心,那时的他可能还不知道,自己即将成为推动数据库发展并的重要人物,直到他和Codd相遇的那天。一天,Codd到Watson研究中心访问,在研讨会上Codd的演讲让Chamberlin第一次意识到关系模型的强大。Chamberlin从前一直在研究CODASYL语言,他意识到,一个CODASYL中要写5页的逻辑复杂的查询,在Codd的模型中可以只用一句来实现。关系模型这种强大的能力让Chamberlin醍醐灌顶,也改变了他未来的研究领域。
然而令Codd失望的是,由于关系模型与现有产品设计思路相左,IBM迟迟没有将这项天才般的设计纳入开发计划。与此同时,IBM的商业竞争对手们开始意识到关系模型的优点,并纷纷投入到关系数据库的研究。直到1973年,IBM终于将Codd的关系模型纳入开发计划,并计划在System R项目中实现它,而Chamberlin和Boyce也被调往该项目,Chamberlin担任该项目RDS组的经理。Chamberlin相信,Codd提出的关系代数和关系演算过于数学化,为了使关系数据库更适合于普通的程序员和使用者,Chamberlin和Boyce设想出一种操纵值集合的关系表达式语言——SQUARE。由于SQUEARE使用了键盘不支持的符号,Chamberlin和Boyce又开始对其进行了改进,并以自然语言为方向,于1974年发表了SEQUEL: A Structured English Query Language。有趣的是,SEQUEL这个名字曾被英国飞机制造商Hawker Siddeley注册,而后IBM重新开发时将其重新命名为SQL。
虽然IBM首创了关系数据库理论,但Oracle却是第一家在市场上推出了这套技术的公司。1979年,Oracle公司的前身Relational Software公司在Oracle数据库的V2版本中推出了第一个基于SQL的商用实现。1981年,IBM也发布了其第一个关系型数据库产品SQL/DS。1983年,IBM发布了针对大型机系统的DB2,后来也成为了IBM最成功的软件产品之一。从此,数据库领域的鳌头也被IBM和Oracle,以及1990年推出SQL Server的微软所占领。同时,SQL借助它简洁直观的优势,在市场上获得了的不错反响,从而引起了ANSI的关注。1986年,SQL成为美国国家标准学会(ANSI)的一项标准。1987年,国际标准化组织(ISO)将其采纳为国际标准。
SQL捉襟见肘之日,NoSQL崛起之时
从20世纪90年代开始,然而随着互联网和计算机的发展,关系型数据库也遇到了瓶颈,收到了诸多挑战。首先就是高并发时的性能问题,当数据库处于高负荷运转时,关系型数据库的性能会遇到瓶颈,这个时候的数据库操作会变得更加的费时,虽然可以使用memcached解决,但是也会带来hash不一致等问题。然后就是扩展性,当要给数据增加一个字段时,需要更改大量的表结构,这变相地增加了维护成本。还有就是恢复时速度缓慢,当一个关系型数据库的数据存储很多长文本或者大数据时,恢复数据的过程会变的更缓慢。
进入Web2.0时代后,大量个性化的网站应用如雨后春笋般涌现,这类网站的特点就是需要根据有用的定制实时生成不同的页面,因此也对数据库提出了很高的并发负载要求。在大数据的时代,用户摇身一变从信息内容受用者转变为信息内容提供者,各类社交网站上的用户每天会产生数以亿计的数据。如果单纯的使用普通的结构化数据库对这样的数据进行查询,其耗时之长想必是难以承受的。此外,越来越多的ISP服务商开始为各类应用提供可靠的高可用的云计算服务,越来越多的开发者开始将自己的应用和产品部署在云端。如何保障存储数据的海量性和高可靠性,逐渐成为数据库厂商需要进一步考虑的问题。
在互联网,大部分的SQL数据库都是 IO 密集型的,大数据量高并发环境下的 SQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。
就在SQL数据库捉襟见肘的时候,另外一批新技术开始出现。如果说分布式数据库技术是对数据库瓶颈的雪中送炭,那非关系型数据库技术便是对问题的釜底抽薪。NoSQL,也就是非关系型数据库,具有灵活的数据模型,可以处理非结构化/半结构化的大数据,同时又很容易实现可伸缩性,便于向上扩展和水平扩展。虽然NoSQL还处于一个起步阶段,存在着诸多不成熟的缺点和特性的缺失,但NoSQL依旧成为数据库领域最热门的研究方向之一。目前,NoSQL数据库可以大致分为四类:列式数据库,键值数据库,文档数据库,图数据库。
列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和即时查询。相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于小批量的数据处理,常用于联机事务型数据处理。最早的商业列式数据库是在1995年发布的Sybase IQ,但是一直到1999年左右才慢慢稳定到能够投入生产环境。目前应用最广泛的列式数据库是PostgreSQL,由PostgreSQL Global Development Group开源社区开发,是一款高级的企业级开源关系数据库。不得不说的是,PostgreSQL同时支持 SQL关系型和JSON非关系型查询。
键值数据库是使用简单的键值方法来存储数据的数据库。键值数据库将数据存储为键值对集合,其中键作为唯一标识符。键和值都可以是从简单对象到复杂复合对象的任何内容。键值数据库是高度可分区的,并且允许以其他类型的数据库无法实现的规模进行水平扩展,主要用于处理大量数据的高访问负载。目前最流行的键值数据库的是Redis,它是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。
文档数据库是键值数据库的子类,在键值数据库中,数据是对数据库不透明的,而文档数据库依赖于文件的内部结构来获取元数据,数据库引擎使用这些元数据进行更深层次的优化。在设计概念上,这种文档存储方式利用了现代程序技术来提供更丰富的体验。目前最流行的文档数据库是MongoDB,是一个由 C++ 语言编写的基于分布式文件存储的数据库,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
图数据库,是“图”这种数据结构来存储和查询数据的数据库,是最接近高性能的一种用于存储数据的数据结构方式之一。Neo4j目前为止是最受欢迎的图型数据库管理系统,由Neo4j, Inc.开发。
事实上,NoSQL数据库的发展历程可以追溯到20世纪60年代,然而MongoDB , CouchDB , Redis 和Apache Cassandra等数据库的流行才获取了更多的关注。尽管SQL和NoSQL有着相同的目标——存储数据。但它们存储数据的方式不同,不同的开发项目可能更适合于不同的某一类的数据库。一些项目可能会更适合使用SQL数据库,然而一些项目可能会比较适合使用NoSQL,有些项目使用哪一种都可以很好地达到预期的效果。
与此同时,越来越多的NoSQL数据库开始支持SQL,一些SQL数据库也采用了NoSQL数据库的特性。SQL与NoSQL的界限变得越来越模糊,并且一些新的混合型数据库将会在不久的将来提供更多的选择。