2017-10-05 65 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;