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

时间:2011-08-15 08:41:54

标签: mysql scalability chat

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

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

很想听听你的想法!

3 个答案:

答案 0 :(得分:39)

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

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

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

答案 1 :(得分:21)

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

只需将对话附加到文本文件(每个用户\会话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?

然后你只需要存储用户ID,会话ID(guid?)和&对文件名的引用。

我认为您会发现很难获得更简单的可扩展解决方案。

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

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

答案 2 :(得分:1)

您可以为x对话创建一个数据库,其中包含这些对话的所有消息。这将允许您在每次x超过时添加新的数据库(或服务器)。 X是您的基础架构支持的数字对话(取决于您的硬件,......)。

问题仍然是,同一个数据库上可能存在大量对话(包含大量消息)。例如你有数据库A和数据库B,每个存储例如1000次对话。我可能在服务器A上有比在服务器B上更多的“大”对话(因为这是用户创建的内容)。您可以添加一个包含查找的“主”数据库,在哪个数据库/服务器上可以找到单个对话(或者您有一个模式可以从散列/模数或其他东西分配数据库)。

也许您可以找到处理相同问题的真实世界架构(您可能不是第一个),并且已经解决了。