NoSQL数据建模技术

发布于2012年3月6日 -

本文节译自NoSQL Data Modeling Techniques

NoSQL数据建模中的一般问题

作为前言,首先提出一些NoSQL建模中的一般化问题:

  • 与关系建模不同,NoSQL数据建模通常从应用程序查询的角度来建模:

    • 关系建模的方式通常是由数据的结构来决定的,设计的主题是:“我能回答什么问题?”

    • NoSQL建模的方式则是由数据访问方式决定(例如要支持哪些查询),设计的主题是:“我能提出什么问题?”

  • NoSQL建模通常需要对数据结构和算法有更深的理解。本文中,我们将探讨一些虽然不是针对NoSQL,但是在NoSQL中很实用的数据结构。

  • 数据的冗余和反范式化是很重要的。

尽管数据建模技术是没有定式的,但对于特定的系统来说,本文将给出一些思路。

概念性技术

1. 反范式化

反范式化可以被定义为多个文档/表拥有相同的数据副本,以使查询处理变得更简单高效。

2. 聚集

主流的NoSQL数据库均对模式(schema)没有很强的限制:

  • Key-Value存储通常不对存储的值有约束,因此值可以是任意的格式。此外,一个业务实体也可以占用多条记录。例如,用户账户可以这样建模:以UserID_name, UserID_email这样的名称作为key。
  • 文档型数据库通常则是固有的schema-less。

这样的设计允许实用复杂的内部结构来构建实体,主要包括两方面:

  • 最小化一对多的关系(通过嵌套实体),这样,就会减少连接操作。
  • 隐藏了异构的业务实体间的不同。

我们可以用如下这张图来展示。这副图对产品实体进行了建模。首先,我们说,所有的产品都有ID,价格和描述。接下来,我们发现不同类型的产品拥有不同的属性,例如书籍的作者和裤子的长度。有些属性是一对多或者多对多的,例如唱片中的曲目等。接下来,我们发现,有些实体难以用固定的属性建模,例如裤子的属性取决于品牌。虽然在关系数据库中,这些模型都是能建出来的,但显然不如NoSQL简洁。

3. 应用程序端连接

NoSQL解决方案中几乎不支持连接。作为“问题驱动”的NoSQL设计,连接通常在设计时就被考虑好了,使用之前描述的反范式化和聚集就可以解决这个问题。当然,有些时候,连接还是无法避免,此时应该由应用程序处理。

一般建模技术

4. 原子聚集

很多NoSQL的解决方案都缺乏对事务的支持。在一些情形中,可以通过使用分布式锁或使用应用程序级别的MVCC来实现事务特性。但通常都是使用上文提到的聚集的特性来保证部分ACID特性。

5. 可枚举键

无序的Key-Value模型有一个很大的优点:数据可以通过对key的hash,分布放在多个服务器上。有序模型更复杂,但有时候有序的键对应用程序来说更有用。考虑下面这个例子:

  • 一些NoSQL存储提供原子计数器,可以用来产生ID序列。可以用复合key:userID_messageID存储消息。如果我们知道了最新消息的ID,那么就可以向前遍历所有的消息。

  • 也可以利用这样的特性对消息分组,例如按日期分组。

6. 降维

降维是一项把多维数据映射到Key-Value模型或者其他非多维模型的技术。

传统的地理信息系统使用四叉树或者R-树及其变种作为索引。这些结构需要原地更新,并且当数据量很大的时候也会遇到困难。一个方法是,遍历二维的结构,并将其转化为一个一维的列别。这项技术中比较有名的方法叫做Geohash。如下图所示:

7. 索引表

这项技术主要使用在大表数据库中,看图就好: