大型聊天应用程序 Mysql db 消息存储每条消息 1 行或将整个线程附加到 1 个长文本字段

Posted

技术标签:

【中文标题】大型聊天应用程序 Mysql db 消息存储每条消息 1 行或将整个线程附加到 1 个长文本字段【英文标题】:Large Chat app Mysql db message storage 1 row per message or append whole thread to 1 longtext feild 【发布时间】:2018-02-25 13:08:25 【问题描述】:

正在使用 mysql db 开发一个大型聊天应用程序,任何时候都只能在 2 人之间进行对话。 寻找关于哪些数据库模式选项性能更好的意见。

选项 1。每条消息/响应插入一行的传统方法。 只需插入一个没有事先查找但正在重建的数据库中 聊天线程需要 ORDERBY

选项 2。或者将每条消息附加到单个消息字段。 选择会更快,因为不需要 ORDERBY 然而,在每条新消息上都会有一个查找 1st

同样使用选项 2,db 中的总行数会更少

有什么想法吗?

【问题讨论】:

选项 3 且唯一正确:两个表“对话”和“单项” 【参考方案1】:

这完全取决于您想对该字段做什么。不过,在几乎所有情况下,第一个解决方案(每个对话单独一行)是正确的方法。

如果您将对话视为“blob”,您可能只想使用第二种方法(所有这些方法都使用一个字段)。也就是说,如果您不想选择特定消息,请在消息中搜索,等等。从本质上讲,该列将是消息的存档,而不是与另一列一样有用的东西。

我还应该补充一点,在对话中,将消息存储在单个列中会丢失消息发送时间和发送者的信息。当然,您可以尝试封装它,例如使用 JSON 列。但是为什么要打扰呢? SQL 已经有很好的机制来表示这些信息。

【讨论】:

感谢您的输入戈登。该应用程序将像时间戳一样以两种方式工作,嵌入在消息中并使用 JS 显示。我一直在寻找与两个选项的数据库和性能相关的输入【参考方案2】:

我参与了两个大型(数以千万计的活跃用户)系统的设计。两者都使用关系数据库进行存储,一个使用 MySQL。在这两种情况下,每行都存储一条消息。通过[thread_id, message_timestamp | message_sequential_number | message_auto_increment_id] 进行索引对于获取和排序都很好。

请记住,对话可能会增长到数兆字节。如果您将整个对话存储在一行中,您将不得不在每条新消息上读取/写入整个内容,或者将整个想法保存在内存中,以便在大多数情况下显示 50 条最后的消息。效率轻松降低 200 倍。

另一方面,如果您喜欢冒险,不妨看看 Cassandra。它旨在将整个对话高效地存储在一条记录中。

【讨论】:

伟大的洞察力,感谢您的思想基因,我决定采用每行一条消息的选项...

以上是关于大型聊天应用程序 Mysql db 消息存储每条消息 1 行或将整个线程附加到 1 个长文本字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 和 jQuery 进行实时聊天。在哪里存储信息? mysql还是文件?

存储聊天消息的推荐方法(node.js)

在 MySql 表中存储聊天消息

获取 Firebase 中每条消息的个人资料图片的最佳方法

MYSQL在一个语句中多对多选择(聊天,最新消息,用户名)

从Firebase本地实时存储Room DB上的数据