0

我正在使用 MongoDB 构建一个 Hacker-News 或 Reddit 风格的社交新闻网站。假设我想存储有多少人点击了每个链接,以便将点击次数计入链接的流行度得分。我应该如何组织我的数据?我可以:

A)在每个链接对象中存储单击链接的用户数组。

B) 存储在每个用户对象中单击的链接数组

C) 两者都做

D)做点别的……(但是什么?)

A) 的优点是获得每个链接的点击次数是微不足道的。另一方面,B) 的优点是您可以轻松地向用户显示他们点击的链接的历史记录。当然,C) 可以让你两者都做,但要以复制数据为代价。

那么我应该选择哪种解决方案以获得最佳性能?有没有“正确”的方法来解决这个问题?

4

5 回答 5

4

由于文档的最大大小,我可能会添加一个新数据库,例如 redis 数据库,其中包含所有这些信息。你可以通过这样做获得性能。我构建的应用程序遇到了这个问题。事实上,在获得很多赞之后,文档会开始加载变慢。

但如果你只需要 mongodb,我可能会将它们添加到另一个集合中。这会给您一些冗余,但该部分完全是关系部分,并且对于面向 noSQL 文档的数据库可能会有些棘手。

为了便于计数,您当然可以在链接文档上保留点赞数。但我不会尝试保留所有点击那里的用户。也不会将其嵌入到用户中。

希望这可以帮助

于 2012-10-21T09:34:06.807 回答
1

通常,NoSQL 数据库鼓励您以冗余方式存储数据。(这是因为,由于它们不支持关系连接,因此需要对模式进行一定程度的非规范化以促进数据的检索。)在这种情况下,正如您所指出的,如果您只将链接存储在用户记录中,反之亦然,执行您需要的所有查询并不容易或高效(您必须基本上扫描集合中的每个文档)。

因此,我认为最好的方法是C双向存储数据,以便于检索。

于 2012-10-21T09:16:43.150 回答
0

您可以将文档的每次点击与用户和链接一起存储,然后运行查询以获取每个链接的点击次数和他们点击的链接的历史记录。

(关于性能,我不知道它的价值,也许将索引放在用户和链接上)

于 2012-10-21T09:25:37.813 回答
0

将数据存储在两个集合中......但仅具有必要的属性。

在您的应用程序中,如果您需要在某个地方访问该数据......最好在一张地图中获取它......

所以如果我是你,我会毫不犹豫地复制数据......

另一方面,我们正在谈论多少链接或用户?

于 2012-10-21T09:53:26.197 回答
0

根据你的问题

只需将链接存储在用户对象中,然后使用链接对象中的数字来计算点击次数。

然后在用户对象中的链接数组上设置索引。

这样你就可以

  • 获取用户对象中的所有点击链接。
  • 使用链接对象获取点击次数。
  • 使用用户对象中的链接索引快速找到谁点击了链接

索引数组示例:MongoDB 如何索引数组?

于 2012-10-21T20:32:45.287 回答