假设我们有可以评论视频的用户,并且希望通过带有用户名的视频显示所有评论。用户也可以转到他的个人资料页面并更改他的名字。
基于此答案Cassandra反规范化数据模型中涉及的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)
);
看起来很棒,我们只需一个查询就可以获取需要通过视频显示评论的数据。
现在,让我们考虑这样的用例。
用户创建了很多评论(例如10000),然后决定更改他的名字。我们应该更新所有评论以更改他的名字吗?有办法提高效率吗?
恭喜,您只需进入关系数据库区域!
更严重的是,此要求使您的模型痛苦不堪。您必须使用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时,您在写操作时会松懈,而在读操作时会有所收获
如果您不介意进行大量写操作来更改用户名,请保持原样。从这篇文章来看,Cassandra无论如何对于写来说似乎都更好,因此您应该考虑优化阅读。
考虑到这一点,我们可以在users
该列表中添加一个由用户发表的所有评论的字段。这样,您就不必扫描comments_by_video
来查找用户发表的每条评论。这增加了一些复杂性,因为对于用户的任何注释,您都必须进行两次写入(并确保它是一致的)。但是您都满足了这两个要求。
希望能帮助到你
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句