如何使用MongoDB设计是/否投票系统?

时间:2016-01-15 12:08:20

标签: mongodb mongodb-query database-schema

我需要设计我的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中加入的事情将是无痛的并且效率不高

所以我在哪里,选择什么架构? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

我建议你将投票存放在单独的文件中。

原因是增长的文档对于MongoDB来说是有问题的,因为每当文档增长到其初始大小的两倍时,它需要被移动到数据库文件中的不同位置。这会减慢写入速度。

但是,当您单独存储投票时,您可以轻松地进行其他查询,例如查找特定用户的投票统计信息。它还为您提供了存储更多元信息的选项,例如投票日期。

示例:

{
    item: [itemId],
    user: [userId],
    vote: [1 or -1],
    date: [ISODate]
}

作为索引,我会在{ item:1, user:1}上使用unique:true推荐复合索引,以防止重复投票。该指数还将加快获得项目的投票计数。仅user的附加索引可以快速获得特定用户的投票。

缺点是获得特定问题的投票计数需要您对投票收集进行.count。因此,您可以考虑在项目文档中保留当前投票计数的副本。