在 MySQL DB 中保存聊天消息,架构设计

Posted

技术标签:

【中文标题】在 MySQL DB 中保存聊天消息,架构设计【英文标题】:Saving chat message in MySQL DB, scheme design 【发布时间】:2017-10-20 21:50:50 【问题描述】:

我正在构建一个非常简单的聊天应用程序,它允许一对一的消息和多人聊天室。我打算有一个Message表来存储所有聊天消息,每条消息也会保留发送者ID和接收者ID,如果是在聊天室发送消息,我们也会保留该聊天室的ID。下表是:

Message Table

ID      Message               Sender       Receiver    Chatroom    Timestamp      
1       Hello, David          123          321                     1495330074
2       Hi, Linda             321          123                     1495930032
3       Hi everyone!          456                       999        1495930132
4       What up?              321          123                     1495930192

...

如果我是用户 321,我想检索我与用户 123 的对话,我只需要SELECT * FROM Message WHERE Sender=123 or Receiver=123 or Sender=321 or Receiver=321 and Chatroom IS NULL

这种设计存在一个问题 - 用户无法删除他不想再看到的消息。

为了解决这个问题,我想我可以有一个单独的表来存储用户接收或发送的消息,如下所示:

User Message Table

ID      UserID               MessageID               
1       123                   1                    
2       321                   1
3       321                   4
...

这似乎有点多余,但这样大卫可以在他与琳达的对话中删除一条消息,而琳达仍然可以看到完整的对话历史记录。

桌子有更好的设计吗?将所有聊天消息放在一张大桌子上是一种好习惯吗?我应该添加一些索引以使查询更快吗?

【问题讨论】:

当你的表变大时,OR 会非常慢。在此论坛中搜索“聊天”以查看其他人在做什么。 【参考方案1】:

您可以使用此查询。

delete from Message
where sender = 123 and user = 321

但这会删除此用户和发件人之间的所有聊天消息。要删除特定消息,您可以使用 ID

从消息中删除 其中 ID = 1

【讨论】:

这行不通,你永远不应该删除数据库中的消息。就像我说的,如果大卫删除了他和琳达之间的对话中的一条消息,琳达应该仍然看到这条消息。

以上是关于在 MySQL DB 中保存聊天消息,架构设计的主要内容,如果未能解决你的问题,请参考以下文章

浅析直播间海量聊天消息的架构设计难点

几十万人同时在线的直播间聊天,如何设计服务端架构?

IM即时通讯:如何跳出传统思维来设计聊天室架构?

[开源精品] C#.NET im 聊天通讯架构设计 -- FreeIM 支持集群职责分明高性能

chat集群聊天室项目 代码+讲解:映射层 + 持久层

chat集群聊天室项目 代码+讲解:映射层 + 持久层