我有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不起作用,因为我的表应该按天分区。
任何想法如何解决这个问题? 谢谢。
答案 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命令