最佳的聊天消息和文件存储方法

5

我想知道您对将聊天信息存储在数据库中的看法。

我需要能够绑定其他内容(如文件或联系人),使用数据库是目前我所见的最好方式。

同样的问题也出现在文件上,因为它们可以与聊天消息绑定,我也必须将它们存储在数据库中。

有数千条消息和文件时,我担心会影响性能并增加数据库大小。

考虑到我正在使用PHP与MySQL/Doctrine,您认为怎么样?

2个回答

5
我认为只要您正确地构建数据库,就可以在数据库中存储任何文本信息(如名称、消息历史记录等)。我曾在访问量达到数千次的大型网站和电信公司工作过,这些公司将有关用户的信息(包括流量统计)存储在已经增长到数百GB的数据库中,应用程序运行良好。
但是对于像图像和文件这样的二进制信息,最好将它们存储在文件系统中,并仅在数据库中存储其路径,因为从磁盘读取它们比将数据库进程绑定到读取多兆字节文件更便宜。
正如我所说,重要的是您要做几件事情:
1.正确地设计您的数据库结构,将其分成表和字段,并考虑性能目标,因为这将构成应用程序和查询的基础。如果出错,您的查询将变慢。
2.针对每个表进行适当的表引擎决策。这是一个重要的步骤,因为它将极大地影响您的查询性能。例如,MyISAM在更新表时阻止读取访问。对于社交网络或新闻网站等Web应用程序来说,这将是一个问题,因为在许多情况下,您的用户基本上必须等待信息更新完成,然后才能看到生成的页面。
3.创建适当的索引-对于快速增长的大型数据库的应用程序尤其重要。
4.随着数据量的增长,测量查询性能并寻找改进方法-您总会发现必须消除的瓶颈,这是一个不断进行的持续过程。每个流行的Web应用程序都必须这样做。

当然,文件不会存储在数据库中,但是将其路径存储的条目非常有用,可以存储其他实体的附加数据并将它们链接起来。 此外,并非所有消息都需要特定的条目,因此将“简单消息”重新分组到同一数据库条目中可能是一个好主意。我对数据库设计优化并不是特别了解,您有相关链接吗? - Stnaire
这里有一些提示: http://www.informit.com/articles/article.aspx?p=27281 以及在这个演示文稿中: http://www.slideshare.net/ronaldbradford/top-20-design-tips-for-mysql-data-architects-presentation 您还可以阅读《MySQL数据库设计和优化入门指南》和《高性能MySQL》中关于存储引擎、表类型、应用程序设计、查询优化的精选章节。 - akhilless
好的,谢谢提供链接。但是你对Doctrine在优化方面有什么看法呢?使用ORM来处理高频请求是一个好主意吗?我还觉得你提供的文档中讨论的很多请求优化问题都可以由Doctrine来处理。 - Stnaire
欢迎。如果您需要从系统中挤出每一点性能,最好坚持使用PDO并编写自己的定制数据库处理库,特别针对您的情况进行优化。它只比原始的mysql_*请求慢一点,而Doctrine和其他ORM会增加很多开销,并且在需要扩展时将成为瓶颈。PDO具有您需要的所有内容,包括mysql_*函数没有的预处理语句。它还支持面向对象的接口。另一方面,使用PDO,您可以轻松地从MySQL切换到Oracle(如果需要)。 - akhilless
关于优化,最好的方式是自己进行“监控”-“找到瓶颈”-“优化”的不断循环,而不是依赖于第三方解决方案,因为你应该只实现系统需要的那些优化,并且在需要时进行,而不是其他。 - akhilless
抱歉回复时间有点晚。最好的方法应该是在PDO之上拥有一个轻量级的自定义库来处理高频请求,例如聊天消息记录,并使用Doctrine处理其他内容。我主要担心的是记录数量(数千条记录),很高兴看到将大量记录(如聊天消息)存储在数据库中的想法是可行的。感谢您的帮助 :) - Stnaire

1

我认为像CouchDB或MongtoDB这样的NoSQL数据库是一个选择。您也可以将文件分开存储,并通过已知的文件名链接它们,但这取决于您的系统架构。


2
有任何特定的原因吗? - HIRA THAKUR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接