【问题标题】:Design data model for messaging system with Cassandra使用 Cassandra 设计消息系统的数据模型
【发布时间】:2016-08-30 02:39:02
【问题描述】:

我是 Cassandra 的新手,正在尝试为消息传递系统构建数据模型。我找到了几个解决方案,但没有一个完全符合我的要求。有两个主要要求

  1. 从所有其他用户获取特定用户的最后消息列表,按时间排序。
  2. 获取一对一消息历史记录的消息列表,也按时间排序。

我想到了这样的事情,

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) 对的数量增加时,这也会降低效率。

【问题讨论】:

    标签: cassandra messagebox datamodel


    【解决方案1】:

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

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

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

    从一个用户到另一个用户的消息。

    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 是一个集群列,而不是分区键的一部分。这可以最大限度地减少应用程序代码中所需的选择查询量。

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

    【讨论】:

    • 感谢您的回复。它将满足我的两个要求。但是第一个表会给我来自所有 from_users 的所有消息,按时间排序,这意味着我将无法从不同的 from_users 中获得唯一的消息。有没有办法做到这一点?
    • 第二个表可以做到这一点。 'select * from chat where to_user='X' and from_user='Y';
    • 我想检查所有用户,而不仅仅是 from_user=Y。像 fb messenger 一样,它只会显示所有 from_users 的最后一个 msg,但会按时显示。
    • 很简单。只需在第二个表中切换聚类列的顺序: PRIMARY KEY((to_user),time,from_user) 这将为您提供带有 from_user 的按时间排序的消息列表
    • 我想你误解了我的问题。我的问题是,例如,我想显示来自 UNIQUE form_users 的最新消息列表,并根据时间仅显示来自那些 from_users 的最新消息。就像当你打开 facebook messenger 时,你会看到你的聊天列表从不同的 from_users 中按时间排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2016-06-07
    • 1970-01-01
    • 2011-02-24
    • 2011-09-26
    • 2011-09-06
    相关资源
    最近更新 更多