mongodb适合stackoverflow这样的网站吗?

mongodb适合stackoverflow这样的网站吗?,mongodb,Mongodb,mongodb适合stackoverflow这样的网站吗?我想说不,它不是很适合,对象越复杂,对象/文档数据库就越有意义。但如果你这么看,大部分都不是复杂的对象关系 有一个问题表,有许多属性,然后是一组答案……但所有这些都需要独立访问,具体取决于您来自哪个视图,例如活动屏幕或问题/答案屏幕。因为您从很多角度访问它,而且每个部分都相对简单,所以关系模型工作得更好 有在后台运行的徽章等查询,您需要快速检查您是否达到了投票的声誉上限…考虑到对象模型的复杂性,在RDBMS中有许多关系查询更简单 这当然是

mongodb适合stackoverflow这样的网站吗?

我想说不,它不是很适合,对象越复杂,对象/文档数据库就越有意义。但如果你这么看,大部分都不是复杂的对象关系

有一个问题表,有许多属性,然后是一组答案……但所有这些都需要独立访问,具体取决于您来自哪个视图,例如活动屏幕或问题/答案屏幕。因为您从很多角度访问它,而且每个部分都相对简单,所以关系模型工作得更好

有在后台运行的徽章等查询,您需要快速检查您是否达到了投票的声誉上限…考虑到对象模型的复杂性,在RDBMS中有许多关系查询更简单


这当然是我的观点,也许SO的结构比它看起来要复杂得多

对我来说MongoDB对于所有不需要交易的网站来说都是非常棒的。

对于应用程序OLTP端的RDBMS和适当的缓存,它应该可以正常工作



实际上-有一个使用RoR和MongoDB的应用程序:

简单地说:是的,可能是这样。

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

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

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

投票
可以存储在一个单独的集合中,带有指向问题和投票的
用户的简单链接。在添加投票时,可以执行一个调用来直接增加/减少文档中的投票计数(尽管它会阻塞,因此性能不高),或者可以定期进行一个调用来抵消这项工作。对于
收藏夹
,它可以以同样的方式工作

诸如“已查看”的数字、记录用户的访问时间等,通常会使用“到”计数器进行处理。从v1.3开始,有一个新的“Find and Modify”命令,它可以在检索文档时发出update命令,从而为您节省额外的调用

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

“问题”页面及其过滤器都可以通过封顶集合处理,而不是立即查询数据

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

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


至于复制,Mongo的优点是不需要暂停数据库来为从属服务器拍摄快照。如果没有这种方法,许多RDBMS无法建立复制,在大型DBs上,这种方法可能会让主服务器长时间处于关闭状态(我在看你,MySQL!)。这对于StackOverflow类型的站点来说是一件好事,您需要随着时间的推移进行扩展—无需每次需要添加节点时都将主节点取下。

您也可以使用$inc/$dec进行投票跟踪,因此无需使用db.eval

我认为是这样

您可以将问题本身、答案和对问题+答案的评论存储为一个mongo文档。最大文档大小为4MB,因此stackoverflow上的文档对于mongo来说不会太大。我已经用bittorrent下载了stackoverflow(数据转储)的内容,并且能够将此内容导入mongo

将此数据导入mongo并非易事,因为stackoverflow的转储由多个xml文件组成,每个xml文件与一个关系表匹配,因此必须将此数据重新组合为文档格式

我还将OP的显示名称+声誉+回答者+评论者添加到此文档中。这意味着,如果用户更改其显示名,则必须使用其用户名更新所有文档。如果您对数据进行非规范化,则需要付出代价。如果用户的信誉发生变化,则相同

其思想是,您在这样一个页面上看到的所有数据都包含在一个mongo文档中。只需一次查找,无连接,即可获得所有必要的信息


您可以在这里下载stackoverflow的数据转储:

我认为它非常适合。在功能类似于StackOverflow的站点上使用MongoDB等非rel数据库有很多原因。考虑一下RDBMs如何将数据存储到磁盘,并在规划布局时考虑文件系统块大小和类似的磁盘属性。我喜欢利用跨越多个文件系统块的文档,并在其内部存储大量相关信息。我发现存储器的分布范围较小,可以写入包含大量信息的单个块,而使用其他解决方案可以写入多个块。