NOSQL(二)聚合数据模型,nosql聚合数据模型


《NoSQL精粹》读书笔记,转载请注明出处《jiq•钦's technical Blog》

 

一、NoSQL的数据模型

关系型数据库的数据模型是“关系”和“元组”,一个关系对应一张表,而一个元组对应一行,其中元组由一系列的值组成,不能嵌套。        

NoSQL数据库最大的转变就是抛弃了关系模型。但是每种NoSQL解决方案模型都不同,大体上可以将NoSQL数据模型分为四类:“键值”、“文档”、“列族”、“图”,前三类模型都有一个共同特征,称为“聚合模型”。

 

二、聚合模型

2.1 什么是聚合?

聚合是“领域驱动设计”中的概念,通常我们想把一组相互关联的对象视为一个整体单元来操作,这个单元就是聚合。

举个例子,有个购物网站,需要管理用户信息、商品信息、收货地址信息、订单信息、付款方式等,如果用关系模型来描述,将会被划分为用户表、订单表、商品表、付款方式表等,表与表之间存在某种关系。如果用聚合的思路来做,一种方式是分为两个聚合,一个聚合是用户,由用户基本信息和收货地址信息等组成,一个聚合是订单,由商品列表、付款方式等信息组成;另一种方式还可以将用户下面的所有订单全部都放到用户聚合中。

如何划分聚合并没有标准的答案,这完全取决于你如何操作你的数据。如果想要一次性访问用户的所有订单,就放到一个大的聚合中,如果想要针对专门的一比订单处理,则划分为用户和订单两个聚合比较好。

 

2.2 为什么选用聚合模型?

选用面向聚合的模型决定性因素,在于其非常适合于在集群中运行。

根据场景来设计聚合,可以将采集数据时所需的节点数降至最小。在数据库中明确包含聚合结构,就可以根据这个信息知道哪些数据需要在一起操作了,这些数据就应该放在同一个节点上。总之在集群上运行时聚合是中心环节,因为数据库必须保证将聚合内的数据放在同一个节点上。聚合还是更新操作的最小数据单位,对事物控制来说,以聚合为操作单元正合适。

 

2.3 聚合对事务处理的影响?

关系型数据库有事务的概念,可以将任意表格任意行放在一个ACID事务中操作,具备原子性、一致性、隔离性和持久性,这里面的核心主要是原子性。

而面向聚合的数据库不支持跨越多个聚合的ACID事务,取而代之的是只能在一个聚合结构上执行原子操作,不过实际应用中大多数原子操作都可以局限于聚合结构内部,而且我们在划分聚合时这也是要重点考虑的关键因素之一。

 

三、几种不同风格的面向聚合数据模型

3.1 键值数据模型和文档数据模型

         共同点:都包含大量聚合,每个聚合中都有一个获取数据所用的键或ID。

         区别:键值数据库将聚合看做不透明的整体,是没太多意义的大块信息,只能根据键来查出整个聚合。文档数据库中聚合对数据库透明,可以查询并获取其中的一小部分数据。不透明的优势在于可以存储任意数据,而文档数据库则要限制其中存放的内容,定义了允许的结构和数据类型,这样做好处是可以灵活地访问数据。

         你可能觉得在文档数据库中放置一个ID字段用作“键值式查询”,这样就和键值数据库一样了,但区别在于键值数据库就是通过键来搜索内容,而文档数据库提交的查询关键词往往是基于文档内部结构,可能是键,也可能是其他东西。

 

3.2 列族数据模型

         大多数数据库以行为单位存储数据,尤其是在需要提高写入性能时尤为如此。然而某些场合下写入操作少,但经常需要一次性读取若干行中的很多列,这种情况下将所有行的某一组列作为基本数据存储单位效果最佳。“列存储数据库”由此而来。

         BigTable及其后继者遵循了“以一组列(列族)来存储”的概念。

         理解列族模型最好的方式是将其视为“两级聚合结构”。比如一个以列族模型描述的用户信息结构,每一行代表一个用户,包含了基本信息列族(有姓名、住址、年龄等信息)、订单列族(包含所有订单列表)等,其中第一级聚合就是“行聚合”,是行键到一行数据的映射,包含了一些有用数据块(基本信息、订单信息)的列族。第二级聚合是“列族聚合”,每一个列族都定义了一种记录类型,如客户信息。

相关内容