【问题标题】:Cassandra - Is there a way to update column value for entire tableCassandra - 有没有办法更新整个表的列值
【发布时间】:2018-05-07 10:52:30
【问题描述】:

我有 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 不起作用,因为我的表应该按天分区。

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

【问题讨论】:

    标签: cassandra static partitioning insert-update


    【解决方案1】:

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

    【讨论】:

    • 我知道如何获取数据,问题是当相同的用户(相同的 id)更改其名称并需要插入、更新表时,如何对表进行建模以更新过去(多个分区)的所有用户名.
    【解决方案2】:

    由于您已对 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,您可以使用异步执行查询users 以获取user_name

    了解更多关于executeAsync

    【讨论】:

    • 我想到了这种方法,我在徘徊最好更新我的初始表或在客户端加入这两个表。你怎么看?
    猜你喜欢
    • 2020-10-01
    • 2019-01-20
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多