【问题标题】:Updating denormalized data in Cassandra在 Cassandra 中更新非规范化数据
【发布时间】:2017-10-23 07:00:50
【问题描述】:

我正在尝试使用 Cassandra 构建新闻提要系统,我正在考虑使用扇出方法,其中如果用户发布新帖子,我将在他所有朋友的提要表中写入新记录。表结构如下:

CREATE TABLE users (
   user_name TEXT,
   first_name TEXT,
   last_name TEXT,
   profile_pic TEXT,
   PRIMARY KEY (user_name)
); 

CREATE TABLE user_feed (
   user_name TEXT,
   posted_time TIMESTAMP,
   post_id UUID,
   posted_by TEXT, //posted by username
   posted_by_profile_pic TEXT,
   post_content TEXT,
   PRIMARY KEY ((user_name), posted_time)
) WITH CLUSTERING ORDER BY(posted_time desc);

现在,我可以在单个查询中获取特定用户的提要,一切正常。如果发布提要的用户更新了他的个人资料图片怎么办。如何更新 user_feed 表中的数据?

【问题讨论】:

  • 您的users 表显示user_id 的主键,但user_id 没有列?
  • 对不起,主键是user_name
  • 所以你会在给定事件上写入两个表我会说,如果用户更新他们的个人资料图片,那么它也会进入 user_feed 表作为“个人资料更新”事件会不是吗?
  • 不,我必须根据 user_name 和 posted_time 更新用户发布的数据,而我不会一直拥有

标签: cassandra insert-update denormalization


【解决方案1】:

您可以使用批处理语句来实现更新的原子性。因此,在这种情况下,您可以使用相同的 user_name 分区键在表 users 和 user_feed 上创建一个包含更新的批处理:

BEGIN BATCH
    UPDATE users SET profile_pic = ? WHERE user_name = ?;
    UPDATE user_feed SET posted_by_profile_pic = ? WHERE user_name = ?;
APPLY BATCH;

看看CQL Batch documentation

【讨论】:

  • 在 user_feed 表中,user_name 列是要填充提要的用户,而不是发布帖子的用户。个人资料图片列是帖子所有者的,这是行不通的。
  • 如果您不想更改架构,我会采用另一种方法:使用相同的路径(//current_profile_pic)存储最新的图片,因此您不需要不断更新记录。
  • 这是个好主意,但仅适用于这种情况,例如,用户编辑帖子并且帖子内容必须在他所有的朋友提要列中更新。如果您能提出更好的建议,我愿意更改架构。
  • 如果在后期更新期间,您可以获取目标用户列表(以更新提要),您可以为post_id 创建索引(或作为聚类列)并使用那些信息。您需要考虑工作量来决定是二级索引还是聚簇列。恕我直言,我所掌握的细节很少,您可以尝试使用集群列方法,因为二级索引将分散到多个节点中(检查docs.datastax.com/en/cql/3.3/cql/cql_using/…)
  • 我不确定是否可以在聚类列中添加它,即使我这样做了,我也需要知道帖子的时间戳
猜你喜欢
  • 2016-10-22
  • 2018-05-31
  • 2015-02-01
  • 2016-05-27
  • 2016-05-13
  • 2017-06-17
  • 2023-03-13
  • 2011-09-24
  • 2012-10-18
相关资源
最近更新 更多