2017-10-05 59 views
0

鉴于表:卡桑德拉模式 - 选择通过频繁更新的列

CREATE TABLE T (
     a int, 
     last_modification_time timestamp, 
     b int, 
    PRIMARY KEY (a) 
); 

我经常更新记录。对于每个更新last_modification_time设置为now()并且还设置了其他字段。

什么是正确的卡桑德拉方法能够查询last_modification_time范围?我需要这样的查询:

  • select * from .. where a=Z and last_modification_time < X and last_modification_time > Y;

一种方法是创建物化视图与PRIMARY KEY (a, last_modification_time),但我想避免这种情况,因为物化视图是3.X版本卡桑德拉车

什么是last_modification_time查询的替代方法last_modification_time经常更新?

+0

您的架构将导致宽行......如果你不能改变数据模型,并将始终使用分区键尝试二级索引... https://stackoverflow.com/questions/35719985/range-query-on-secondary-index-in-cassandra –

+0

@undefined_variable你能澄清你是什么意思是“宽行”? –

+0

你最好的选择是使用Postgres来支持这样的查询模型。 – Aaron

回答

0

有两张桌子怎么样?你可以在当前快照中保存更新last_modification_time字段的地方,以及另一个保存随时间变化的记录(类似历史记录表)。您可以使用BATCH语句向他们写信。

CREATE TABLE t_modifications (
     a int, 
     last_modification_time timestamp, 
     b int, 
    PRIMARY KEY (a, last_modification_time) 
) WITH CLUSTERING ORDER BY (last_modificaton_time DESC); 

BEGIN BATCH 
     UPDATE T SET last_modification_time = 123, b = 4 WHERE a = 2; 
     INSERT INTO t_modifications (a, last_modification_time, b) values (2, 123, 4); 
APPLY BATCH; 

如果你有兴趣对一个给定的变动范围的最新快照,你可以选择和限制t_modifications表:

SELECT * FROM t_modifications WHERE a = 2 AND last_modification_time < 136 LIMIT 1;