绕过二级索引问题的CQL数据模型



我有一个看起来像的模型

StateChange: 
    row_id
    group_name
    timestamp
    user_id

我的目标是查询如下:

查询1=查找row_id=X ORDER BY时间戳DESC的所有状态更改查询2=查找row_id=X和group_name=Y的所有状态更改ORDER BY时间戳DESC

利用我有限的CQL知识,唯一的方法是创建2个查询表,上面提到的每个查询一个

对于查询1:

CREATE TABLE state_change (
    row_id int,
    user_id int,
    group_name text,
    timestamp timestamp,
    PRIMARY KEY (row_id, timestamp)
)

对于查询2:

CREATE TABLE state_change_by_group_name (
    row_id int,
    user_id int,
    group_name text,
    timestamp timestamp,
    PRIMARY KEY ((row_id, group_name), timestamp)
)

这确实解决了问题,但我现在在Cassandra中有重复的数据。

注意:在表上创建group_name索引是可行的,但我不能再按时间戳排序了,因为它现在是次要索引。

正在寻找只需要一个表的解决方案。

您正在寻找的解决方案不存在。两个不同的查询需要两个不同表(或者至少需要一个辅助索引,该索引在后台创建一个表)。反规范化是Cassandra中的规范,因此您不应将数据复制视为反模式——事实上,它是建议的模式

Carlo是正确的,因为您的多表解决方案是正确的方法。

这确实解决了问题,但我现在在Cassandra中有重复的数据。

正在寻找只需要一个表的解决方案。

Planet Cassandra最近发表了一篇关于这个主题的文章:逃离迪斯科时代的数据建模

(完全披露:我是作者)

但最后两段确实谈到了你的观点(尤其是最后一句):

这是20世纪70年代的思维方式。关系数据库理论起源于磁盘空间昂贵的时代。1975年供应商以惊人的一万一千的价格出售磁盘空间美元/兆字节(取决于供应商和型号)。即使在1980年,如果你想购买价值1千兆字节的存储空间,你预计仍将花费约100万美元。今天(2014),你花60块钱就能买到一个兆字节的硬盘。磁盘空间便宜;操作时间是昂贵的部分。以及过度使用二手车索引将增加您的操作时间。

因此,在Cassandra中,您应该采用基于查询的建模方法本质上,(Patel,2014)为你的柱族建模根据查询数据的意义。这是一个与构建表的关系数据建模不同根据存储数据的意义通常,基于查询建模导致存储冗余数据(有时还会存储不依赖于它的主行键)…这没关系

最新更新