我正在尝试构建一个cassandra模式来表示聊天。我似乎不明白的一件事是如何查询最近更新的房间(类似于大多数聊天应用程序列表视图(
- 列表视图中所需字段按
updated_at
desc排序- *房间id
- 房间标题
- 房间图像
- *用户
- *更新日期
- *消息输入
- *消息类型
- *元数据
当前表格
Create TYPE user(
id uuid,
name text,
avatar text
);
CREATE TABLE rooms(
id uuid,
"name" text,
image text,
users set<user>,
archived boolean,
created_at timestampz,
updated_at timestampz,
PRIMARY KEY(id)
);
CREATE TABLE messages(
room_id uuid,
message_id timeuuid,
user user,
message_type int,
entry text,
metadata map<text, text>,
PRIMARY KEY(room_id, message_id)
) WITH CLUSTERING ORDER BY (message_id DESC);
CREATE TABLE rooms_by_user(
user_id uuid,
room_id uuid,
PRIMARY KEY(user_id, room_id)
);
我能想出的可能的解决方案。
- 将所有房间详细信息复制到每条消息中
- 允许使用
SELECT * FROM messages PER PARTITION LIMIT 1
轻松查询 - 这将是每条消息的大量重复数据
- 允许使用
- 查询用户所属的最新消息获取房间ID,然后查询房间
- 这似乎不是卡桑德拉的方式
有更好的方法来建模我的数据吗?
通过查看模式,您似乎需要关系数据库。
在Cassandra中,通常使用one table per query
,这意味着您应该根据查询的结构来设计表。
也可以按partition key
或clustering column
查询(第二个应该是partition key + clustering column
(。因此,为了通过updater_at
进行查询,您需要将该列作为集群列。请记住,在卡桑德拉中,您不能更改密钥。