前言
本博客写于阅读完《NoSQL精粹》这本书之后,作为一篇读书笔记,想要了解NoSQL的朋友可以从这个博客里面整理一些知识,也希望熟练NoSQL的朋友读完也有收获
首先对NoSQL进行一个简单的介绍,最初的NoSQL表示的是“开源分布式的非关系型数据库”,但是NoSQL具体含义是什么并没有一个权威的定义,实际上大部分人的定义是“not only sql”,而并非是对sql说不,不用去纠结为什么不是NOSQL而是NoSQL,我们只需要理解NoSQL表示的是一般具有开源特征,不适用SQL,为了在集群中使用(不全是),一般不需要使用模式(不用事先修改结构定义即可自由添加字段)
1. 为什么使用NoSQL
大多数NoSQL研发动机都是要在集群环境中运行,也有例外(图数据库);需要在集群上(单个机器存储大数据不现实)运行大量数据,但是关系型数据库不能在集群中高效运行,这导致“混合持久化”的出现,也就是针对不同场景使用不同的数据存储方式。
选用NoSQL的主要原因:
- 待处理的数据量很大,对数据访问的效率要求很高,从而必须把数据放在集群上
- 采用一种更为方便的数据交互方式来提高应用程序开发效率
各种NoSQL数据库的共同特征:
- 不使用关系模型
- 在集群中运行良好
- 开源
- 无模式
NoSQL生态系统中广泛使用的模型:键值,文档,列族,图
2. 聚合数据模型
聚合
数据模型指数据库组织数据的方式,正式名称为“元模型”
聚合的概念可以通过下面的例子进行理解,客户和订单就是两个聚合。当然,这个数据库的设计还可以设计成一个聚合的形式,聚合的设计依赖于你想怎么操纵数据库在这里插入图片描述
一般来说,面向聚合的数据库不支持跨越多个聚合的ACID事务(原子性,一致性,隔离性,持久性),它每次只能在一个聚合结构上执行原子性操作
聚合数据库在集群上管理数据存储更方便
键值数据模型和文档数据模型
这两种数据模型主要都通过聚合来创建,每个聚合中都有一个获取数据所用的键或ID。
键值数据库聚合不透明,不需要知道其中内部实现细节就可以为外部程序使用;文档数据库聚合可以看到其中结构。因此键值数据库可以在聚合中存储任意数据,文档数据库定义了其允许的结构和数据类型,,需要限制存放,但是访问数据更加灵活。
键值数据库依赖于键来搜索聚合内容;文档数据库提交的查询关键词往往基于文档的内部结构
列族存储
将这种存储方式视为两级聚合结构比较好理解,第一个键代表行标识符,可以用来获得想要的集合,每个行聚合本身又是一个映射;第二个键就是列,
用更直观的hbase存储来看就是下面这样:
所以有两种数据组织方式:
面向行:每一行都是一个聚合,聚合内部存有一些包含有用数据块的列族
面向列:每个列族都定义了一种记录类型,其中每行是一条记录
总结
这三种数据库都使用了聚合的概念,而且都拥有可以查找其内容的索引键,聚合也是”更新“操作的最小数据单位。
键值数据模型将聚合视为不透明的整体,只能根据键来查出整个集合;
文档数据模型对数据库透明,可以仅仅查询一部