《NoSQL精粹》读书笔记

第一部分:概念

1、为什么使用NoSQL

阻抗失谐:关系数据库的关系模型和内存中的数据结构之间存在的差异。

集成数据库:通常由不同团队所开发 的多个应用程序,将其数据存储在一个公用的数据库中。

应用程序数据库:其内容只能有一个应用程序的代码库直接访问,而这份代码库是由一个团队来维护的。

选用NoSQL原因:一是待处理数据量很大,或对数据访问的效率要求很高,从而必须将数据放在集群上;二是想采用一种更为方便的数据交互方式来提高应用程序开发效率。

NoSQL数据库共同特性

  • 不使用关系模型
  • 在集群中运行良好
  • 开源
  • 适用于21世纪的互联网公司
  • 无模式

2、聚合数据类型

聚合:把一组相互关联的对象视为一个整体单元来操作,该单元为聚合。

面向聚合数据库:键值数据库、文档数据库、列族数据库。

聚合无知:关系型数据库的数据模型中没有“聚合”概念,因此称之为“聚合无知”。

数据交互大多在同意聚合内执行,则使用面向聚合的数据库;若交互操作需要使用多种不同格式的数据,则用“聚合无知式数据库”。


3、数据模型详解

图数据库:将数据组织成一张由节点和变所组成的图,适合处理关系复杂的数据结构。

隐含模式:指在编写数据操作代码时,对数据结构所做的一系列假设。

物化视图:面向聚合数据库用不同的方式重组聚合的数据得出。(通常以映射化简来计算)


4、分布式模型

数据分布方式

分片:将不同的数据分片存放在多个服务器中,每一个数据子集都专门由一台服务器负责。

复制:将数据复制到多个服务器上,每份数据都能在多个节点中找到。

复制方式

主从复制:将其中一个节点当做权威数据源,并负责写入操作;其他从节点都要和主节点保持同步,他们可以负责读取操作。

对等复制:任何节点均可写入,节点间互相协调以同步其数据。

主从复制减少更新数据时的冲突几率,但它却会让主节点成为写入操作的瓶颈,对等复制则避免了这一点。


5、一致性

写入冲突与读写冲突: 当两个客户端试图修改同一份数据时会发生“写入冲突”;当某客户端在另一客户的执行写入操作的过程中读取数据时,会发生“读写冲突”。

更新一致性:悲观方式以锁定数据记录来避免冲突,乐观方式则在事后检测冲突并将其修复。

最终一致性:写入操作已经传播至所有节点。

CAP定理:一致性、可用性、分区耐受性这三个属性只能同时满足两个。当有可能发生“网络分区”现象时,必须在数据的“可用性”和“一致性”间权衡。

仲裁:在采用“复制”技术的分布式模型中执行数据库操作时,无需联系所有副本,只要足够多的副本所认可,就能保持“强一致性”了。


6、版本戳

版本戳:用来检测并发冲突。读取并更新某份数据后,可检测其版本戳,以确保在读取和写入操作之间,没有其他人更新过此数据。

版本戳实现方式:计数器、UUID、内容哈希码、时间戳等。

数组式版本戳:检测不同节点之间是否发生了“相互冲突的更新操作”。


7、映射-化简

映射-化简模式:一种安排数据处理流程的手段,可以利用及集群中的多台计算机,同时又能将某台计算机所需的数据及处理工作尽量放在本机执行。一种在集群上执行并发计算所用的模式。

映射:从聚合中读出数据,将之缩减为相关键值对。映射操作每次只能读取一条记录,所以可以在存放记录的节点上并发执行。

映射和化简:映射任务会生成许多具备同一关键字的值,而化简任务则将他们简化为单一的输出值。每个化简函数只操作单个键相关的映射结果,所以多个化简函数可以依据关键字执行并发化简。

”管道”:输入数据与输出数据形式相同的多个化简函数可归并为管道,以提高并发执行能力,减少所需传输的数据量。

如要广泛使用映射-化简计算的结果,可将其存储为物化视图。可用增量式映射-化简操作更新物化视图。


 

第二部分:实现

8、键值数据库

键值数据库:一张简单的哈希表,主要用在所有数据库访问均通过逐渐来操作的情况。(Riak、Redis、Memcached DB、Berkeley DB、HamsterDB、Amazon DynamoDB、Project Voldmort)

适用案例

存放会话信息

用户配置信息

购物车数据

不适用场合

数据间关系

含有多项操作的事务

操作关键字集合


9、文档数据库

文档数据库:可存放并获取文档,格式可是XML、JSON、BSON等。(MongoDB、CouchDB、Terrastore、OrientDB、RevenDB)

适用案例

事件记录

内容管理系统及博客平台

网站分析与实时分析

电子商务应用程序

不适用场合

包含多项操作的复杂事务

查询持续变化的聚合结构


10、列族数据库

 列族数据库:可存储关键字及其映射值,可把值分成多个列族,让每个列族代表一张数据映射表。(Cassandra、HBase、Hypertable、Amazon SimpleDB)

适用案例

事件记录

内容管理系统与博客平台

计数器

限期适用

不适用场合

需ACID事务操作读写的系统

早期原型开发或试探技术方案时


11、图数据库

图数据库:存放实体及实体间关系。(Neo4J、Infinite Graph、OrientDB、FlockDB)

适用案例

互联数据

安排运输路线、分派货物和基于位置的服务

推荐引擎

不适用场合

需要更新全部或某子集内的实体。


12、模式迁移

 迁移关系型数据库等强模式数据库,可将历次模式变更及数据迁移操作保存于 保本控制序列。

无模式数据迁移可用强模式迁移技术,也可用增量迁移,注意无模式的“隐含模式”。


13、混合持久化

 混合持久化:使用不同数据库计数处理多种数据存储需求。

将数据访问封装为服务,可减少数据库变动对系统其他部分的影响。

新增数据库技术会让编程及操作更复杂,需要权衡候选数据库带来的好处是否抵得过其引入的复杂度。


14、超越NoSQL

 文件系统:存放数量相对较少而且需要按大块处理的大文件。

事件溯源:将某个持续状态所发生的全部变更都持久化,而非仅仅持久化当前应用程序自身的状态。

内存映像:将应用程序状态放内存中。

版本控制:基于文件系统,最常使用的溯源系统。可让团队成员间协同修改复杂的互联系统。

XML数据库对象数据库。。。


15、选择合适的数据库

选用NoSQL原因

使用更符合应用程序需求的数据库来改善程序员工作效率

以能处理大量数据、降低延迟且增进数据吞吐量的某种技术组合来改善数据访问性能。

决定使用某个NoSQL技术前,一定要测试其是否如预期般改进了程序员工作效率及数据访问性能。

服务封装数据库:能在需求变更或技术成熟后改换其所封装的数据库技术。可将应用程序各部分规划到不同服务中,以便为既有程序引入NoSQL数据库。

大部分应用程序,尤其是“非战略性的”应用程序,应该继续使用关系型数据库技术,至少在NoSQL技术环境尚未成熟前。


 

posted @ 2017-08-18 16:28  heaventouch  阅读(428)  评论(0编辑  收藏  举报