随着数据规模、并发量越来越大,非关系型数据库NoSQL(Not Only SQL)越来越受到重用
NoSQL带来了很多新特性,比如良好的可扩展性、弱化设计范式、弱化一致性要求,在应对高并发问题时表现良好,使其更加适应海量数据的应用场景
在海量数据场景中,SQL数据库面临几个明显的挑战:
事务
关系模型要求多个SQL操作满足ACID特性,要求强一致性
分布式系统中,要保证它们的原子性,就要用到分布式协议,性能成本高
NoSQL只要求最终一致性,而非ACID
结构化
SQL数据库有个特点:高度组织化结构化数据
设计时需要满足范式要求,例如
班级表中有编号、名称、简介等,那么在学生表中,包含班级编号后,就不能加入班级名称、简介等信息
这样可以避免大量的数据冗余,但同时会带来大量的联表操作
NoSQL中没有这类要求,为避免多表关联操作,往往会使用数据冗余简化数据结构,提升性能
NoSQL的存储结构也不限于表,很丰富,有:键值对存储,列存储,文档存储,图形结构,可以满足不同需求
性能
关系数据库主要基于硬盘,NoSQL更多的使用了内存
关系数据库主要采用B树存储引擎,NoSQL的存储引擎更加丰富,例如LSM树,写性能大幅提高
需要注意的是,NoSQL在海量数据场景中有一些优势,但不代表NoSQL要取代SQL
比如银行系统,该类系统需要使用具备强数据完整性、支持事务的健壮存储系统,SQL数据库就更加适合
他们是互相帮助的关系,二者的优势会不断融合
NoSQL也有一些问题,例如:
缺少统一标准
SQL数据库已经高度标准化,有完整的生态链
而NoSQL家族庞大,思路各不相同,没有统一标准
运维复杂
NoSQL存储结构很丰富,非常强大,但同时也意味着繁杂,使其学习、应用、运维的成本增高
而关系数据库有丰富的运维工具和大量经验丰富的运维人员