2012-08-27 38 views
8

我有一个PostsUsers的集合,用户可以在其中投票/向下投票每个帖子。将这个存储在mongodb数据库中以确保用户不能多次投票给定文档的最佳方式是什么?在mongodb中存储upvotes/downvotes

我想出了被存储user_ids阵列谁每个Post文档中投最简单的NoSQL上下的解决方案(甚至阵列的(user_id, vote)其中vote是+1或-1,这样用户就可以改变他们的投票)。考虑到每篇文章可以有数千票,从性能的角度来看,这是一个好主意吗?

真的很受欢迎的网站喜欢Reddit,顶级职位可以有几十万票?

+0

你会如何做到这一点?我试图存储objectids作为关键,但它不工作.. –

回答

5

MongoDB文档目前被限制为最大16MB,因此假设Gilbert的计算是准确的,您将无法在Post文档中存储全部6百万user_id

但是,您可以考虑将票保存在User文档中(即特定用户投票支持的post_id)。用户对600万个不同的帖子进行投票的可能性要小得多,所以这样你就不会很快达到规模限制。

处理此问题的另一种方法:如果您希望针对特定帖子进行多次投票,则可能需要将Post文档之外的投票存储在单独的集合中,并执行额外的查询,类似于多对多JOIN表SQL时尚:

user_votes { user_id: ObjectId(...), post_id: ObjectId(...), vote:-1 } 

并在(user_id,post_id)上创建复合索引。

6

真的很受欢迎的网站喜欢Reddit,顶级职位可以有几十万票吗?

他们呢?在关系数据库中使用你的想法,你有一个用户id指针的整数,一个post指针的整数和一个投票字节。每次投票总共9字节。

当然,有一些索引开销。每投票总共15字节。 600万张选票将占用90兆字节的磁盘空间。

Reddit在一段时间后锁定帖子,所以他们不能被编辑或投票。因此,Reddit不必永久存储个人投票。只是投票总数。