繁体   English   中英

用于用户聊天的Cassandra表设计

[英]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);

我有两种查询

  1. 在此表设计满足的两个用户之间进行聊天... where user_id=100 and second_user_id=200

  2. 获取该表设计不适合的特定用户的所有聊天,我不知道该怎么做,为此,我应该使用两个查询,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

显然,两个记录必须具有相同的idauthor_idmessage

因此您的第二个查询有效

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM