NoSQL数据模型

[复制链接]
查看11 | 回复8 | 2014-2-19 11:55:14 | 显示全部楼层 |阅读模式
数据模型是认知和操作数据时所用的模型。对于使用数据库的人来说,数据模型描述了我们如何同数据库中的数据打交道。它与存储模型不同,后者描述了数据库内部存储及操作数据的机制。在理想情况下,用户应该感觉不到存储模型才对,然而实际应用中,我们还是得对其略知一二,这主要是为了实现良好的性能。
大家日常所说的“数据模型”一词,一般指应用程序的特定数据所具备的模型。开发者可能会指着一张数据库的“实体- 关系图”(Entity-Relationship Diagram),把这个包含客户、订单、产品等信息的东西叫做他们的数据模型。
然而本书的“数据模型”通常表示数据库组织数据的方式,它的正式名称是“元模型”(metamodel)。
在过去的几十年中,关系型数据模型是占主导地位的数据模型,它看上去就是一组非常直观的表格,或者说,19 更像电子数据表。每张表(table)有若干行(row),每行包含相关实体。这些实体通过列来描述,行列交汇处都有单一值(single value)。列可以引用同一张表内或不同表格中的其他列,从而把这些实体关联起来。(上文所说的“表”和“行”都不是正规术语,只是大家都这么称呼罢了。更正式的说法应该是“关系”及“元组”。)
NoSQL 技术与传统的关系型数据库相比,一个最明显的转变就是抛弃了关系模型。每种NoSQL 解决方案的模型都不同,NoSQL 生态系统中广泛使用的模型分为四类:“键值”、“文档”、“列族”和“图”。前三类数据模型有一个共同特征,我们称其为“面向聚合”(aggregate orientation)。下面将解释面向聚合的含义及其对数据模型的意义。

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
关系模型把待存储的信息分隔成元组(行)。
元组是种受限的数据结构:它只能包含一系列的值,因此不能在元组中嵌套另一个元组,也不能包含由值或元组所组成的列表。这种简单的数据结构支撑着关系模型:所有操作都必须以元组为目标,而且其返回值也必须是元组。
面向聚合所用的方式与之不同,我们通常操作数据时所用的单元,其结构都比元组集合复杂得多。如果能够以这种复杂的结构来存放列表或嵌套其他记录结构就好了。
随后我们可以看到,“键值数据库”、“文档数据库”、“列族数据库”都使用这种更为复杂的记录。然而,没有公认的术语来称呼这种复杂的记录,我们把它叫做“聚合”(aggregate)。
聚合是“领域驱动设计”中的术语。在领域驱动设计中,我们想把一组相互关联的对象视为一个整体单元来操作,而这个单元就叫聚合。在涉及数据操作与一致性管理时,更是如此。一般情况下,我们通过原子操作(atomic operation)更新聚合的值,并且在与数据存储通信时,也以聚合为单位。这个定义也非常符合“键值数据库”、“文档数据库”和“列族数据库”的工作方式。因为用聚合为单位来复制和分片显得比较自然,所以在集群中操作数据库时,还是使用聚合比较简单一些。
此外,由于程序员经常通过聚合结构来操作数据,故而采用聚合也能让其工作更为轻松。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
现在可以用示例来帮大家理解我所讲的内容。假设我们要建立一个电子商务网站,把商品通过网站直接卖给消费者,那么必须存储用户信息、商品目录(product catalog)、订单、收货地址(shipping address)、账单地址和付款方式等信息。这个应用场景,既可以用关系型数据模型建模,也可以用NoSQL 数据模型建模,我们要比较两者的优劣。
如果采用关系型数据库,那么就可以从图1 所示的数据模型开始。


t1.jpg (48.34 KB, 下载次数: 22)
下载附件
2014-1-22 10:58 上传

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
图2展示了该模型所用的一些范例数据。


t2.jpg (75.52 KB, 下载次数: 12)
下载附件
2014-1-22 10:58 上传

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
既然大家都是使用关系模型的高手了,那一切就按老规矩办,这样各张表格间就不会出现重复数据了。我们也维护了表格间的“参照完整性” 。实际工作中的订单系统肯定更为复杂,不过在这里,它倒是挺合适的。
现在我们再来看看,如果用面向聚合的思路来做,那么数据模型会是什么样子。
图3:聚合数据模型


t3.jpg (39.83 KB, 下载次数: 13)
下载附件
2014-1-22 11:00 上传

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
关注!学习中!
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
支持大牛啊!
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
厉害,可是不知道高效的优势如何体现
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层

厉害,可是不知道高效的优势如何体现
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行