2010-03-06 60 views
25

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

+3

SO克隆Shapado http://gitorious.org/shapado使用mongodb。这是否是一个合适的选择是另一回事。只是fyi。 – Xiaofu 2010-03-06 05:53:44

+0

感谢您的信息 – unpangloss 2010-03-07 06:39:32

+0

@Xiaofu该死的......你快。刚刚发布这个信息给我的答案。 -_- – 2010-03-26 08:27:42

回答

39

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

让我们打破各个页面/特性,看看他们如何被存储/ MongoDB中再现。

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

编辑:为@beagleguy指出的那样,你可以打4MB的文件大小限制很快这种方式,所以这将是更好地保存在单独的文件答案,并通过存储在的ObjectID它们链接到的问题数组。

votes可以存储在一个单独的集合,与问题的简单链接和投票的user。一个db.eval()呼叫可以执行递增/递减当增加一票(虽然它块,这样会不会很高性能的)投票的文档中直接计数,或MapReduce呼叫可以定期做不偏移的工作。对于favourites,它可以以相同的方式工作。

类似“查看”数字,记录用户访问时间等事情通常会使用modifier operationincrement计数器处理。自v1.3以来,有一个新的“查找和修改”命令,可以在检索文档时发出更新命令,为您节省额外的电话费。

任何类型的统计数据(如信誉,徽章,唯一的标记)的可利用MapReduce收集并推到特定的集合。诸如通知之类的东西可以推送到充当工作队列的另一个集合,其中一些工作人员在队列中侦听新项目(认为徽章通知,自用户上次访问时间之后的新答案等)。

问题页面和它的过滤器都可以用capped-collections来处理,而不是立即查询那些数据。 YMMV。

最终,YMMV。与所有工具一样,它们都有优势和成本。有一些SO功能在RDBMS中需要很多工作,但在Mongo中可以很简单地处理,反之亦然。

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

至于复制,Mongo的优点是数据库不需要暂停为从服务器创建快照。如果没有这种方法,许多RDBMS都无法建立复制,在大型数据库上,可以使主机停止运行(我在看着你,MySQL!)。这对于StackOverflow类型的网站来说是一种福音,在这种网站中,您需要随着时间的推移进行扩展 - 每次需要添加节点时都不要让主服务器停机。

+0

这是一个很好的。谢谢。 – unpangloss 2010-03-07 06:40:41

+2

如果你在其中嵌入了答案,你会不会在相当大的线程上达到4MB限制? – James 2010-05-18 19:57:27

+3

@beagleguy:可能,是的。再次,都取决于你正在存储的内容。将Answer文档的ObjectIDs存储在问题文档的数组中可能会更好。 – 2010-05-19 08:04:15

1

我会说不,这不是一个非常适合,更复杂的对象得到更多的对象/文件数据库是有道理的。但是如果你看一下SO,大部分都不是复杂的对象关系。

有一个问题表,不过与很多属性,那么答案的集合......但所有这些需要单独进行访问,这取决于您的视图,例如从未来您的活动屏幕或问题/答案屏幕。由于您以很多角度访问它,并且每个部分都比较简单,因此关系模型效果更好。

在后台运行徽章等问题时,您需要快速检查您是否正在为投票选择信誉上限......鉴于对象的复杂性,很多关系查询在RDBMS中更简单模型。

当然,这是我的观点,也许是这样的结构比它似乎是

+2

还是更简单?问题和答案在同一个表格中。 – 2010-03-06 09:10:47

+1

我不认为对于ODB来说,对象关系必须更加复杂。我发现最重要的好处往往是数据库中的模式几乎不存在,因此可以更容易地进行修改,这对于Web开发来说是一大优势。 – 2010-03-11 20:07:32

-1

对我来说,MongoDB是真正伟大的所有网站,并不需要交易的方式更加复杂。

1

使用适用于应用程序OLTP端的RDBMS和适当的缓存 - 它应该能够正常工作。


事实上 - 有一个使用RoR的&的MongoDB的open source stackoverflow clone。 :)

0

您还可以使用$ INC/$十二月的投票跟踪,所以没有必要使用db.eval

+0

这太过简单化了我想一点事情。 – UpTheCreek 2011-07-05 06:39:44

5

我觉得是。

您可以将问题本身,答案和对问题+回答的评论作为一个mongo文档存储。最大文档大小是4 MB,所以对于mongo,没有任何文档在stackoverflow上会太大。我已经用bittorrent下载了stackoverflow(数据转储)的内容,并且我已经能够将这些内容导入到mongo中。

将这些数据导入mongo并不重要,因为stackoverflow的转储包含多个xml文件,每个xml文件都与一个关系表匹配,所以必须将这些数据重新组合为文档格式。

我还在本文档中添加了OP + answerers +评论者的显示名称+声誉。这确实意味着,如果用户更改他/她的显示名称,则必须用他/她的用户ID更新所有文档。如果您将数据非规范化,则需付出代价。如果用户的信誉发生变化,则相同。

这个想法是,你在页面上看到的所有数据都包含在一个mongo文档中。你有一个查询和没有连接的所有必要的信息。

在这里,您可以下载计算器的数据转储:http://blog.stackoverflow.com/category/cc-wiki-dump/

+0

+1有关转储信息以及如何将其“移植”到mongo – 2010-10-12 16:19:17

0

我认为这将是一个不错的选择。在类似于StackOverflow的网站上使用像MongoDB这样的Nonrel数据库有很多原因。考虑RDBM如何将数据存储到磁盘,并在规划布局时考虑文件系统块大小和类似的磁盘属性。我喜欢利用跨越多个文件系统块的文档,并将很多相关信息存储在自己的内部。我发现存储空间较少分散,并且可以编写一个包含大量信息的块,其中将使用其他解决方案写入多个块。

相关问题