在数据库中存储聊天消息的最佳方式?

wil*_*age 62 mysql scalability chat

我正在构建一个聊天应用程序,我希望在聊天对话中发送的所有消息都有完整的历史记录.目前,我将每条消息作为一行存储在名为"messages"的表中.我知道这个表可能会变得很大,因为即使像'Hi'这样的小消息也会拥有自己的数据库记录.

谁能推荐一个更具伸缩性的mysql解决方案?我不要求单个邮件可搜索,可编辑或删除.整个会话可以存储在一个巨大的领域吗?

很想听听你的想法!

jas*_*ero 42

将整个历史记录保存在数据库中没有任何问题,它们已为这类任务做好准备.

实际上,您可以在Stack Overflow中找到聊天示例模式的链接:示例

如果您仍然担心大小,可以应用一些优化来对消息进行分组,例如向应用程序添加一个缓冲区,仅在一段时间后(例如1分钟左右)推送; 这样你就可以避免只有1行消息


Kev*_*ton 18

如果您可以避免同时写入单个文件,则听起来您不需要数据库来存储聊天消息.

只需将对话附加到文本文件(每个用户\对话1个文件).并有一个目录/文件结构

这是文件结构的简化视图:

chat-1-bob.txt
        201101011029, hi
        201101011030, fine thanks.

chat-1-jen.txt
        201101011030, how are you?
        201101011035, have you spoken to bill recently?

chat-2-bob.txt
        201101021200, hi
        201101021222, about 12:22
chat-2-bill.txt
        201101021201, Hey Bob,
        201101021203, what time do you call this?
Run Code Online (Sandbox Code Playgroud)

那么您只需要存储用户ID,会话ID(guid?)和对文件名的引用.

我想你会发现很难找到更简单的可扩展解决方案.

您可以使用LOAD_FILE以获取数据:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

如果您需要重建对话,则需要在发送的聊天消息(文件中)旁边放置一个值(日期时间)以允许您对文件进行合并和排序,但此时这可能是一个好主意考虑使用数据库.

  • 写入文件是一个糟糕的主意.在大多数服务器端环境或群集中,您甚至不能保证您的第二个请求甚至最终与文件位于同一服务器上.写入文件系统非常慢并且I/O受限.对不起,我不敢相信这得到了很多票. (45认同)
  • OP在数据库中明确表示,除了这个可怕的想法,这不能回答问题 (6认同)
  • 抱歉,我实际上回答的问题是没有构成虚构的场景.目前消息被持久化到数据库,那么为什么简单的文件系统写入要慢得多.另请阅读我的回答1个用户\对话的文件!(在我虚构的集群上,我安装了FSA-SAN).OPs的要求听起来像是logging\audit,在我看来属于一个文件. (5认同)
  • 写入和读取文件会占用大量资源。我认为使用任何类型的数据库都应有助于减少资源延迟。归根结底,数据库也将这些信息存储到文件中(略有不同)。我认为,给定的想法非常适合存储存档的聊天记录,或存储超过1年左右的聊天记录。但是,这里没有什么比简单的数据库更好。 (3认同)
  • 这听起来很棒。任何人都可以反驳这个论点吗? (2认同)