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及其后继者遵循了“以一组列(列族)来存储”的概念。

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

时间: 2024-08-09 22:29:17

NOSQL(二)聚合数据模型的相关文章

NoSQL聚合数据模型

NoSQL聚合数据模型 特点 聚合数据模型的特点就是把经常访问的数据放在一起(聚合在一块): 这样带来的好处很明显,对于某个查询请求,能够在与数据库一次交互中将所有数据都取出来: 当然,以这种方式存储不可避免的会有重复,重复是为了更少的交互: 缺点 聚合结构对某些交互有利,却阻碍另一些交互: 比如:以学生学号聚合学生信息(含学生姓名.班级.年龄.等信息,甚至英语学科成绩),通过学号查询时,能够在一次交互中查询出该学生的所有信息,但如果想通过学生姓名来查询,就很困难: 不支持跨越多个聚合的ACID

NOSQL(三)分布式数据模型

<NoSQL精粹>读书笔记,转载请注明出处<jiq?钦's technical Blog> 催生NoSQL的主要原因是:需要一种能够运行在大集群上的数据库 面向聚合的数据库非常适合于横向拓展的集群架构,聚合自然成为了数据分布单元,而数据分布主要有两条路:"复制(replication)"和"分片(sharding)",复制是将同一份数据拷贝至多个节点,分片是将数据分散存放到不同节点上. 1 单一服务器 若使用NoSQL数据库的目的基本上是为了

python操作mongodb之二聚合查询

#聚合查询 from pymongo import MongoClient db = MongoClient('mongodb://10.0.0.9:27017/').aggregation_example #准备数据 result = db.things.insert_many([{"x": 1, "tags": ["dog", "cat"]}, {"x": 2, "tags": [&

基于 MongoDB 动态字段设计的探索 (二) 聚合操作

业务需求及设计见前文:基于 MongoDB 动态字段设计的探索 根据专业计算各科平均分 (总分.最高分.最低分) public Object avg(String major){ Aggregation aggregation = Aggregation.newAggregation( Aggregation.unwind("courseList"), Aggregation.match(Criteria.where("major").is(major)), Agg

NoSQL数据模型详解(四)の聚合型小结

背景 在前三篇文章中已经介绍了NoSQL中属于聚合模型的三种数据库:键值型.文档型.列族型.下面针对三种聚合数据模型的共同点和不同点加以分析以便很好的来认识掌握各自的特点. 相同点 三种面向聚合的数据模型的共同点是,他们都是用聚合这一概念,而且聚合中都有一个可以查找其内容的索引键.在集群上运行时,聚合都是重点环节,因为数据库必须保证将聚合内的数据存在同一节点上.聚合还是"更新"操作的最小数据单位,对于事务控制来说,以聚合为操作单元,其大小正合适. 不同点 键值数据模型将聚合看作不透明的

《NoSQL精粹》读书摘要

一.Why NoSQL? 关注NoSQL的两个原因 应用程序的开发效率(NoSQL简化了数据交互) 大规模的数据(NoSQL为集群环境而设计) NoSQL不是独立存在的,以后也不会取代关系型数据库,以后数据库领域将步入混合持久化(Polyglot Persistence)时代. 关系型数据库的优点: 标准化的建模 较为容易的处理关系 通过事务来处理并发 可以持久化 关系型数据库的缺点: 阻抗失谐:关系型数据库中的存储结构(模式.表.元组)与应用程序中的数据结构需要转换.ORM框架可以解决这个问题

《NoSQL精粹》读书笔记

NoSQL数据库数据模型的一般分类: 1. 键值数据模型 2. 文档数据模型 3. 列族数据模型 4. 图数据模型 常见NoSQL数据库: Redis, Cassandra, MongoDB, Neo4J, Riak... 数据库应用趋势: 1. 由于数据量越来越大,大型系统的扩展方式由数据库在单一计算机上的纵向扩展->在计算机集群中的横向扩展 2. 混合持久化(关系型数据库 + NoSQL数据库) 第一部分 第1章 为什么使用NoSQL * 关系型数据库和应用程序之间的“阻抗不匹配”.关系模型

Hbase总结(一)-hbase命令,hbase安装,与Hive的区别,与传统数据库的区别,Hbase数据模型

Hbase总结(一)-hbase命令 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令表达式 创建表 create '表名称', '列名称1','列名称2','列名称N' 添加记录 put '表名称', '行名称', '列名称:', '值' 查看记录 get '表名称', '行名称' 查看表中的记录总数 count  '表名称' 删除记录 delete  '表名' ,'行名称' , '列名称' 删除一张表 先要屏蔽该表,才能对

NoSQL精粹pdf

下载地址:网盘下载 内容简介  · · · · · · <NoSQL精粹>为考虑是否可以使用和如何使用NoSQL数据库的企业提供了可靠的决策依据.它由世界级软件开发大师和软件开发"教父"Martin Fowler与Jolt生产效率大奖图书作者Pramod J. Sadalage共同撰写.书中全方位比较了关系型数据库与NoSQL数据库的异同:分别以Riak.MongoDB.Cassandra和Neo4J为代表,详细讲解了键值数据库.文档数据库.列族数据库和图数据库这4大类No