Cassandra按组合键排序

时间:2015-03-24 08:21:58

标签: cassandra cassandra-2.0

我最初编写了一个表格,用于跟踪已分配给用户进行审核的Feed。

create table user_feed
{ 
     userid uuid,
     languageid uuid,
     topicid_uuid,
     dateinserted timeuuid,
     primary key (userid, languageid, topicid, dateinserted)
 };

我在创建此表后很快意识到,我无法通过dateinserted对此表(按DESC排序)进行排序,因为出于某些奇怪的原因,在Cassandra中我只能按第二个(和最后一个)排序复合键表的列(如,表中必须有2个复合键,order by只能在此键的第二列上发生)所以我将表格更改为:

create table user_feed
{ 
     userid uuid,
     languageid uuid,
     topicid_uuid,
     dateinserted timeuuid,
     primary key (userid, dateinserted)
 };

现在我可以使用order by来运行查询以获取用户的最新供稿。

但是,我有一项新要求,要求我通过(languageid + userid)或(topicid + userid)或(languageid + topicid + userid)的组合对Feed进行排序。

我有一个想法是创建三个新表并将键组合成一个键列。例如,对于userid + topic查询,我会使用:

create table user_feed_by_topic
{ 
     usertopicidkey text,
     dateinserted timeuuid,
     primary key (usertopicidkey, dateinserted)
 };

其中usertopididkey = userid.toString()+ topicid.toString()。

当然,每当我需要插入新的Feed行时,此解决方案需要4个单独的插入,因为我有4行,跟踪相同的数据但分区不同以允许排序。

我的问题是,有更好的方法吗?有没有办法实现我想要的(通过列的组合和另一列的顺序查询)或我是否坚持我的4表设计方法?

非常感谢,

1 个答案:

答案 0 :(得分:3)

Cassandra将根据PKs群集列排序所有行。如果您的PK为primary key (userid, languageid, topicid, dateinserted),则所有行都将按languageid,topicid和dateinserted按升序排序。这意味着所有行只会按日期在特定语言和主题中排序。您必须使用日期作为第一个群集键列来更改此行为。

通常的做法是跨多个表对数据进行非规范化,以实现不同的排序策略。