2017-07-15 67 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)