用于查询具有非唯一值的列的Cassandra数据模型

时间:2015-07-17 21:41:59

标签: cassandra datamodel

我正在努力想出一个适合我情况的数据模型。我有以下列:runid,stat1,stat2,stat3。

我将基于runid查询(例如select * from table in runid = 123)但是runid会有重复值,所以我不能把它作为主键。 此外,在查询时我对stat1-3一无所知,所以我也不能将这些列作为主键的一部分。

(背景:我的Cassandra实例由另一个程序填充,我的程序只会从中获取特定runid的信息并将其显示在屏幕上)

这似乎是一个很常见的场景,但我是Cassandra的新手。我知道runid需要成为主键的一部分,因为我必须基于它运行查询,但它有重复的值。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

你认为这是一个很常见的场景是正确的,幸运的是你不必知道完整的主键来进行查询!只是分区键(选择条件中需要主键的第一部分。

例如,如果您创建这样的表:

CREATE TABLE test.runs (
    stat1 text,
    stat2 text,
    stat3 text,
    runid int,
    PRIMARY KEY (runid, stat1)
 );

您应该只需指定分区键(runid)即可检索数据:

cassandra@cqlsh:test> insert into runs (runid, stat1, stat2, stat3) values (0, '1', 'hi', 'hi'); 
cassandra@cqlsh:test> insert into runs (runid, stat1, stat2, stat3) values (0, '2', 'lo', 'lo');
cassandra@cqlsh:test> insert into runs (runid, stat1, stat2, stat3) values (0, '3', 'yo', 'yo');
cassandra@cqlsh:test> insert into runs (runid, stat1, stat2, stat3) values (1, '1', '22', '33');
cassandra@cqlsh:test> select * from runs where runid = 0;

 runid | stat1 | stat2 | stat3
-------+-------+-------+-------
     0 |     1 |    hi |    hi
     0 |     2 |    lo |    lo
     0 |     3 |    yo |    yo

话虽如此,为您的主键提供更好的辅助值可能会更好,以允许多个' stat1'列在runid中具有相同的值,也许是一个随机的uuid来创建一些唯一值?