Mongodb模式设计问题

时间:2011-09-20 08:30:46

标签: c# mongodb schema-design

我正在为像stackoverflow这样的网站设计一个mongo db模式。有问题和用户。 用户可以将问题添加到他们喜欢的列表中,他们可以在收藏夹列表中搜索问题。

我有2个馆藏,作为用户和问题。问题是如何存储收藏夹。有两个选项

  1. 与用户
  2. 存储收藏的问题ID列表
  3. 存储用户ID列表(将此问题添加到收藏夹中的用户)以及问题。
  4. 我应该采取哪种方法?请记住,我也需要搜索用户的收藏夹。

    对于db / record大小的估计,假设问题的数量,stackoverflow具有的用户db操作

    了解更多信息;

    这个应用程序是一个用c#编写的asp.net mvc,希望用Lucene.NET进行搜索

    提前致谢

3 个答案:

答案 0 :(得分:1)

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

顺便说一下:如果你将lucene与mongodb一起使用,你将遇到mongodb的相关加载问题。

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

修改

当您设计像SO这样的网站时,请记住:

  1. 非正规化
  2. 异步请求处理
  3. 后台工作

答案 1 :(得分: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

我们认为存储Userid,Question Id足以在大多数时间找到收藏夹。但是在非sql中,最好将非常相关的信息与id(避免连接)一起存储。在这种情况下,您存储id&发布问题和姓名的用户的姓名,id&问题的网址,所以你只需要查询这个doc就可以轻松显示收藏夹,就像这个

一样

enter image description here

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

答案 2 :(得分:0)

如果要显示每个问题的收藏标记数,您应该将它们与问题一起存储,以避免搜索用户数据库。