2017-07-15 53 views
0

我有一個卡桑德拉表看起來像:卡桑德拉更新 - 一些集羣項丟失(時間戳)

CREATE TABLE messages (
    user_id INT, 
    message_id INT, 
    received_timestamp TIMESTAMP, 
    status TEXT, 
    message TEXT, 
    PRIMARY KEY ((user_id, message_id),received_timestamp)) 
    WITH CLUSTERING ORDER BY (received_timestamp DESC); 

如果我嘗試更新的行如:

UPDATE messages SET status = 'success' WHERE user_id = 1 AND message_id = 1; 

我得到一個錯誤:

Some clustering keys are missing: received_timestamp 

我明白,我需要包括received_timestamp,因爲它是主鍵的一部分,但我只包括它在主鍵爲訂購目的。如果我不知道received_timestamp值,那麼在這裏沒有辦法執行更新嗎?如果沒有,是否有更好的方法來創建可能適用於此用例的表?提前致謝。

+0

是USER_ID和MESSAGE_ID是每一個消息獨特之處? –

+0

@AshrafulIslam message_id是唯一的,但可能有多個消息爲一個user_id – user172092

+0

如果消息ID是唯一的,那麼'received_timestamp'將如何根據時間戳排序消息?只有一個'received_timestamp'用於user_id和message_id –

回答

0

Cassandra不支持跨分區鍵排序數據,因爲它需要分佈式環境中的大量網絡通信。但是你可以在分區鍵中使用排序。如果你想獲得指定用戶的消息時間戳下令所有消息(或一些日期之間的消息切片),你可以使用timeuuid類型MESSAGE_ID的不是int:

CREATE TABLE messages ( 
    user_id int, 
    message_id timeuuid, 
    status text, 
    message text, 
    PRIMARY KEY (user_id, message_id)) 
    WITH CLUSTERING ORDER BY (message_id DESC); 

timeuuid類型可以讓你有獨特的消息通過時間戳ID和排序消息。

CQL有一些useful functions與timeuuid

工作,但你應該關心每因爲CQL limits用戶郵件的數量:

Cells in a partition: ~2 billion (2^31); single column value size: 2 GB (1 MB is recommended)