社交网络的Cassandra数据建模

时间:2016-05-29 16:44:39

标签: cassandra datastax datastax-enterprise datastax-startup

我们正在使用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行;这不符合逻辑!

然后,我的第二个问题是它应该如何?我的意思是应该如何(喜欢)表?

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”表。

  1. user_id和created_on作为复合键* - 如果

    ,这将是理想的选择
    • 您希望查询特定用户的帖子,并假设您拥有相当数量的用户。这个会 均匀分配记录,您的查询只会命中一个 一次分区。
  2. user_id和hash_prefix作为COMPOUND KEY * - 这是理想的选择 如果

    • 您拥有少量拥有大量帖子的用户,这样可以让您的数据均匀分布在各个位置 簇。但是,您冒着不得不进行查询的风险 多个分区。
  3. follower_id和created_on作为复合键* - 这将是理想的 如果

    • 您想查询某个关注者所关注的帖子。记录将被分发,您将最小化 跨分区的查询
  4. 这是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)
    );