在数据库中存储聊天消息的最佳方法?[关闭]


82

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

谁能推荐更具扩展性的mysql解决方案?我不要求个别邮件是可搜索,可编辑或可删除的。整个对话能否存储在一个巨大的领域中?

很想听听您的想法!


12
如果这些消息不需要可搜索或可编辑,则没有必要保留在数据库中
ajreal,2011年

20
我建议您从容易起步,以为简单,使用关系数据库,如果扩展成为问题,请解决!太多的人关心永远不会发生的情况,因为他们花费太多时间来构建完美的基础架构,而他们没有时间专注于重要的事情。
whirlwin

Answers:


47

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

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

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


15

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

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

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


1
听起来很棒。谁能反驳这个论点?
2016年

74
写入文件是一个可怕的想法。在大多数服务器端环境或群集中,您甚至都无法保证您的第二个请求与文件位于同一服务器上。写入文件系统非常缓慢,并且受I / O限制。抱歉,我无法相信这获得了如此多的赞成票。
安迪Fusniak

6
抱歉,我实际上是在回答不构成虚构场景的问题。目前,这些消息已保存到数据库中,所以为什么简单的文件系统写入会慢得多。还请阅读我的答案每个用户1个文件\对话!!!(在您的虚拟群集上,我已经安装了FSA-SAN)。在我看来,OP的要求听起来像是记录\审计。
凯文·伯顿

5
写入和读取文件会占用大量资源。我认为使用任何类型的数据库都应有助于减少资源延迟。归根结底,数据库也将这些信息存储到文件中(略有不同)。我认为给定的想法非常适合存储存档的聊天记录,或存储超过1年左右的聊天记录。但是,这里没有什么比简单的数据库更好。
Jay Patel-PayPal

3
OP在数据库中明确表示,除了这个可怕的想法之外,这没有回答问题
Lyoneel

2

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.