数据库技术的前世今生

最近读到一些关于数据库技术发展的文章,基本都是围绕着SQL与NoSQL的讨论来展开的。记得当初在NoSQL运动刚刚起步的时候,“say no to SQL”的口号不绝于耳,当然口号并没有成为现实,人们最终普遍接受了Not-Only SQL的说法。但真的要给NoSQL下一个定义,还真不是件容易的事,人们习惯把MongoDB、Redis这样的产品作为NoSQL普遍定义,可以归结为那“四大类”。但对于我来说,上次采访某大数据架构师的说法则更加中肯,凡是没有用到SQL的都算是NoSQL,即便是在传统的关系型数据库里。

也就是说,你可以把它们看作是一对好基友,你中有我,我中有你。用软件工程师Martin Fowler的一篇文章其中提到的词来形容就非常贴切:Polyglot Persistence。它翻译成中文可以叫做混合持久化或者多语言持久化,所以说在未来的数据库技术领域,将很有可能打破所谓的关系型和NoSQL之间的界限,用不同的工具达到不同的目的,将各种数据库技术杂糅在一套系统中,各司其职。因此,就像Fowler所说的,无论怎样定义NoSQL都是无用功。

关系型数据库(SQL)成为主流技术已经超过20年,这是有它的道理的。它把数据存储在磁盘中,人们可以通过最标准化的语言SQL来对数据进行各种操作。它的事务性(transactional)能够为有效地提供用户并发访问控制,并为应用程序的数据调用提供一致性。而且由于关系型数据库主要存储结构化数据,它的数据模型和标准化更加适用于报表(Report)的生成。

但是关系型数据库的最大问题在于,它的设计初衷是要运行在单一的服务器上,因此在进行Scale-out的时候很可能会遭遇巨大的瓶颈。Scale-up就是你买更大的机器来跑数据库,Scale-out就是用多个普通服务器组成集群,让数据库分布在这个集群的节点当中。而集群(Cluster)的概念就是用更多的机器来做一件事,这其中如果一个机器宕掉,其他的机器还可以继续运行,因此整个集群也能够正常的工作。在这方面,一些大型的互联网公司走在了前面,像Google和Amazon都运行了非常大型的集群,在逐渐就衍生出了云计算的概念。他们都意识到,SQL数据库在应对集群方面出现了比较大的性能瓶颈,因此纷纷放弃SQL,自己开始研发出像BigTable和Dynamo这样的存储平台,它们应该算是最早的NoSQL数据库。

于是,人们开始注意到这个问题,各种各样的NoSQL产品也涌现出来。Adewale把这类数据库的特点归结为:不使用关系数据模型,不使用结构化查询语言;往往针对大型集群设计;没有固定的模式(Schema),一条记录中可以存储任意数据;往往是开源的。它主要解决的一个问题就是大数据集存储,使用NoSQL数据库的大型集群可以存储PB级别的数据,并处理大量的分析数据。而多种多样的数据模型,可以用来应对不同类型的数据,比如文档、图片、视频等非结构化数据。

当然这并不是说要放弃关系型数据库,在应对特定类型的数据时它依旧是最高效的。而像ACID和第三方工具支持等方面,NoSQL数据库还远远比不上传统关系型数据库。所以Fowler建议人们考虑所谓的混合持久化原则,即根据不同应用对数据的需求,而使用多种数据存储技术。举例来说,快速的读写访问,无需持久性的应用可以使用Redis;财务和报表系统,可以使用关系型数据库;集群的大规模分析数据,可以使用Cassandra;而读操作很多,写操作很少的,则可以使用MongoDB。人们可以自行选择合适的数据库技术,而无需一股脑全部使用SQL数据库。

本文主要说了一下SQL和NoSQL数据库的发展情况以及各自优劣,下一篇文章将更多地讨论混合持久化原则,如何用好Polyglot Persistence。