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

Design data model for messaging system with Cassandra

我是 Cassandra 的新手,正在尝试为消息系统构建数据模型。我找到的解决方案很少,但其中 none 个完全符合我的要求。有两个主要要求:

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

你是对的。一个 table 不能同时满足两个查询,因此您需要两个 table。每个查询一个。这是 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 是一个聚簇列,而不是分区键的一部分。这最大限度地减少了应用程序代码中所需的 select 查询量。

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