使用 Cassandra 设计消息系统的数据模型
Design data model for messaging system with Cassandra
我是 Cassandra 的新手,正在尝试为消息系统构建数据模型。我找到的解决方案很少,但其中 none 个完全符合我的要求。有两个主要要求:
- 从所有其他用户获取特定用户的最后消息列表,按时间排序。
- 获取一对一消息历史记录的消息列表,也按时间排序。
我想到了这样的事情,
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' 才能按时使用范围查询。
我是 Cassandra 的新手,正在尝试为消息系统构建数据模型。我找到的解决方案很少,但其中 none 个完全符合我的要求。有两个主要要求:
- 从所有其他用户获取特定用户的最后消息列表,按时间排序。
- 获取一对一消息历史记录的消息列表,也按时间排序。
我想到了这样的事情,
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' 才能按时使用范围查询。