我需要设计我的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
...
}
但是这会使我的物品集合中的文件有点大(例如10万票,一个文件可以带走 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中加入的事情将是无痛的并且效率不高
所以我在哪里,选择什么架构? 谢谢你的帮助!
答案 0 :(得分:2)
我建议你将投票存放在单独的文件中。
原因是增长的文档对于MongoDB来说是有问题的,因为每当文档增长到其初始大小的两倍时,它需要被移动到数据库文件中的不同位置。这会减慢写入速度。
但是,当您单独存储投票时,您可以轻松地进行其他查询,例如查找特定用户的投票统计信息。它还为您提供了存储更多元信息的选项,例如投票日期。
示例:
{
item: [itemId],
user: [userId],
vote: [1 or -1],
date: [ISODate]
}
作为索引,我会在{ item:1, user:1}
上使用unique:true
推荐复合索引,以防止重复投票。该指数还将加快获得项目的投票计数。仅user
的附加索引可以快速获得特定用户的投票。
缺点是获得特定问题的投票计数需要您对投票收集进行.count
。因此,您可以考虑在项目文档中保留当前投票计数的副本。