【发布时间】:2014-12-02 21:39:34
【问题描述】:
我正在用 node.js 和 mongoose 开发一个聊天系统。使用 mongodb 将整个聊天记录存储在其中是否很好?还是我们应该使用蚂蚁替代品?
【问题讨论】:
我正在用 node.js 和 mongoose 开发一个聊天系统。使用 mongodb 将整个聊天记录存储在其中是否很好?还是我们应该使用蚂蚁替代品?
【问题讨论】:
好的,所以我使用评论内容稍微转换了这个问题:
但很少有朋友建议最好不要使用增长的 mongoDB 集合。这就是为什么有点困惑。如果你做这个项目,你会怎么做??
关于如何有效使用 MongoDB 的建议。
我不确定你的朋友引用了什么参考,但 MongoDB 非常擅长聊天,比如初始数据永远不会更新的应用程序,也就是说,你永远不会向服务器发送更新语句,只有 insert() 和 remove() (可能是一个更新说明何时看到它,但这应该是一个适当的更新)。
如果您要更新行(文档),MongoDB 就不会那么好,但是,在最近的版本中,它也变得更好了。默认情况下,powerof2sizes 的引入意味着您实际上可以将消息扩大到接近其原始大小的 2 的幂,然后才需要将文档移动到新的磁盘扇区,从而使磁盘重用也更容易。当然,非就地更新对 IO 和 CPU 来说都是昂贵的。
至于搜索,SQL 确实具有 FTS,但是,正如 Stack Exchange 自己发现的那样:数据库非常擅长搜索。他们很快用 Elastic Search 取代了 MS SQL FTS。
至于排序:我不确定为什么 SQL 在这里会更好。 MongoDB 可以对索引进行排序,在这种情况下,在任何数据库中对非 inex 进行排序都是非常糟糕的做法。想象一下,必须从数据库中加载每条评论来执行排序。所以在排序方面两者都是平等的。
通过分组,MongoDB 现在拥有聚合框架,但由于回归,目前缺乏使用覆盖查询的能力。这意味着组将当前从磁盘加载,而不是仅使用索引。这确实使 SQL 在这方面变得更好……目前。但是,我很难看到您将如何分组,您将有两张桌子:
一个屏幕显示第一个表格,第二个表格显示……第二个。
您将在第一个表上按 user_id 过滤,在第二个表上按 convo_id 过滤。
日志是聊天应用程序中非常普遍要求的功能,因此与@Rax 不同,我不会在我的理由中使用它;我不确定这会如何改变任何东西,除了 MongoDB 和其他技术之间的空间需求。话虽这么说:很多技术实际上默认使用 MVCC,这将比 MongoDB 占用更多的空间(很高兴注意到 SQL 技术没有,但很多数据库,如聊天公司使用的 CouchDB 等) .
我还要说你读的比写的多。每次有人发送一条消息都会有一个阅读,而不只是在原来的一面说“它已发送!!!”但也在接收端说“获取下一条消息”。因此,每条消息都会触发双倍的读取。 MongoDB 针对此类工作流程进行了优化。
无论如何,这应该给你一些指导。我会试用 MongoDB,看看它是如何为你工作的。
【讨论】:
在我看来,mongodb 并不适合记录任何内容,因为:
在 out 项目中,我们将最近的聊天记录存储在 redis 列表中(用于快速简单获取)和 postgres 中的其他日志。
【讨论】: