Cassandra - 有没有办法更新整个表的列值

时间:2017-11-23 12:55:24

标签: cassandra static partitioning insert-update

我有Cassandra表:

CREATE TABLE test (  
    network_id int,  
    date date,  
    score float,  
    id uuid,  
    user_id int,  
    user_name  text,  
    PRIMARY KEY ((network_id, date), score, id))
    WITH CLUSTERING ORDER BY (score DESC);

我需要满足的查询是:
"给我所有属于特定网络的用户按特定日期排序。"

问题是当用户更改他的名字(今天)并且当我必须在过去的某一天执行查询时,我的报告将显示该名称的旧版本。

将列user_name更改为STATIC不起作用,因为我的表应该按天分区。

任何想法如何解决这个问题? 谢谢。

2 个答案:

答案 0 :(得分:0)

由于您已经使用非规范化的user_name以便更快地访问,因此如果更新了user_name,则必须更新该user_name的所有副本。

您需要维护另一个表

CREATE TABLE network_by_user_id (  
    user_id int,
    network_id int,  
    date date,  
    score float,  
    id uuid,  
    PRIMARY KEY (user_id, network_id, date, score, id)
);

所以现在每当有任何用户更新他们的名字时,你必须从network_by_user_id表中选择该用户的所有记录,并为每个记录更新基表的user_name

update test set user_name = 'New Name' where network_id = ? and date = ? and score = ? and id = ?

如果用户的记录数量随着时间的推移而快速增加,那么更新user_name的费用也会随着时间的推移而快速增加。

另一种方法是将基表标准化,如下所示:

CREATE TABLE test (  
    network_id int,  
    date date,  
    score float,  
    id uuid,  
    user_id int,  
    PRIMARY KEY ((network_id, date), score, id)
);


CREATE TABLE users (  
    user_id int,  
    user_name  text,  
    PRIMARY KEY (user_id)
);

对于基表中找到的每个user_id,您可以使用execute async查询users以获取user_name

详细了解executeAsync

答案 1 :(得分:-1)

如果要从表中获取任何数据,可以使用SELECT命令