我正在构建一个聊天应用程序,我希望获得聊天对话中发送的所有消息的完整历史记录。目前,我将每个消息作为一行存储在称为“消息”的表中。我知道这个表可能会变得很大,因为像“ Hi”这样的小消息也会有自己的数据库记录。
谁能推荐更具扩展性的mysql解决方案?我不要求个别邮件是可搜索,可编辑或可删除的。整个对话能否存储在一个巨大的领域中?
很想听听您的想法!
我正在构建一个聊天应用程序,我希望获得聊天对话中发送的所有消息的完整历史记录。目前,我将每个消息作为一行存储在称为“消息”的表中。我知道这个表可能会变得很大,因为像“ Hi”这样的小消息也会有自己的数据库记录。
谁能推荐更具扩展性的mysql解决方案?我不要求个别邮件是可搜索,可编辑或可删除的。整个对话能否存储在一个巨大的领域中?
很想听听您的想法!
Answers:
将整个历史记录保存在数据库中没有任何问题,它们已经为此类任务做好了准备。
实际上,您可以在Stack Overflow中找到指向聊天示例架构的链接:example
如果您仍然担心大小,可以对组消息进行一些优化,例如向应用程序中添加一个缓冲区,该缓冲区仅在一段时间(例如1分钟左右)后才推送;这样,您将避免只有1条线路消息
如果您可以避免同时写入单个文件的需要,听起来好像您不需要数据库来存储聊天消息。
只需将对话附加到文本文件(每个用户\对话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
如果您需要重新建立对话,则需要在发送的聊天消息(文件中)的旁边加上一个值(日期时间),以允许您对文件进行合并和排序,但这时可能是个好主意考虑使用数据库。
您可以为x个对话创建一个数据库,其中包含这些对话的所有消息。这样,每次x超过时,您就可以添加一个新的数据库(或服务器)。X是基础架构支持的对话数(取决于您的硬件,...)。
问题仍然是,同一数据库上可能存在大量对话(包含大量消息)。例如,您有数据库A和数据库B,每个数据库存储例如1000个会话。我可能在服务器A上进行的“大型”对话比在服务器B上进行的对话要多得多(因为这是用户创建的内容)。您可以添加一个包含查找的“主”数据库,可以在该数据库/服务器上找到单个对话(或者您具有从哈希/模或其他方式分配数据库的方案)。
也许您可以找到处理相同问题的现实世界架构(您可能不是第一个),并且已经解决了。