【问题标题】:Best way to store chat messages in a database? [closed]将聊天消息存储在数据库中的最佳方法? [关闭]
【发布时间】:2011-10-27 03:26:08
【问题描述】:

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

谁能推荐一个更具扩展性的mysql解决方案?我不要求单个消息是可搜索、可编辑或可删除的。整个对话是否可以存储在一个巨大的字段中?

很想听听你的想法!

【问题讨论】:

  • 如果这些消息不需要可搜索或可编辑,则没有必要保留在数据库中
  • 我建议从简单开始,简单思考,使用关系数据库,如果扩展成为问题,请处理它!太多人关心永远不会发生的场景,因为他们花费太多时间构建完美的基础架构,而没有时间专注于重要的事情。

标签: mysql scalability chat


【解决方案1】:

如果我们假设您也没有读取数据。

在我看来,这听起来像是一个审计\日志记录要求, 如果是,则不需要数据库来存储聊天消息。

只需将对话附加到文本文件(每天 1 个文件?)。 该文件可能如下所示:

chat-1-bob 201101011029, hi
chat-1-jen 201101011030, how are you?
chat-1-bob 201101011030, fine thanks.    
chat-1-jen 201101011035, have you spoken to bill recently?    
chat-2-bob 201101021200, hi
chat-2-bill 201101021201, Hey Bob,
chat-2-bill 201101021203, what time do you call this?
chat-2-bob 201101021222, about 12:22

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

如果您的需求发生变化并且需要搜索\编辑\删除,那么数据库会更合适。

【讨论】:

  • 这听起来很棒。谁能反驳这个论点?
  • 写入文件是一个糟糕的主意。在大多数服务器端环境或集群中,您甚至无法保证您的第二个请求甚至最终与文件位于同一服务器上。写入文件系统极其缓慢且受 I/O 限制。抱歉,我不敢相信这有这么多赞成票。
  • 写入和读取文件是资源密集型的。我认为使用任何类型的数据库都应该有助于减少资源延迟。归根结底,数据库也将这些信息存储到文件中(只是有点不同)。我认为给定的想法非常适合存储存档聊天或超过 1 年左右的聊天。但是这里没有什么比一个简单的数据库更好的了。
  • OP 的模糊要求是存储“所有已发送消息的完整历史记录”......不是“可搜索、可编辑或可删除”,这对我来说仍然听起来像是简单的日志记录\审核。听起来您正在对聊天应用程序的工作方式进行假设,您已经发明了通过索引消息来减少读取的需要,以便您可以证明数据库的合理性,您可以看到为什么这些模糊的问题会被关闭;)
  • OP在数据库中明确表示,除了这个可怕的想法,这不能回答问题
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    将整个历史记录保存在数据库中并没有错,它们已为此类任务做好了准备。

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 2014-03-13
      • 2012-10-25
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 2019-07-09
      相关资源
      最近更新 更多