mongodb - mongodb 适合像 stackoverflow 这样的网站吗?

标签 mongodb

mongodb 是否适合像 stackoverflow 这样的网站?

最佳答案

简单地说:是的,它可能是。

让我们分解各种页面/功能,看看如何在 MongoDB 中存储/复制它们。

此页面中的全部信息可以存储在questions集合下的单个文档中。这可能包括每个答案的“子文档”,以保持快速检索此页面。

编辑:为@ beagleguy指出,您可以通过这种方式很快达到 4MB 的文档大小限制,因此最好将答案存储在单独的文档中,并通过将 ObjectID 存储在数组中来将它们链接到问题。

votes 可以存储在单独的集合中,其中包含指向问题和投票的用户 的简单链接。一个 db.eval()调用 可以 在添加投票时直接在文档中增加/减少投票计数(尽管它会阻塞所以性能不会很好),或者 MapReduce可以定期打电话来抵消这项工作。 favourites 的工作方式相同。

诸如“查看”的数字、记录用户的访问时间等通常会使用 modifier operation 来处理。至increment一个柜台。从 v1.3 开始,有一个新的“查找和修改”命令,可以在检索文档时发出更新命令,为您节省额外的调用。

可以使用 MapReduce 收集任何类型的统计数据(例如声誉、徽章、独特标签)并推送到特定的集合。诸如通知之类的东西可以被推送到充当作业队列的另一个集合中,许多工作人员正在监听队列中的新项目(想想徽章通知、自用户上次访问时间以来的新答案等)。

问题页面及其过滤器都可以使用 capped-collections 进行处理,而不是立即查询该数据。

最终,YMMV。与所有工具一样,都有优势和成本。有一些 SO 特性在 RDBMS 中需要大量工作,但在 Mongo 中可以非常简单地处理,反之亦然。

我认为 Mongo 与 RDBMS 相比的主要优势在于无模式方法和复制。在“实时”的基于 RDMBS 的应用程序中定期更改架构可能会很痛苦,如果它大量使用大量数据,甚至是不可能的——这些类型的操作可能会锁定表太久。在 Mongo 中,添加新字段是微不足道的,因为您可能不需要将它们添加到每个文档中。如果您执行相对快速的操作来运行 map/reduce 来更新文档。

在复制方面,Mongo 的优势在于无需暂停数据库即可为从属设备拍摄快照。如果没有这种方法,许多 RDBMS 无法设置复制,这在大型 DB 上会使主服务器停机 很长时间 时间(我在看着你,MySQL!)。这对 StackOverflow 类型的网站来说是一件好事,因为您需要随着时间的推移进行扩展 - 无需在每次需要添加节点时都关闭主节点。

关于mongodb - mongodb 适合像 stackoverflow 这样的网站吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2391204/

相关文章:

mongodb - 如何处理外部插入 meteor 数据库?

java - EclipseLink MongoDB 连接

mongodb - 使用 json_serialized flutter 包将 DateTime 类型转换为 ISODate MongoDB

java - bean 的空属性会被插入到 MongoDB 中吗?

javascript - 使用 Loopback 加载配置参数的最合适方法是什么?

mongodb - 如何在不使用简单模式的情况下关联/关联到 Meteor 中的 Mongo 集合

java - 将流式集合写入文件 Java-Mongo

javascript - Node.js、MongoDB 和并发

javascript - mongoimport错误,失败:无效的JSON输入

javascript - 在 JavaScript 中创建时区感知日期