ram*_*ami 9 database-design mongodb
我有一个收集Posts和Users用户可以给予好评/ downvote每个岗位.将此存储在mongodb数据库中以确保用户不能多次为给定文档投票的最佳方法是什么?
我想出了被存储user_ids数组每个谁投里面最简单的NoSQL上下的解决方案Post的文件(甚至阵列的(user_id, vote)地方vote是+1或-1,这样用户就可以改变他们的投票).从表现的角度来看这是一个好主意,因为每个帖子都有数千张选票吗?
那些真正受欢迎的网站如Reddit,哪些热门帖子可以有数十万票?
那些真正受欢迎的网站如Reddit,哪些热门帖子可以有数十万票?
他们呢?在关系数据库中使用您的想法,您有一个用于用户id指针的整数,一个用于post指针的整数,以及一个用于投票的字节.每次投票总共9个字节.
当然,有一些索引开销.每次投票总计15个字节.600万票将占用90兆字节的磁盘空间.
Reddit会在一段时间后锁定帖子,因此无法对其进行编辑或投票.所以Reddit不必永远存储个人投票.只需投票总数.
MongoDB文档目前限制为最大16MB,因此假设Gilbert的计算是准确的,您将无法user_id在Post文档中存储所有6百万.
但是,您可以考虑将投票存储在User文档中(即post_id特定用户投票的s).用户在600万个不同帖子上投票的可能性要小得多,因此这样您就不会很快达到大小限制.
处理此问题的另一种方法:如果您期望对特定帖子进行多次投票,您可能希望将Post文档外的投票存储在单独的集合中并执行其他查询,类似于SQL方式中的多对多JOIN表:
user_votes { user_id: ObjectId(...), post_id: ObjectId(...), vote:-1 }
并在(user_id,post_id)上创建复合索引.