使用宽列存储来构建复合主键是否是正确的模式?

时间:2015-09-11 17:59:49

标签: cassandra hbase bigtable happybase wide-column-store

HBase和Cassandra使用行和列的概念构建为宽列存储。

一行由组成,类似于RDBMS中的主键概念 由多列

组成的

表示可以如下:

*******|    Key     |                   Value
-------+------------+-------------+------------------------------------------
Colunms|            |     name    |                 value
-------+------------+-------------+------------------------------------------
       |     a      |   title     | "Building a python graphdb in one night"
       |     b      |   body      | "You maybe already know that I am..."
       |     c      | publishedat |              "2015-08-23"
       |     d      |   name      |                database

       |     e      |   start     |                   1
       |     f      |    end      |                   2

            ...          ...                         ...

       |    u       |   title     |     "key/value store key composition"

            ...          ...                         ...

       |    x       |   title     |    "building a graphdb with HappyBase"

            ...          ...                         ...

是否正确在应用程序层,构建允许的组合主键 在colocated行上快速迭代。

这可以如下表示。

*******|           Key            |                 Value
-------+------------+-------------+------------------------------------------
Colunms| identifier |  name       |                 value
-------+------------+-------------+------------------------------------------
       |     1      |   title     | "Building a python graphdb in one night"
       |     1      |   body      | "You maybe already know that I am..."
       |     1      | publishedat |              "2015-08-23"
       |     2      |   name      |                database

       |     3      |   start     |                   1
       |     3      |    end      |                   2

            ...          ...                         ...

       |     4      |   title     |     "key/value store key composition"

            ...          ...                         ...

       |     42     |   title     |    "building a graphdb with HappyBase"

            ...          ...                         ...

name列从Value移到Key,而Value只有一个 列名value

2 个答案:

答案 0 :(得分:1)

在设计Cassandra架构时始终使用复合键。

在C *中,密钥分为两部分,分区密钥和聚类列。

分区键用于将数据散列到集群中的节点。分区是一个数据桶,可以根据群集列保存单行或多行。分区中的数据是节点的本地数据,并通过群集键按排序顺序保存,这使得快速有效地访问分区内的数据,并支持群集密钥上的范围查询。

C *还允许数据字段不属于复合键,除非您在查询中创建二级索引,否则通常不会在查询中使用。

对于C *,“宽列”术语有点过时了。在当前的CQL视图中,数据被更传统地视为表中的行,这些行被分组为高效访问分区。

所以回答你的问题,是的,在C *中,通常将可能被认为是RDBMS中的数据列的列移动到C *中的复合键的一部分。

要查看有关分区键和群集列的详细信息,以及它们如何影响您可以执行的查询类型,请参阅a deep look at the CQL WHERE clause

答案 1 :(得分:1)

复合键在HBase架构设计中非常流行。它们还允许您对Rowkey的前缀组件进行快速范围扫描。 与Cassandra不同,RowKey在存储数据时不会被分成几部分。

简单示例:http://riteshadval.blogspot.com/2012/03/hbase-composite-row-key-design-doing.html

在HBase中,在您的示例中,您将能够执行range scans with identifier only and with identifier+name also