MongoDB架构设计问题

3
我正在为一个类似于StackOverflow的网站设计MongoDB架构。该网站有问题和用户。 用户可以将问题添加到他们的收藏夹中,并且可以在收藏夹中搜索问题。
我有两个集合,分别是用户和问题。问题在于如何存储收藏。有两个选项:
1. 将用户的收藏问题ID列表与用户一起存储。 2. 将添加此问题到其收藏夹的用户ID列表与该问题一起存储。
应采用哪种方法?请记住,我还需要搜索用户的收藏夹。
对于数据库/记录大小的估计,请假设StackOverflow拥有的问题数量、用户数据库操作次数等信息。
更多信息:
此应用程序是使用C#编写的ASP.NET MVC,并希望使用Lucene.NET进行搜索。
谢谢!
3个回答

1

为UserFavories单独创建一个集合是更好的方法。因为收藏夹的大小随时都是未知的,并且它会不断增长。

       UserFavories
                -UserID (BSON Objectid)
                - id of the user who posted
                - Name of the user who posted
                - Name of the question
                - Question id
                - url to the question

我们认为存储用户ID和问题ID通常足以找到收藏夹。但在非SQL情况下,最好将相关信息与ID一起存储(避免连接)。在这种情况下,您可以存储发布问题的用户的ID和名称,以及问题的名称、ID和URL,因此您可以仅通过查询此文档轻松显示收藏夹,如下所示:

enter image description here

这不是一个确切的方法,但它会给你一个想法。


免责声明,我对文档数据库并不是很了解,只是非常感兴趣。我同意这可能是在考虑性能/易用性时的正确方法。但是,您是否能够通过添加一种Map Reduce索引来实现此目的,而不是添加一个全新的集合,然后再手动添加内容呢? - Stéphane
1
@Stephane,是的,你可以用map/reduce来做到这一点,但为什么我们需要使用map/reduce呢?既然我们可以用简单的方法来完成这个任务。如果您想要执行大型操作,则Map/Reduce更好,但在这里,这只是一个简单的存储和检索。当没有其他简单的方法时,请使用Map/Reduce。 - RameshVel

1

如果您设计类似SO的网站并希望实现相同的性能,那么您肯定需要对数据进行去规范化处理。因此,我建议在用户中存储用户喜爱的问题ID,并在问题中存储用户ID。在收藏操作期间,您需要在两个位置(用户、问题)中插入数据,但是您将能够快速检索到用户/问题的收藏。

顺便说一下:如果您在mongodb中使用lucene,您将遇到从mongodb加载相关度的问题。

如果您需要真正的全文搜索,可以尝试RavenDB。它也是一个很棒的nosql数据库,本地支持Lucene语法。

编辑:

当您设计类似SO的网站时,请记住以下几点:

  1. 去规范化处理
  2. 异步请求处理
  3. 后台作业

谢谢 - 你能解释一下我在使用Mongo + Lucene时可能遇到的问题吗? - Amila
@Amila:是的,如果Lucene按相关顺序向您返回某个实体的ID,则您将无法按相关顺序从MongoDB中加载此数据($in)。但是,您可以通过从Lucene返回的ID加载来自MongoDB的数据,然后在客户端上恢复相关性。 - Andrew Orsich
这不会是个问题。我正在考虑将显示搜索结果所需的所有内容(url、标题、用户名)都存储在lucene中。这样我就不必再从数据库中获取它们。 - Amila

0
如果您想显示每个问题的收藏标志数量,最好将它们与问题一起存储,以避免在用户数据库中搜索。

谢谢 - 但要选择用户x的收藏夹,必须扫描所有问题 - 或者我错过了什么?在userId列表上创建索引是否可以显著提高性能? - Amila
@Amila,你说得对。根据我在stackoverflow.com上的使用情况,我认为问题比用户个人资料更常被查看。索引可能有所帮助,但你必须进行测量才能确定。你还可以对数据进行反规范化处理,并存储每个问题和每个用户的收藏夹。你也可以使用Lucene。 - Malte Clasen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接