NoSQL 数据建模技术(5)

发表于:2012-05-18来源:不祥作者:陈皓点击数: 标签:数据库
适用性: Key-Value 键值对数据库, Document Databases 文档数据库 (13) Materialized Paths Materialized Paths 可以帮助避免递归遍历(如:树形结构)。这个技术也可以被认为

  适用性: Key-Value 键值对数据库, Document Databases 文档数据库

  (13) Materialized Paths

  Materialized Paths 可以帮助避免递归遍历(如:树形结构)。这个技术也可以被认为是反规格化的一种变种。其想法是为每个结点加上父结点或子结点的标识属性,这样就可以不需要遍历就知道所有的后裔结点和祖先结点了:

  Materialized Paths for eShop Category Hierarchy

  这个技术对于全文搜索引擎来说非常有帮助,因为其可以允许把一个层级结构转成一个文档。上面的示图中我们可以看到所有的商品或Men’s Shoes下的子分类可以被一条很短的查询语句处理——只需要给定个分类名。

  Materialized Paths 可以存储一个ID的集合,或是一堆ID拼出的字符串。后者允许你通过一个正则表达式来搜索一个特定的分支路径。下图展示了这个技术(分支的路径包括了结点本身):

  Query Materialized Paths using RegExp

  适用性: Key-Value 键值对数据库, Document Databases 文档数据, Search Engines 搜索引擎

  (14) 嵌套集 Nested Sets

  Nested sets 嵌套集是树形结构的标准技术。它被广泛地用在了关系性数据库中,它完全地适用于 Key-Value 键值对数据库 和 Document Databases 文档数据库。这个技术的想法是把叶子结点存储成一个数组,并通过使用索引的开始和结束来映射每一个非叶子结点到一个叶子结点集,就如下图所示一样:

  Modeling of eCommerce Catalog using Nested Sets

  这样的数据结构对于immutable data不变的数据 有非常不错的效率,因为其点内存空间小,并且可以很快地找出所有的叶子结点而不需要树的遍历。尽管如此,在插入和更新上需要很高的性能成本,因为新的叶子结点需要大规模地更新索引。

  适用性: Key-Value Stores 键值数据库, Document Databases 文档数据库

  (15) 嵌套文档扁平化:有限的字段名 Nested Documents Flattening: Numbered Field Names

  搜索引擎基本上来说和扁平文档一同工作,如:每一个文档是一个扁平的字段和值的例表。这种数据模型的用来把业务实体映射到一个文本文档上,如果你的业务实体有很复杂的内部结构,这可能会变得很有挑战。一个典型的挑战是把一个有层级的文档映映射出来。例如,文档中嵌套另一个文档。让我们看看下面的示例:

  Nested Documents Problem

  上面的每一个业务实体代码一种简历。其包括了人名和一个技能列表。我把这个层级文档映射成一个文本文档,一种方法是创建 Skill 和 Level 字段。这个模型可以通过技术或是等级来搜索一个人,而上图标注的那样的组合查询则会失败。(陈皓注:因为分不清Excellent是否是Math还是Poetry上的)

  在引用中的 [4.6] 给出了一种解决方案。其为每个字段都标上数字 Skill_i 和 Level_i,这样就可以分开搜索每一个对(下图中使用了OR来遍历查找所有可能的字段):

  Nested Document Modeling using Numbered Field Names

  这样的方式根本没有扩展性,对于一些复杂的问题来说只会让代码复杂度和维护工作变大。

  适用性: Search Engines 全文搜索

  (16)嵌套文档扁平化:邻近查询 Nested Documents Flattening: Proximity Queries

  在附录 [4.6]中给出了这个技术用来解决扁平层次文档。它用邻近的查询来限制可被查询的单词的范围。下图中,所有的技能和等级被放在一个字段中,叫 SkillAndLevel,查询中出现的 “Excellent” 和 “Poetry” 必需一个紧跟另一个:

  Nested Document Modeling using Proximity Queries

  附录 [4.3] 中讲述了这个技术被用在Solr中的一个成功案例。

  适用性: Search Engines 全文搜索

  (17) 图结构批处理 Batch Graph Processing

  Graph databases 图数据库,如 neo4j 是一个出众的图数据库,尤其是使用一个结点来探索邻居结点,或是探索两个或少量结点前的关系。但是处理大量的图数据是很没有效率的,因为图数据库的性能和扩展性并不是其目的。分布式的图数据处理可以被 MapReduce 和 Message Passing pattern 来处理。如: 在我前一篇的文章中的那个示例。这个方法可以让 Key-Value stores, Document databases, 和 BigTable-style databases 适合于处理大图。

  Applicability: Key-Value Stores, Document Databases, BigTable-style Databases

  参考

  Finally, I provide a list of useful links related to NoSQL data modeling:

  Key-Value Stores:

  http://www.devshed.com/c/a/MySQL/Database-Design-Using-KeyValue-Tables/

  http://antirez.com/post/Sorting-in-key-value-data-model.html

  http://stackoverflow.com/questions/3554169/difference-between-document-based-and-key-value-based-databases

  http://dbmsmusings.blogspot.com/2010/03/distinguishing-two-major-types-of_29.html

  BigTable-style Databases:

原文转自:http://www.ltesting.net