我正在使用MongoDB构建一个Hacker-News或Reddit风格的社交新闻网站。假设我想存储点击每个链接的人数,以便将点击次数计入链接的受欢迎度分数。我该如何组织我的数据?我可以:
A)存储点击每个链接对象中链接的用户数组。
B)存储在每个用户对象中点击的链接数组
C)两者兼顾
D)做别的事......(但是什么?)A)的优点是获得每个链接的点击次数是微不足道的。另一方面,B)的优点是您可以轻松地向用户显示他们点击的链接的历史记录。当然,C)允许您同时执行这两项操作,但代价是重复数据。
那么我应该选择哪种解决方案以获得最佳性能?有没有“正确”的方法来解决这个问题?
答案 0 :(得分:4)
由于文档的最大大小,我可能会添加一个像redis的新数据库,包含所有这些信息。你可以通过这样做获得表现。 我用我构建的应用程序遇到了这个问题。事实上,经过很多喜欢,文档开始加载速度会慢一些。
但是如果你只需要mongodb,我可能会将它们添加到另一个集合中。这将为您提供一些冗余,但该部分完全是一个关系部分,并且在没有面向SQL文档的数据库中可能有些棘手。
为了便于计算它们,您当然可以保留链接文档中的喜欢数量。但我不会试图阻止点击那里的所有用户。 并且不会将其嵌入用户。
希望这有帮助
答案 1 :(得分:1)
通常,NoSQL数据库鼓励您冗余地存储数据。 (这是因为,由于它们不支持关系连接,因此有必要对模式进行非规范化以便于检索数据。)在这种情况下,如您所述,如果您只将链接存储在用户的记录中,反之亦然,执行所需的所有查询并不容易或有效(您必须基本扫描集合中的每个文档)。
所以,我认为最好的方法是C
,以两种方式存储数据,以便于检索。
答案 2 :(得分:0)
您可以使用用户和链接存储文档的每次点击,然后运行查询以获取每个链接的点击次数和他们点击的链接历史记录。
(关于性能,我不知道它的价值,也许将索引放在用户和链接上)
答案 3 :(得分:0)
将数据存储在两个集合中......但只包含必要的属性。
在您的应用中,如果您需要在某些地方获取该数据...最好将其放在一张地图中...
所以,如果我是你,我会毫不犹豫地复制数据......
另一方面我们谈论的链接或用户数量是多少?
答案 4 :(得分:0)
根据你的问题
只需将链接存储在用户对象中,然后使用链接对象中的数字来计算点击次数。
然后在用户对象的链接数组上设置索引。
所以你可以