使用Cassandra设计消息系统的数据模型

时间:2016-05-04 14:58:53

标签: cassandra messagebox datamodel

我是Cassandra的新手并尝试为邮件系统构建数据模型。我找到了一些解决方案,但没有一个完全符合我的要求。 有两个主要要求

  1. 从所有其他用户获取特定用户的最后消息列表,按时间排序。
  2. 获取一对一消息历史记录的消息列表,并按时间排序。
  3. 我想到了这样的事情,

    CREATE TABLE chat (
      to_user text,
      from_user_text,
      time text,
      msg text,
      PRIMARY KEY((to_user,from_user),time) 
      ) WITH CLUSTERING ORDER BY (time DESC);
    

    但是这个设计几乎没有问题,比如我不能满足第一个要求,因为这个设计也需要传递from_user。而且,当(to_user,from_user)对的数量增加时,这将是低效的。

1 个答案:

答案 0 :(得分:1)

你是对的。那一个表不会满足两个查询,因此您需要两个表。每个查询一个。这是Cassandra数据建模的核心概念。查询驱动设计。

所以查询向用户查找消息:

CREATE TABLE chat (
  to_user text,
  from_user_text,
  time text,
  msg text,
  PRIMARY KEY((to_user),from_user,time) 
  ) WITH CLUSTERING ORDER BY (time DESC);

来自用户的消息给另一个用户。

re

与您的不同之处:from_user是一个群集列,而不是分区键的一部分。这样可以最大限度地减少应用程序代码中所需的选择查询量。

可以使用第二个表来满足两个查询,但是您必须提供'from_user'以按时使用范围查询。