2017-05-23 24 views
1

我正在尝试使用Cassandra构建新闻馈送系统,我正在考虑使用扇出方法,其中如果用户发布新帖子,我会在他的所有文章中写入新记录朋友的饲料表。表结构看起来像:更新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); 

现在,我可以得到一个特定用户的饲料在单个查询中一切正常。如果发布Feed的用户更新了他的个人资料照片,该怎么办?我如何去更新user_feed表中的数据?

+0

你'users'表看看显示的'主键user_id'但是没有'user_id'的列? – markc

+0

对不起,主键是user_name – gameOne

+0

因此,如果用户更新他们的个人资料图片,那么您将写入给定事件的两个表,如果用户更新他们的个人资料图片,那么它也会作为“个人资料更新”事件进入'user_feed'表它会不会? – markc

回答

1

您可以使用批处理语句在您的更新中实现原子性。所以在这种情况下,你可以创建一个批处理与使用相同user_name分区键的表usersuser_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

+0

在user_feed表中,user_name列是要填充的用户的用户,而不是用户已发布帖子。个人资料图片专栏是帖子所有者,这是行不通的。 – gameOne

+0

如果你不想改变你的模式,我会采取另一种方法:使用相同的路径存储最新的图片(//current_profile_pic),所以你不需要更新记录。 –

+0

这是一个好主意,但只适用于这种情况,例如,用户编辑帖子,并且帖子内容必须在他的所有朋友提要列中更新。如果你能提出更好的建议,我愿意改变模式。 – gameOne