我需要设计我的 mongodb 数据库的架构,并且我想选择最好的架构。我有一个项目集合 (ITEMS),并且每个人都可以对其中任何项目进行投票(是或否)。
一个项目可以有很多票(大约 10000 票,但最多可以达到 100000 票甚至更多)。现在我必须在哪里存储选票?在这样的项目中:
ITEMS: {
_id: int32, // id of the item
...
vote_yes:[int32], // the ids of people who vote yes
vote_no:[int32], // the ids of people who vote no
...
}
但这会使我的项目集合中的文档有点大(例如,有 100 000 票,一个文档可能需要大约 500 kb!但我不知道这是否重要,以及真正的后果是什么)。或者我可以将投票存储在专门用于投票的不同集合中(我仅将其用于投票,因此大小并不重要):
VOTES: {
_id: int32, // id of the item
vote_yes:[int32], // the ids of people who vote yes
vote_no:[int32], // the ids of people who vote no
}
但问题是过滤器! 我需要从项目中检索文档,其中vote_yes 不包含我的 ID,vote_no 不包含我的 ID 以及一些专用于项目的附加过滤器(例如本地化)。我认为在 mongodb 中进行连接会很轻松,而且效率不高
所以这就是我所在的位置,选择什么模式? 预先感谢您的帮助!
最佳答案
我建议您将投票存储在单独集合中的单独文档中。
原因是不断增长的文档对于 MongoDB 来说是有问题的,因为每次文档增长到初始大小的两倍时,都需要将其移动到数据库文件中的不同位置。这会减慢写入速度。
但是,当您单独存储投票时,您可以轻松进行其他查询,例如查找特定用户的投票统计信息。它还使您可以选择存储更多投票元信息,例如投票日期。
示例:
{
item: [itemId],
user: [userId],
vote: [1 or -1],
date: [ISODate]
}
作为索引,我建议在 { item:1, user:1}
上使用 unique:true
的复合索引,以防止重复投票。该索引还将加快项目的计票速度。仅针对用户
的附加索引可以快速获取特定用户的投票也可能很有用。
缺点是获取特定问题的投票计数需要您对投票集合进行 .count
。因此,您可能会考虑在项目文档中保留当前投票计数的副本。
关于mongodb - 如何使用 MongoDB 设计是/否投票系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810760/