我们正在使用Datastax Cassandra作为我们的社交网络,我们正在设计/数据建模表我们需要,它让我们感到困惑,我们不知道如何设计一些表格,我们有一些小问题!
正如我们对每个查询所理解的那样,我们必须有不同的表,例如用户A跟随用户C和B.
现在,在Cassandra,我们有一个posts_by_user
表:
user_id | post_id | text | created_on | deleted | view_count
likes_count | comments_count | user_full_name
根据用户的关注者我们有一个表格,我们将帖子的信息插入名为user_timeline
的表格,当关注者用户访问第一个网页时,我们从{{1表格。
这是user_timeline
表:
user_timeline
首先,此数据建模是否适用于跟随基础(关注者,跟随行动)社交网络?
现在我们想要计算一篇帖子的内容,因为您看到我们在两个表格中都有很多喜欢(follower_id | post_id | user_id (who posted) | likes_count |
comments_count | location_name | user_full_name
,user_timeline
),并想象一个用户有1000个粉丝,然后按照每个操作,我们必须更新posts_by_user
中的所有1000行和user_timeline
中的1行;这不符合逻辑!
然后,我的第二个问题是它应该如何?我的意思是应该如何(喜欢)表?
答案 0 :(得分:4)
考虑使用 posts_by_user 作为帖子信息的元数据。这将允许您容纳 user_id , post_id , message_text 等,但您将抽象 view_count ,< em> likes_count 和 comments_count 进入计数器表。只要你有post_id,这将允许你获取帖子的元数据或计数器,但你只需要更新一次counter_record。
DSE柜台文件: https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html
然而,
以下文章是与Cassandra数据建模相关的一个非常好的起点。也就是说,在回答这个问题时需要考虑一些事项,其中很多都取决于系统的内部以及查询的结构。 前两条规则如下:
规则1:在群集中均匀传播数据
规则2:最小化分区数量
花点时间考虑一下“user_timeline”表。
user_id和created_on作为复合键* - 如果
,这将是理想的选择user_id和hash_prefix作为COMPOUND KEY * - 这是理想的选择 如果
follower_id和created_on作为复合键* - 这将是理想的 如果
这是1个表的3个示例,我想传达的一点是围绕要执行的查询设计表。另外,不要害怕在设置为处理各种查询的多个表中复制数据,这就是Cassandra的建模方式。请阅读下面的文章并观看DataStax Academy数据建模课程,以熟悉细微差别。我还在下面包含了一个示例模式,以涵盖我之前指出的基本计数器模式。
*复合键的原因是由于PRIMARY KEY必须是唯一的,否则具有现有PRIMARY KEY的INSERT将成为UPDATE。
http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling https://academy.datastax.com/courses
CREATE TABLE IF NOT EXISTS social_media.posts_by_user (
user_id uuid,
post_id uuid,
message_text text,
created_on timestamp,
deleted boolean,
user_full_name text,
PRIMARY KEY ((user_id, created_on))
);
CREATE TABLE IF NOT EXISTS social_media.user_timeline (
follower_id uuid,
post_id uuid,
user_id uuid,
location_name text,
user_full_name text,
created_on timestamp,
PRIMARY KEY ((user_id, created_on))
);
CREATE TABLE IF NOT EXISTS social_media.post_counts (
likes_count counter,
view_count counter,
comments_count counter,
post_id uuid,
PRIMARY KEY (post_id)
);