更新Cassandra中的非规范化数据

时间:2016-06-21 08:11:25

标签: cassandra data-modeling denormalization nosql

我们说,我们的用户可以对视频发表评论,我们希望通过视频以用户的名义显示所有评论。 用户也可以访问他的个人资料页面并更改他的名字。

根据此答案Cassandra denormalization datamodel中介绍的Cassandra数据建模实践,我创建了这样的表:

CREATE TABLE users (
   user_id UUID,
   first_name TEXT,
   last_name TEXT,
   PRIMARY KEY ((user_id))
); 

CREATE TABLE comments_by_video (
   video_id UUID,
   added_at TIMESTAMP,
   user_id UUID,
   comment TEXT,
   first_name TEXT,
   last_name TEXT,
   PRIMARY KEY ((video_id), added_at, user_id)
);

看起来很棒,我们可以通过一个查询获取需要通过视频显示评论的数据。

现在,让我们考虑一下这种用例。

用户创建了很多评论(如10 000)然后决定更改他的名字。 我们应该更新所有评论来改变他的名字吗? 有没有办法让它变得有效?

1 个答案:

答案 0 :(得分:2)

恭喜,您只需进入关系数据库区域即可!

更严重的是,这个要求对您的模型来说是一种痛苦。对于读取时的每条评论,您必须使用user_idlast_name表中查询first nameusers,或者您需要查看所有分区和所有要替换的注释到处first_namelast_name。没有办法让它变得有效。

但是,让我们尝试一种天真的方法。您可以创建一个用户表,一个视频表和另一个存储用户评论的表:

CREATE TABLE users_videos_comment(
    user_id uuid,
    video_id uuid,
    time timestamp,
    comment text,
    PRIMARY KEY ((user_id,video_id), time)
);

这对您的新要求非常有效,对于用户和视频,您可以获得所有评论,因此您只需要查询用户以查找名称,但是您放弃了对所有评论的一个查询。视频"。此外,您必须在users中存储用户评论的视频列表,并在videos上存储发表评论的用户列表。这很难维护,并会要求更多的代码。

也许有更好的方法可以做到这一点,但请记住noSQL 你写的东西是什么,你获得了阅读

如果您不介意做很多写操作来更改用户名,请保持原样。从这个post开始,Cassandra似乎更适合写作,所以你应该考虑优化读取。

考虑到这一点,我们可以在users中添加一个列出用户所做评论的字段。这样,您就不必扫描comments_by_video来查找用户发表的每条评论。这增加了一些复杂性,因为对于用户发表的任何评论,您必须进行两次写入(并确保它是一致的)。但是你满足了这两个要求。

希望有所帮助