我们说,我们的用户可以对视频发表评论,我们希望通过视频以用户的名义显示所有评论。 用户也可以访问他的个人资料页面并更改他的名字。
根据此答案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)然后决定更改他的名字。 我们应该更新所有评论来改变他的名字吗? 有没有办法让它变得有效?
答案 0 :(得分:2)
恭喜,您只需进入关系数据库区域即可!
更严重的是,这个要求对您的模型来说是一种痛苦。对于读取时的每条评论,您必须使用user_id
在last_name
表中查询first name
和users
,或者您需要查看所有分区和所有要替换的注释到处first_name
和last_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
来查找用户发表的每条评论。这增加了一些复杂性,因为对于用户发表的任何评论,您必须进行两次写入(并确保它是一致的)。但是你满足了这两个要求。
希望有所帮助