2012-10-21 16 views
0

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

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

B)存储的链接阵列中的每个用户对象

C)做既

d)做点其他的...(但什么?)

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

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

回答

4

因为文件的最大尺寸的,我可能会添加新的数据库如Redis的一个,所有这些信息。你可以通过这样做来获得表现。 我有一个应用程序,我建立这个问题。事实上,在很多人喜欢之后,文档开始加载的速度会变慢。

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

为了保持轻松统计它们,您当然可以在链接文档中保留喜欢的数量。但我不会试图让所有在那里点击的用户。 而且不会将其嵌入到用户中。

希望这有助于

+0

文件的最大尺寸将不会是一个问题 – Serdar

+1

好方法。如果你想进一步推动它,你可以看看:http://github.com/danlucraft/presentations/raw/master/denormalizing.pdf - Songkick实际上只使用MongoDB进行非规范化,并保持其数据在SQL中保持标准化D B。这保持目的分开。顺便说一句,你可以只对MongoDB做同样的事情。只是区分你的规范化和非规范化(缓存)集合。 – jbescoyez

1

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

所以,我认为最好的办法是C,两种方式存储数据,为便于检索。

0

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

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

0

店两个集合的数据...但只是必要的属性。

在您的应用程序,如果你将需要在一些地方达到这一数据...最好是把它在一个地图...

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

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

0

根据你的问题

只是存储在用户对象的链接,然后用数链接对象来计数点击数。

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

所以,你可以

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

指数阵列例如:How does MongoDB index arrays?