【问题标题】:Cassandra order by on combination of composite keysCassandra 根据组合键的组合排序
【发布时间】:2015-03-24 20:29:16
【问题描述】:

我最初编写了一个表格来跟踪已分配给用户进行审查的提要。

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) 的组合对提要进行排序。

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

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

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

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

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

非常感谢,

【问题讨论】:

    标签: cassandra cassandra-2.0


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢斯特凡。根据您的最后一句话,您是否建议拥有 4 个表以便按不同标准执行分页是“推荐”或接受的方法?
    • 是的,通常的做法是通过使用多个表进行不同的排序来对数据进行非规范化。使用原子批处理在单个批处理中更新所有这些表也是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2014-02-14
    • 2016-11-18
    • 1970-01-01
    • 2012-05-25
    • 2021-07-16
    相关资源
    最近更新 更多