NOSQL这一大桌麻将

我所知道的IT术语中,没有比“NOSQL”更糟糕更混乱的了。甚至它超过了面向对象、软件工程和设计模式。后三者至少还大大繁荣了出版业、硬件制造业,提供了大量的开发人员就业机会。

基本上你对这个潮流有一些基本的了解,就会知道,所谓的“NOSQL”运动,大多数是指的非“关系数据库(Relational Database)”。所以,它应该叫“NORDB”更准确一些。我们看看这几年出现的,“NOSQL”的主要口号:

  • 不使用外键关联、
  • 不使用固定字段格式
  • MapReduce
  • KV数据库
  • 牺牲一致性和完备性,提高性能
  • 使用API接口,而非文本方式访问

这里我只列举了想到的一些,欢迎大家补充。我们可以看到,除了最后一条,其它其实与SQL无关。SQL全称“结构化查询语言”,是一门语言,它其实不拘于某一种数据库模型,很多LDAP(层次型数据库)实现都提供了SQL接口,包括著名的KV数据库BDB,新版中也有SQL支持。而就算“非关系”这个主题,总的来说,数据库领域非常的广大,关系型数据库虽为主流,但是其它模型的也很多,仅仅简单的将KV等同于非关系数据库(不是我乱讲,确有一部分同行有此误解),也不恰当。著名的MongoDB就不是KV模型,CouchDB也不是。NOSQL运动要解决的问题,并不完全由SQL语言引起,也不完全是因为关系模型。

不夸张的说,关系数据库是近二十年来MIS和互联网产业得以存在的基础。没有关系型数据库,肯定还是会有C/S和B/S模式,会有动态更新的网站服务,但开发成本会比现在高出很多很多,至少多出两个数量级毫不夸张。几个主流的关系型数据库产品,共同实现了一个不可能的任务:为IT业提供一个同时满足各种性能和功能需求,使用起来又足够简单的,持久化信息存储平台。

曾几何时,软件/互联网开发,就是写一个客户端或网页,用来对数据库的表进行增删改查,甚至业务逻辑也写进数据库,前端只访问存储过程。

但是,从那时到现在,已经几十年过去了,当年被强大好用的关系数据库掩盖的各种问题,随着性能和存储空间的压力,逐渐暴露出来。首先单节点的服务器已经不能再满足数据管理的需要,再强大的主机也存不下潮水般涌入的数据。大多企业是买不起更贵的服务器,买得起的金主,也要考虑世上有没有容量无限增长的主机。好吧到此为止仍不是关系型数据库的问题,我们还可以分库——但是,分库这个行为已经悄悄开始改变关系数据库的使用行为。接下来,就是速度问题。

这里仍然回到我前两篇博客的观点:计算机不会魔法。很多关系数据库的应用,其实抽象成键值关系,或层次等其它模型,会更贴切,更简单,于是有更高的性能。

另一些应用,如面向文档的应用,本身是一种动态结构,存储于正规的关系表设计中时,代价比较高,此时文档/OO数据库往往表现更佳。强制用关系泛式设计动态结构,很麻烦。我有一个实验项目 Socrates ,就是尝试在关系数据库中,以双键定位Value,实现动态结构。性能非常糟糕。:)

还有一些应用,使用关系数据库的考虑是为了全面满足对可靠性和一致性的需求,但是很多应用,未必在意这一点。举个简单的例子,网游玩家的PVE战斗,他不会需要把整个战斗过程都存进关系数据库,随时增删改查。最多有一段日志即可(除非爆了史诗神器神马的,不然鬼才在意啊~)。同样如果服务器停机维护,玩家也不会希望严格的继续之前的战斗,他们宁可上线后看到自己的角色回到最近的安全区。此类对一致性和可靠性要求不高的应用环境,并不罕见。

另一方面,并非只有银行才会有高可靠性的事务需求,就算是游戏中,准备买卖之类的需求,也往往是可靠性要求高很的。这个不同于战斗,一丝一毫都不能出错,否则随时可能会被投诉。

再如博客和论坛,这类应用有时能够接受一定程度的崩溃和数据丢失,搜索引擎,能接受一定程度的延时,各种应用场景不同,对数据的要求不同。

上一个世代,被关系型数据库强大的建模能力所掩盖的伸缩性、健壮性、性能等种种问题在这个信息大爆炸的时代,充分的暴露出来。工程师们将一些模型直接对应到专门的数据库,特别是KV模型,因为分离后性能提升明显,使用又简单,被广泛使用,而且出现了大量不同的实现,各自有自己的特色,有些专长性能,有些配置管理容易,有的特别适合存储二进制数据等等 。另一方面,随NOSQL潮流兴起的绝不止KV,像前面提到的MongoDB就是广受关注的一个,它的特色是写入速度极快,这在复杂结构的数据库独树一帜。不过它是以磁盘空间为代价实现的。

类似这些产品,与常见的关系型数据库相比,往往模型不是那么通用,能力也不均衡,而正是这种不均衡,使它们可以更好的满足不同应用场景。仍然是那句“计算机没有魔法”。均衡带来通用性,但有取舍可以更好的满足具体的项目需求。一时间各种模型各种实现,中心服务器式的,分布式的,嵌入式的纷纷出台,这些数据库产品的兴起与动态语言的流行相反,后者是得益于迅速发展的计算资源,前者则受制于更为汹涌的数据增长。在当前,大型应用往往有越来越复杂的存储管理层,有基于内存的cache层,有快速的KV数据库支持,有管理重要数据的关系型数据库,有支持海量文件的文件系统,有专用于数据挖掘的MapReuce类服务等等。伴随这十年来的发展,架构师这个岗位开始变得重要。这一切,早已经超出了NOSQL这个字面的含义。这是一次进化,是多样化的演进,不是世代更替,一样淘汰另一样。

在未来,我们有更多好用的工具,但也需要学习更多的知识,这个行业,仍然在变得越来越复杂。计算机没有魔法,一切问题与挑战,需要企业与团队的智慧去解决 。

你可能感兴趣的:(NoSQL)