社交网络的 Cassandra 数据建模
Cassandra data modeling for a social network
我们正在为我们的社交网络使用 Datastax Cassandra,我们正在 designing/data 建模 table 我们需要的东西,这让我们感到困惑,我们不知道如何设计一些 tables,我们有一些小问题!
据我们了解,对于每个查询,我们必须有不同的 tables,例如,用户 A 关注用户 C 和 B。
现在,在 Cassandra 中我们有一个 table 即 posts_by_user
:
user_id | post_id | text | created_on | deleted | view_count
likes_count | comments_count | user_full_name
我们有一个 table 根据用户的关注者,我们将 post 的信息插入到名为 user_timeline
的 table 中,当关注者用户正在访问第一个网页,我们从 user_timeline
table.
的数据库中获取 post
这里是 user_timeline
table:
follower_id | post_id | user_id (who posted) | likes_count |
comments_count | location_name | user_full_name
首先,这个数据建模对于关注基础(关注者,关注行为)社交网络是否正确?
现在我们要计算 post 的点赞数,如您所见,我们在两个 table 中都有点赞数 (user_timeline
, posts_by_user
),假设一个用户有 1000 个关注者,那么通过每个点赞操作,我们必须更新 user_timeline
中的所有 1000 行和 posts_by_users
中的 1 行;这不合逻辑!
那么,我的第二个问题是How should it be?我的意思是(最喜欢的)table应该如何?
考虑使用 posts_by_user 作为 post 信息的元数据。这将允许您安置 user_id、post_id、message_text,等等,但是你会抽象出 view_count,likes_count,和 comments_count 变成计数器 table。这将允许您获取 post 的元数据或计数器,只要您拥有 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" table。
user_id 和 created_on 作为复合键* - 如果
这将是理想的
- 您想查询某个用户的 posts,并假设您有相当数量的用户。这个会
平均分配记录,您的查询只会命中
一次分区。
user_id 和 hash_prefix 作为复合键* - 这将是理想的
如果
- 您有少量用户和大量 post 用户,这将使您的数据均匀分布在
簇。然而,你 运行 必须跨查询的风险
多个分区。
follower_id 和 created_on 作为复合键* - 这将是理想的
如果
- 您想查询 post 被某个关注者关注的人。记录将被分发,你将最小化
跨分区查询
这是 1 个 table 的 3 个示例,我想表达的意思是围绕要执行的查询设计 table。也不要害怕在多个 table 之间复制您的数据,这些 table 设置为处理各种查询,这就是 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)
);
我们正在为我们的社交网络使用 Datastax Cassandra,我们正在 designing/data 建模 table 我们需要的东西,这让我们感到困惑,我们不知道如何设计一些 tables,我们有一些小问题!
据我们了解,对于每个查询,我们必须有不同的 tables,例如,用户 A 关注用户 C 和 B。
现在,在 Cassandra 中我们有一个 table 即 posts_by_user
:
user_id | post_id | text | created_on | deleted | view_count
likes_count | comments_count | user_full_name
我们有一个 table 根据用户的关注者,我们将 post 的信息插入到名为 user_timeline
的 table 中,当关注者用户正在访问第一个网页,我们从 user_timeline
table.
这里是 user_timeline
table:
follower_id | post_id | user_id (who posted) | likes_count |
comments_count | location_name | user_full_name
首先,这个数据建模对于关注基础(关注者,关注行为)社交网络是否正确?
现在我们要计算 post 的点赞数,如您所见,我们在两个 table 中都有点赞数 (user_timeline
, posts_by_user
),假设一个用户有 1000 个关注者,那么通过每个点赞操作,我们必须更新 user_timeline
中的所有 1000 行和 posts_by_users
中的 1 行;这不合逻辑!
那么,我的第二个问题是How should it be?我的意思是(最喜欢的)table应该如何?
考虑使用 posts_by_user 作为 post 信息的元数据。这将允许您安置 user_id、post_id、message_text,等等,但是你会抽象出 view_count,likes_count,和 comments_count 变成计数器 table。这将允许您获取 post 的元数据或计数器,只要您拥有 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" table。
user_id 和 created_on 作为复合键* - 如果
这将是理想的- 您想查询某个用户的 posts,并假设您有相当数量的用户。这个会 平均分配记录,您的查询只会命中 一次分区。
user_id 和 hash_prefix 作为复合键* - 这将是理想的 如果
- 您有少量用户和大量 post 用户,这将使您的数据均匀分布在 簇。然而,你 运行 必须跨查询的风险 多个分区。
follower_id 和 created_on 作为复合键* - 这将是理想的 如果
- 您想查询 post 被某个关注者关注的人。记录将被分发,你将最小化 跨分区查询
这是 1 个 table 的 3 个示例,我想表达的意思是围绕要执行的查询设计 table。也不要害怕在多个 table 之间复制您的数据,这些 table 设置为处理各种查询,这就是 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)
);