2.3.4 SQL与NoSQL

随着互联网的飞速发展,数据规模越来越大,并发量越来越高,传统的关系数据库有时显得力不从心,非关系型数据库(NoSQL,Not Only SQL)应运而生。NoSQL系统带来了很多新的理念,比如良好的可扩展性,弱化数据库的设计范式,弱化一致性要求,在一定程度上解决了海量数据和高并发的问题,以至于很多人对“NoSQL是否会取代SQL”存在疑虑。然而,NoSQL只是对SQL特性的一种取舍和升华,使得SQL更加适应海量数据的应用场景,二者的优势将不断融合,不存在谁取代谁的问题。

关系数据库在海量数据场景面临如下挑战:

●事务 关系模型要求多个SQL操作满足ACID特性,所有的SQL操作要么全部成功,要么全部失败。在分布式系统中,如果多个操作属于不同的服务器,保证它们的原子性需要用到两阶段提交协议,而这个协议的性能很低,且不能容忍服务器故障,很难应用在海量数据场景。

●联表 传统的数据库设计时需要满足范式要求,例如,第三范式要求在一个关系中不能出现在其他关系中已包含的非主键信息。假设存在一个部门信息表,其中每个部门有部门编号、部门名称、部门简介等信息,那么在员工信息表中列出部门编号后就不能加入部门名称、部门简介等部门有关的信息,否则就会有大量的数据冗余。而在海量数据的场景,为了避免数据库多表关联操作,往往会使用数据冗余等违反数据库范式的手段。实践表明,这些手段带来的收益远高于成本。

●性能 关系数据库采用B树存储引擎,更新操作性能不如LSM树这样的存储引擎。另外,如果只有基于主键的增、删、查、改操作,关系数据库的性能也不如专门定制的Key-Value存储系统。

随着数据规模越来越大,可扩展性以及性能提升可以带来越来越明显的收益,而NoSQL系统要么可扩展性好,要么在特定的应用场景性能很高,广泛应用于互联网业务中。然而,NoSQL系统也面临如下问题:

●缺少统一标准。经过几十年的发展,关系数据库已经形成了SQL语言这样的业界标准,并拥有完整的生态链。然而,各个NoSQL系统使用方法不同,切换成本高,很难通用。

●使用以及运维复杂。NoSQL系统无论是选型,还是使用方式,都有很大的学问,往往需要理解系统的实现,另外,缺乏专业的运维工具和运维人员。而关系数据库具有完整的生态链和丰富的运维工具,也有大量经验丰富的运维人员。

总而言之,关系数据库很通用,是业界标准,但是在一些特定的应用场景存在可扩展性和性能的问题,NoSQL系统也有一定的用武之地。从技术学习的角度看,不必纠结SQL与NoSQL的区别,而是借鉴二者各自不同的优势,着重理解关系数据库的原理以及NoSQL系统的高可扩展性。