《NoSQL精粹》摘要2-聚合数据模型

来源:互联网 发布:网络延时1000 编辑:程序博客网 时间:2024/05/22 01:30

--------------------------------------------------------------------------------------------------------

NoSQL技术与传统关系型数据库相比,一个最明显的转变就是抛弃了关系模型。本书把NoSQL生态系统中最广泛使用的模型分为四类:“键值”,“文档”,“列族”,“图”。前三类数据模型有一个共同特征,称为“面向聚合(aggregate orientation)”。


关系模型把待存储的信息分隔成元组(行)。而元组是种受限的数据结构:元组中不能嵌套另一个元组,也不能包含由值或元组所组成的列表

我们通常操作数据时所用的单元,其结构都比元组集合复杂得多。这种存放列表或嵌套其他记录结构复杂的记录结构,本书叫它“聚合(aggregate)”。

聚合是“领域驱动设计”中的术语。在领域驱动设计中,把一组相互关联的对象视为一个整体单元来操作,这个单元叫做聚合。在涉及数据操作与一致性管理时,更是如此。

一般情况下,我们通过原子操作更新聚合的值,并且在与数据存储通信时,也以聚合为单位。因为用聚合为单位来复制和分片显得比较自然,所以在集群中操作数据库时,还是用聚合比较简单一些。此外,由于程序员通过聚合结构来操作数据,故而采用聚合也能让工作更轻松。


关系模型与聚合模型示例

(文章列举了一个客户和订单的例子,使用关系模型的情形,大家一定很清晰了......至于使用聚合模型,其使用的是JSON格式。其中有段话,只做下截取,作者在使用聚合模型时,将产品名称直接写入订单项。)

这种做法,在聚合模型中更常见,因为我们希望在数据交互时,尽量减少所需访问的聚合的个数


面向聚合的影响

关系型数据库的数据模型中,没有“聚合”这一概念,我们成为“聚合无知(aggregate-ignorant)”。NoSQL领域中的“图数据库”也是“聚合无知”的

若是采用“聚合无知模型”,那么很容易就能以不同方式来查看数据,因此,在操作数据时,如果没有一种占有主导地位的结构,那么选用此模型比较好。

选用面向聚合模型的决定性因素,就在于它非常适合在集群上运行。在集群上运行时,我们需要把采集数据时所需的节点数降至最小。如果在数据库中明确包含聚合结构,那么它就可以根据这一重要信息,知道哪些数据需要在一起操作了,而且这些数据应该放在同一个节点中。

ACID事务: 原子性Atomic,一致性Consistent,隔离性Isolated和持久性Durable。

经常会听人说:NoSQL数据库不支持ACID事务,因而其一致性会受损。这一论述简化的过头了。通常情况下,面向聚合的数据库确实不支持跨越多个聚合的ACID事务。取而代之的是,它每次只能在一个聚合结构上执行原子操作。也就是说,如果我们想以原子方式操作多个聚合,那么就必须自己组织应用程序的代码。在实际应用中,大多数原子操作都可以局限于某个聚合结构内部,而且,在将数据划分为聚合时,这也是要考虑的原因之一。另外,图数据库和其他一些“聚合无知式数据库”都支持与关系型数据库类似的ACID事务。最为重要的的是,“一致性”这个话题相当复杂,数据库支持不支持ACID,只是该问题的一个方面而已。


键值数据模型与文档数据模型

这两类数据库都包含大量聚合,每个聚合都有一个获取数据所用的键或ID。

区别是:键值数据库的聚合不透明,只包含一些没有太多意义的大块信息;与此相反,在文档数据库的聚合中,可以看到其结构。不透明的优势,聚合中可以随意存储任意数据。数据库可能会限制聚合的总大小,但除此之外,其他方面都很随意。文档数据库则要限制其中存放的内容,它定义了其允许的结构与数据类型,这样能够更加灵活地访问数据。

在键值数据库中,要访问聚合内容,只能通过键来查找。而是用文档数据库时,则可以用聚合中的字段查询。


列族存储

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

理解列族模型的最好方式也许就是将其视为两级聚合结构。与“键值存储”相同,第一个键通常代表行标识符,可以用它来获取想要的聚合。列族结构与“键值存储”的区别在于,其“行聚合”本身又是一个映射,其中包含一些更为详细的值。这些“二级值(second-level value)”就叫做“列”。

列族数据库将列组织为列族。每一列都必须是某个列族的一部分,而且访问数据的单元也得是列。这样设计得前提是,某个列族中的数据经常需要一起访问。

(其实还有些东东,但是本人对列族存储实在没有概念,因此无法更好的提取有用的部分,请见谅! )


面向聚合数据库总结

在集群上运行时,聚合是中心环节,因为数据库必须保证将聚合内的数据存放在同一个节点上。聚合还是“更新”操作的最小数据单位(atomic unit),对事物控制来说,以聚合为操作单元,其大小正合适。

三者差别:

  1. 键值数据模型将聚合看做不透明的整体,这意味着只能根据键来查出整个聚合,而不能仅仅查询或获取其中的一部分。
  2. 文档模型的聚合对数据库透明,于是就可以只查询并获取其中一部分数据了,不过,由于文档没有模式,因此在想优化存储并获取聚合中的部分内容时,数据库不太好调整文档结构。
  3. 列族模型把聚合分为列族,让数据库将其视为行聚合内的一个数据单元。此类聚合的结构有某种限制,但是数据库可利用此种结构的优点来提高其易访问性。

要点

  • 聚合是作为交互单元的数据集合。数据库中的ACID操作以聚合为界。
  • 键值数据库、文档数据库、列族数据库都属于面向聚合的数据库。
  • 聚合使数据库在集群上管理数据存储更为方便。
  • 如果数据交互大多在同一聚合内执行,则应使用面向聚合的数据库;若交互操作需要使用多种不同格式的数据,那么最好选用“聚合无知式数据库”。




0 0
原创粉丝点击