我有一个收集Posts
和Users
用户可以给予好评/ downvote每个岗位。将其存储在mongodb数据库中以确保用户不能多次投票给定文档的最佳方法是什么?
我想出了被存储user_ids数组每个谁投里面最简单的NoSQL上下的解决方案Post
文档(或甚至阵列(user_id, vote)
,其中vote
为+1或-1,这样用户就可以改变他们的投票)。考虑到每个帖子可以获得数千票,从性能的角度来看这是一个好主意吗?
真正受欢迎的网站(如Reddit)的热门帖子可以获得数十万票呢?
MongoDB文档当前最大限制为16MB,因此,假设Gilbert的计算准确无误,您将无法user_id
在Post
文档中存储所有600万个数据。
但是,您可以考虑将投票存储在User
文档中(即post_id
特定用户投票的s)。用户对600万个不同的帖子进行投票的可能性要小得多,这样一来,您就不会很快达到规模限制。
解决此问题的另一种方法:如果您希望某个特定帖子获得很多票,则可能希望将票外的票存储Post
在单独的集合中,并执行其他查询,类似于SQL方式的多对多JOIN表:
user_votes { user_id: ObjectId(...), post_id: ObjectId(...), vote:-1 }
并在(user_id,post_id)上创建复合索引。