[英]Cassandra table design for user chat
我想在Cassandra中创建用于用户聊天的表,最终我这样做了
CREATE TABLE sample.user_messages (
user_id INT,
second_user_id INT,
id TIMEUUID,
author_id INT,
message TEXT,
PRIMARY KEY ((user_id), second_user_id, id)
) WITH CLUSTERING ORDER BY (second_user_id ASC, id DESC);
我有两种查询
在此表设计满足的两个用户之间进行聊天... where user_id=100 and second_user_id=200
获取该表设计不适合的特定用户的所有聊天,我不知道该怎么做,为此,我应该使用两个查询,1- ... where user_id=100'
... where second_user_id=100
哪个第二个查询不好,还有什么办法只能使用一个查询
您的表允许您通过user_id获取所有聊天记录,因此您可以将数据两次插入到该表中,但更改第二次插入的用户ID。
向第一个用户发送消息:
UPDATE user_messages SET .... second_user_id = 200 WHERE user_id = 100;
并向第二个用户发送相同的消息:
UPDATE user_messages SET .... second_user_id = 100 WHERE user_id = 200;
现在,您可以获得每个用户的所有聊天记录:
Select * from user_messages where user_id = 100;
Select * from user_messages where user_id = 200;
在两个用户之间聊天:
Select * from user_messages where user_id = 100 and second_user_id = 200;
或相反亦然:
Select * from user_messages where user_id = 200 and second_user_id = 100;
这种方法将复制数据,但对于Cassandra来说,这是一种支付读取速度的常用方法。
[编辑]大分区问题
如果您希望每个用户收到太多消息,则应该选择另一个分区键,而不是user_id。 例如,您可以使用由user_id和day组成的复合分区键,在这种情况下,每个分区仅包含一天的消息,但每天都有单独的分区。 此技术通常称为“存储桶”,这是存储桶的一些示例
您可以使用反向ID为两个用户创建两个记录:
记录1:user_id = 1和second_user_id = 2
记录2:user_id = 2和second_user_id = 1
显然,两个记录必须具有相同的id
, author_id
和message
因此您的第二个查询有效
SELECT * FROM sample.user_messages WHERE user_id = 1
而且,无论您在查询中提供的ID的顺序如何,您的第一个查询都可能在所有情况下都有效:
SELECT * FROM sample.user_messages WHERE user_id = 1 AND second_user_id = 2
SELECT * FROM sample.user_messages WHERE user_id = 1 AND second_user_id = 2
这两个查询将提供相同的结果。
我建议对second_user_id使用二级索引,如下所示:
创建索引index_second_user_id ON sample.user_messages(second_user_id);
因此,现在您的第一个查询将保持不变。
您的第二个查询将分为两个单独的查询,分别针对user_id和second_user_id,如下所示
1) select * from "user_messages" where user_id=100;
2) select * from "user_messages" where second_user_id=100;
这应该会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.