目录
5.1 NoSQL数据库
Not only SQL特点
灵活的可拓展性(相比关系型数据库可以进行水平扩展)
灵活的数据模型(关系型数据库行列遵循严格的关系代数关系,NoSQL则没有严格的模型规范)
和云计算紧密结合
传统的关系型数据库特点
具有非常完备的关系理论基础;具有事务性机制的支持;具有高效的查询优化机制。
无法满足海量数据的管理需求;无法满足高并发的需求;无法满足高可扩展性和高可用性的需求。
MySQL集群方式的缺陷
复杂性,整个集群部署管理配置都非常复杂。
延迟性,主机数据的复制一般采用异步方式,当主库压力较大时,就会带来较大的延迟。
扩容问题,整个集群压力过大时,需要增加新机器对整个数据集进行重新分区,非常复杂。
5.2 NoSQL与关系型数据库的比较
数据库原理
关系型数据库:具有完备的关系代数理论作为基础。
NoSQL数据库:没有统一的理论基础,各有规范。
数据规模
关系型数据库:很难实现横向扩展,纵向扩展非常有限。
NoSQL数据库:具有非常好的水平可扩展性。
数据库模式
关系型数据库:要定义严格的数据库模式,且严格遵守事先定义的数据库模式。
NoSQL数据库:数据模型非常灵活,可以存储不同类型的数据。
查询效率
关系型数据库:适当数据量级查询效率高,数据量级增大查询效率下降。
NoSQL数据库:未构建起面向复杂查询的索引,查询性能差。
事务一致性
关系型数据库:遵循ACID事务模型,可以保证事务强一致性。
NoSQL数据库:只能保证最终一致性,不能保证事务强一致性。
数据完整性
关系型数据库:具有保证完整性的完备机制。
NoSQL数据库:不能实现完整性约束。
可用性
关系型数据库:规模增大后,为了保证严格的一致性可用性方面会被削弱。
NoSQL数据库:牺牲一部分一致性,能够在短时间内迅速返回所需的结果,具有很好的可用性。
标准化
关系型数据库:遵循SQL标准,标准化比较完善。
NoSQL数据库:未形成通用的行业标准。
技术支持
关系型数据库:很多都是商业数据库,可以获得非常强大的技术和后续服务支持。
NoSQL数据库:很多属于开源产品,处于整个发展的初期阶段。
可维护性
关系型数据库:需要管理员维护。
NoSQL数据库:没有成熟的基础和实践操作规范,维护较为复杂。
5.3 四大类型NoSQL数据库
键值数据库
数据模型
键是一个字符串对象,值可以是任意类型的数据,比如整型,数组,列表,集合等等。
典型应用
涉及频繁读写、拥有简单数据模型的应用,内容缓存,如会话、配置文件、参数、购物车等,存储配置和用户数据信息等移动应用。
优缺点
扩展性好,灵活性好,写操作性能非常高;无法存储结构化信息,条件查询效率较低(必须通过key才能找到对应的值,无法直接对值进行查询)。
不适用情形
键值数据库没有通过值查询的途径;不能通过两个或两个以上的键来关联数据;在一些键值数据库中,产生故障时,不能回滚。
键值数据库是理想的缓冲层解决方案。
列族数据库
数据模型——列族
典型应用
分布式数据存储与管理;数据在地理上分布于多个数据中心的应用程序;可以容忍副本中存在短期不一致情况的应用程序;拥有动态字段的应用程序。
优缺点
查找速度快、可扩展性强、容易进行分布式扩展、复杂性低;功能较少,大都不支持强事务一致性
不适用情形
需要ACID事务支持的情形时某些产品不适用。
文档数据库
数据模型
JSON数据格式,本质上就是一个键值数据库,不够值Value是版本化文档。
典型应用
存储、索引并管理面向文档的数据;或者类似的半结构化数据。
优缺点
能够将它自己的数据内容和类型进行自我描述,文档数据库可以完整包含在一个文档里,更好的并发性(在对数据进行更新时,只需要锁定一个文档就可以把相关数据修改掉),提供嵌入式文档功能,可以把经常查询的数据存储在同一个文档中;缺乏统一的查询语法。
不适用情形
文档数据库不支持文档间的事务。
图数据库
数据模型——图结构
典型应用
专门用于处理具有高度相互关联关系的数据;比较适合于社交网络、模式识别、依赖分析、推荐系统以及路径寻找等问题。
优缺点
灵活性高,支持复杂的图形算法,可用于构建复杂的关系图谱;数据类型应用范围非常有限。
不适用情形
关联性差的数据。
5.4 NoSQL数据库的理论基石
CAP
Consistency一致性
指任何一个读操作总能读到之前完成的写操作结果。
Availability可用性
指快速获取数据,可以在确定的时间内返回操作结果,保证每个请求不管成功或者失败都有响应。
Partition tolerance分区容忍性
指当出现网络分区的情况时(即系统中的一部分节点无法和其他节点通信),分离的系统也能够正常运行。
一个分布式系统不可能同时满足一致性、可用性和分区容忍性,只能三者取其二。
CA:强调一致性(C)和可用性(A),放弃分区容忍性(P)
最简单的做法是把所有与事务相关的内容都放到同一台机器上。很显然,这种做法会严重影响系统的可扩展性。传统的关系数据库(MySQL、SQL Server和PostgreSQL),都采用了这种设计原则,因此,扩展性都比较差。