3

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

我有 2 个集合,分别是用户和问题。问题是如何存储收藏夹。有2个选项

  1. 与用户一起存储最喜欢的问题 Id 的列表
  2. 与问题一起存储用户 ID 列表(将这个问题添加到他们的收藏夹的用户)。

我应该采取哪种方法?请记住,我也需要搜索用户的收藏夹。

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

欲了解更多信息;

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

提前致谢

4

3 回答 3

1

如果您设计类似 SO 的网站并希望获得相同的性能,您肯定需要对数据进行非规范化。所以,我建议将用户最喜欢的问题 id 存储在用户中,并存储和存储用户 id 的问题。在收藏操作期间,您需要在两个地方(用户、问题)插入数据,但您将能够快速检索用户/问题收藏夹。

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

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

编辑:

当你设计这样的网站时,请记住:

  1. 非规范化
  2. 异步请求处理
  3. 后台作业
于 2011-09-20T08:54:00.110 回答
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 和 url,因此您只需单独查询此文档即可轻松显示收藏夹,如下所示

在此处输入图像描述

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

于 2011-09-20T08:54:30.673 回答
0

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

于 2011-09-20T08:40:25.290 回答