Cassandra 按复合键组合排序

Cassandra order by on combination of composite keys

我最初写了一个 table 来跟踪已分配给用户以供审阅的提要。

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

我在创建这个 table 后不久就意识到我无法按 dateinserted 对这个 table(按 DESC 排序)进行排序,因为出于某些奇怪的原因,在 Cassandra 中我只能按组合键 table 的第二列(也是最后一列)排序(例如,table 必须有 2 个组合键,排序只能发生在该键的第二列)所以我将我的 table 更改为:

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

现在我能够运行查询以使用排序方式为用户获取最新的提要。

但是,我有一个新要求,要求我按 (languageid + userid) 或 (topicid + userid) 或 (languageid + topicid + userid) 的组合对提要进行排序。

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

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

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

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

我的问题是,有更好的方法吗?有什么方法可以实现我想要的(通过组合列查询并按另一列排序)还是我坚持使用我的 4 table 设计方法?

非常感谢,

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

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