你在Cassandra这样的数据模型中做了什么改变?

时间:2014-08-26 21:41:46

标签: cassandra cassandra-2.0 cassandra-cli

我有创建社交Feed(新闻Feed)的任务。我认为没有必要解释标准功能 - 所有都是如何作为FB。 我选择了解决方案 apache cassandra 并设计了一个数据列帖子来存储有关帖子用户的信息:

CREATE TABLE Posts (
  post_id  uuid,
  post_at  timestamp,
  user_id  text,
  name     varchar,
  category set<text>,
  link     varchar,
  image    set<varchar>,
  video    set<varchar>,
  content  map<text, text>,
  private  boolean,

  PRIMARY KEY ((post_id, user_id), post_at)
)
WITH CLUSTERING ORDER BY (post_at DESC) COMPACT STORAGE;

下一个表包含id用户帖子:

CREATE TABLE posts_user (
  post_id  bigint,
  post_at  timestamp,
  user_id  bigint,
  PRIMARY KEY ((post_id), post_at, user_id)
)

WITH CLUSTERING ORDER BY (post_at DESC) AND COMPACT STORAGE;

你觉得怎么样,好吗?你在这样的数据模型中做了什么改变?

1 个答案:

答案 0 :(得分:1)

有几个问题和一些改进可以跳出来。

  1. 现在不推荐使用COMPACT STORAGE(如果您想利用CQL 3功能)。我不认为您可以像上面定义的那样创建表Posts,因为它使用带有COMPACT STORAGE的CQL 3功能(集合)以及声明不属于主键的多个列。 / p>

  2. posts_user的密钥类型与Posts完全不同。我不清楚这两个表之间的关系是什么,但我认为post_id应该在它们之间保持一致,而你在一个表中将它作为uuid并且{{1}在另一个。与其他领域也存在差异。

  3. 假设bigint是唯一的并且表示单个帖子的id,将它作为post_id表中复合主键的第一部分是很奇怪的,因为如果你知道的话Posts然后您就可以唯一地访问该记录。此外,由于它是分区键的一部分,因此它还可以阻止您对多个帖子进行更广泛的选择,并利用您的post_id顺序。

  4. 解决此问题的常用方法是创建专用索引表,以便按照您希望的方式对数据进行排序。

    E.g。

    post_at

    或更全面:

    CREATE TABLE posts (
      id       uuid,
      created  timestamp,
      user_id  uuid,
      name     text,
      ...
      PRIMARY KEY (id)
    );
    
    CREATE TABLE posts_by_user_index (
      user_id    uuid,
      post_id    uuid,
      post_at    timestamp,
      PRIMARY KEY (user_id,post_at,post_id)
      WITH CLUSTERING ORDER BY (post_at DESC)
    );
    

    但是,在您的情况下,如果您只希望以单向方式选择数据,那么您可以使用CREATE TABLE posts_by_user_sort_index ( user_id uuid, post_id uuid, sort_field text, sort_value text, PRIMARY KEY ((user_id,sort_field),sort_value,post_id) ); 表格进行排序:

    posts

    如果您希望稍后添加其他索引,它会变得更加复杂,因为您需要不仅仅通过其帖子ID,而且还要通过其用户和post_at字段来索引每个帖子。