我最初编写了一个表格,用于跟踪已分配给用户进行审核的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表设计方法?
非常感谢,
答案 0 :(得分:3)
Cassandra将根据PKs群集列排序所有行。如果您的PK为primary key (userid, languageid, topicid, dateinserted)
,则所有行都将按languageid,topicid和dateinserted按升序排序。这意味着所有行只会按日期在特定语言和主题中排序。您必须使用日期作为第一个群集键列来更改此行为。
通常的做法是跨多个表对数据进行非规范化,以实现不同的排序策略。