是mongodb适合stackoverflow等网站吗?
简单地说:是的,它可能是.
让我们分解各种页面/功能,看看它们如何在MongoDB中存储/复制.
此页面中的所有信息都可以存储在集合下的单个文档中questions
.这可能包括每个答案的"子文档",以保持快速检索此页面.
编辑:正如@ beagleguy指出的那样,您可以通过这种方式快速达到4MB的文档大小限制,因此最好将答案存储在单独的文档中,并通过将ObjectID存储在数组中将它们链接到问题.
在votes
可以被存储在一个单独的集合,用简单的链接到这个问题,并给user
谁投票.一个db.eval()
呼叫可以被执行递增/递减当增加一票(虽然它块,这样会不会很高性能的)投票的文档中直接计数,或MapReduce的呼叫可以定期做不偏移的工作.它可以以相同的方式工作favourites
.
通常使用修改器操作来处理诸如"已查看"数字,记录用户的访问时间等以递增计数器.从v1.3开始,有一个新的"查找和修改"命令,它可以在检索文档时发出更新命令,从而为您节省额外的电话.
可以使用MapReduce收集任何类型的统计数据(例如声誉,徽章,唯一标记)并推送到特定集合.像通知这样的东西可以被推送到另一个充当作业队列的集合中,有许多工作人员正在侦听队列中的新项目(想想徽章通知,自用户上次访问时间以来的新答案等).
问题页面及其过滤器都可以使用上限集合进行处理,而不是立即查询该数据.
最终,YMMV.与所有工具一样,有优势和成本.有一些SO功能需要在RDBMS中进行大量工作,但在Mongo中可以非常简单地处理,反之亦然.
我认为Mongo优于RDBMS的主要优点是无模式方法和复制.在基于RDMBS的"实时"应用程序中定期更改架构可能会很痛苦,甚至在大量数据大量使用时也是不可能的 - 这些类型的操作可能会长时间锁定表.在Mongo中,添加新字段非常简单,因为您可能不需要将它们添加到每个文档中.如果您执行相对较快的操作来运行map/reduce来更新文档.
至于复制,Mongo的优势在于不需要暂停DB来为从属设备拍摄快照.如果没有这种方法,很多RDBMS都无法设置复制,大型数据库可以让主机长时间停机(我在看你,MySQL!).对于StackOverflow类型的站点来说,这可能是一种祝福,您需要随着时间的推移进行扩展 - 每次需要添加节点时都不需要关闭主站.
我觉得是这样的.
您可以将问题本身,答案和对问题+答案的评论存储为一个mongo文档.最大doc大小是4 MB,因此stackoverflow上的文档对于mongo来说不会太大.我已经用bittorrent下载了stackoverflow(数据转储)的内容,我已经能够将这些内容导入到mongo中.
将此数据导入mongo并非易事,因为stackoverflow的转储由多个xml文件组成,并且每个xml文件与一个关系表匹配,因此必须将此数据重新组合为文档格式.
我还在本文档中添加了显示名称+ OP + answerers +评论者的声誉.这意味着如果用户更改了他/她的显示名称,则必须使用他/她的用户ID更新所有文档.如果您对数据进行非规范化,则需要付出代价.如果用户的声誉发生变化,则相同.
我们的想法是,您在这样的页面上看到的所有数据都包含在一个mongo文档中.您拥有一个查找和没有连接的所有必要信息.
在这里,您可以下载stackoverflow的数据转储:http://blog.stackoverflow.com/category/cc-wiki-dump/