数据库设计 – 在MongoDB中建立投票系统的最佳方式

前端之家收集整理的这篇文章主要介绍了数据库设计 – 在MongoDB中建立投票系统的最佳方式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在MongoDB中建立投票系统.你可以想象它是一个类似于reddit的投票系统.要求:

>投票连接到对象
>检查用户是否投票对象是非常快的.应用程序将需要知道登录用户是否在对象上投票,同时循环显示呈现投票按钮的对象列表.
>最重要的是,它必须能够以合理的性能,在给定的时间段(最后一小时,日,月等)中检索按其总分数排序的对象.
>应该能够支持每个对象数千票.

我在这里看到两种方法(如果我错了,纠正我的话):

>在每个对象中嵌入投票文件数组.我可能会存储投票的用户的ObjectId,投票金额和投票时间. voterId将是投票数组中每个嵌入式投票文档的关键,以允许快速哈希查询.
>使用投票对象进行单独的投票收集.

我也玩过一个想法,将投票嵌入到一个单独的集合中按小时分组的“桶”.

对于第2号要求,第1号将非常快,但是我不知道在这种情况下是否有可能要求3.

对于第2号要求,第2号会更慢,我不知道要求3(如何实现)的性能将如何?

基本上看来,我需要从第3号要求开始一个相当快速解决方案,然后确保2号要求不会太慢.想法?

潜在的解决方

使用嵌入式方法.为每个对象添加一个参数,用于小时分,每日评分,每月评分等.添加最近投票,最近每小时和最近每日的布尔参数.创建一个在对象上运行map-reduce的脚本来计算和更新这些参数.

脚本将通过cron在三个变体中运行.

> 10分钟间隔:计算具有先前小时分数的对象的小时分数> 0最近投票= OR的OR对象.运行此脚本后,最近设置为= false.设置recent-hourly = true.
> 3小时间隔:计算任何具有近期小时=真的物体的每日得分.设置recent-hourly = false.设置recent-daily = true.
> 24小时间隔:计算任何最近每日= true的物体的月份分数.设置recent-daily = false.

这个想法是对与运行的分数计算脚本无关的对象进行最小化不必要的处理(每小时只能运行在上次运行小时后投票的对象上,或者没有被投票的对象)并需要重置为0).另一个不错的好处是,*值不仅仅是要根据对象投票来计算.您可以包括页面浏览,例如,或其他.对这种做法的想法?

解决方法

在Mongo Cookbook: http://cookbook.mongodb.org/patterns/votes/中查看原子运算符的投票食谱.它不告诉你如何实现聚合,但是您也可以通过使代表对象的备用对象来投票,但是对于特定的时间段.

猜你在找的MongoDB相关文章