【问题标题】:Implementing A Ranking System实施排名系统
【发布时间】:2009-06-29 08:52:58
【问题描述】:

我看到了几个关于如何保护和防止滥用排名系统(如盯着电影、产品等)的问题,但在实际实施方面却一无所获。为了简化这个问题,我不关心安全性,访问该系统的人都是值得信赖的,如果发生这种情况,滥用排名系统是微不足道的,而且比原因更容易恢复。无论如何,我很好奇如何存储选票。

一个想法是有一个投票表,记录每次投票,然后立即、在预定时间或在产品的每次加载时(这似乎效率低下,但也许不是)投票被统计并在两者之间加倍0 和 5 被更新到产品表中的产品条目中。

或者,我在 products 表中存储总分和投票数,当我显示时将其除以,当有人投票时将投票添加到总和递增数。

或者有没有更好的方法来做到这一点,我还没有想到?我有点想在产品表中有一个“评级”字段,但想不出没有一些额外数据来更新投票的方法。

同样,数据完整性很重要,但绝不是必要的,有什么想法吗?

【问题讨论】:

标签: mysql database-design voting-system


【解决方案1】:

我会为您的产品保留一个“分数”,但也会保留一张投票表,以查看谁为什么投票。当有人投票时,插入投票,更新产品分数。

这允许快速排序,并且您还有一个表格可以重新计算分数并阻止人们重复投票。

无需等待写入投票和更新分数。这引入问题,如果它像传统系统一样运行(读取次数多于写入次数),则不会给您带来任何好处。

【讨论】:

    【解决方案2】:

    您的意思是,您将投票单独存储在一个表中,然后使用定义的策略更新产品表中产品的相应排名? 这似乎是一种低效的存储方式。也许有这个原因的背景;但是您为什么不想将所有投票存储在一张表中并继续将这些投票引用到相应的产品。这为您提供实时计数。

    在 UI 上,您将计算所有投票的平均值以显示一个接近整数。那就足够了,不是吗?还是我错过了什么?

    【讨论】:

    • 我认为将排名与产品一起存储的原因是为了提高速度 - 这样计算只需要在有新投票时进行,而不是在每次页面加载时进行。这真的不是一个问题吗?
    • 我认为,只要在表上很好地创建索引和连接,将它们分开不会真正对性能产生很大影响。但是,如果您仍然认为它会对性能产生负面影响,那么请考虑在数据库中使用视图。在您的产品表和包含产品映射和评级的表之间使用连接查询创建视图。如果查询得到很好的优化并且您可以适当地进行计算,您可以根据视图提取应该相对更快的数据。
    【解决方案3】:

    我同意奥利的观点。此外,您可以缓存您的分数。因此,您更新缓存中的产品分数,您的应用程序始终会获取缓存值。因此,即使在页面刷新时,您也可以在不访问数据库的情况下获得最新分数。

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2011-09-12
      • 2013-02-21
      相关资源
      最近更新 更多