NoSql是一种语言,还是一种概念?

我对于 @vczh 所引用的言论有不同观点,我承认从功能上sql更强,但是我理解的故事是这样的。

自从某大牛发明了一个完美容器S后,大家都发现这个S非常好,可以排序,查找,任意的增删改,还很nb的多线程安全。于是所有的人都开始使用(或者自己实现)这个完美的容器

S。但是又过了很久有人跳出来说,其实在某个业务下,我只需要FIFO的队列或者堆栈就可以了,也用不上多线程。此时为什么还要用通用的完美容器呢?难道那些特性不用成本的吗?

空口说比较无趣,我举一个现实的例子。我曾就职的一个公司有一个系统要是对用户给出推荐的广告。流程很简单,根据cookie查找用户属性,然后有专门的系统给出推荐列表。

我们只讨论这个根据cookie查找用户属性。这个功能用sql可以做吗?当然可以,但是为什么要用sql?1、这个特性永远永远是1对1的查找,不需要任何sum,count等功能;2、这个特性永远永远是从cookie搜索属性,不需要根据属性来查找,所以where也用不上(更别说join了);3、数据只有一个更新者,基于hadoop的机器学习程序,所以锁也不是必须的;4、这个业务甚至不介意脏数据,如果因为同步等原因造成读到的事旧的属性,也不过就是拿昨天的数据给他推广告罢了。

这个业务真正关心的是什么?时延一定要小,上游对整个广告过程只给了500ms,你还需要去竞价,需要去选择广告,还要预留网络时延。数据量大,中国的网民数量是比较多的,几亿条记录是下限。并发要高,每当网民打开一个网页,有几个广告位就会发生几次广告竞价。最后,很不幸这个业务毛利率很低,要是在软件或者硬件是花费过多有可能亏本的。

所以这个特性我相信业界都是使用key-value数据库,redis放得下就用redis(以前没有集群,单机放不下得想其他办法)。在抛弃掉sql不必要的束缚后,kv数据库可以在同样的软硬件成本下,实现更低的时延和更高的吞吐量。

我的高中数学老师曾经说过一句话,“你一定要掌握一个问题的通解,因为在考试的时候你无法保证可以在有限的时间内找到特解”;而我的大学老师(好像是信号处理)说过另外一句话“如果你没有找到某个问题的特解,那么说明你还不够了解这个问题”。

sql是一个很好的通解,这个框里面你可以放任何东西,而且它的一切都是可以预期的。但是当行业不断发展了之后,大家开始对业务上的一些问题了解越来越深入,而且这些业务的量也大到了你愿意单独为它搭一套系统。此时,不同的nosql作为不同特定问题的特解出现就自然而然了。

所以nosql不可能取代sql,但它本身的发展也是不可逆的。另外给一个建议,如果你的系统访问量用一个单机mysql就可以搞定,那么还是继续用mysql吧,别本末倒置。