Mysql 保存平均值,而不是在每次请求时计算平均值

Mysql 保存平均值,而不是在每次请求时计算平均值,mysql,concurrency,playframework-2.0,Mysql,Concurrency,Playframework 2.0,我正在开发一个排名系统,这是我的问题。假设我的数据库中有如下表: places : id, name, description place_marks : id, user_id, place_id, value, comment 当用户对地点进行研究时,我会向他发送一份按rate desc排序的地点列表。实现这一点的最佳方法是什么 解决方案1 获取与名称对应的所有位置 对于每个位置,计算标记 创建一个新的有序列表 解决方案2 在“位置”表中添加列标记 每次用户添加标记时,我都会计算标记 对于

我正在开发一个排名系统,这是我的问题。假设我的数据库中有如下表:

places : id, name, description
place_marks : id, user_id, place_id, value, comment
当用户对地点进行研究时,我会向他发送一份按rate desc排序的地点列表。实现这一点的最佳方法是什么

解决方案1

  • 获取与名称对应的所有位置
  • 对于每个位置,计算标记
  • 创建一个新的有序列表
  • 解决方案2

  • 在“位置”表中添加列标记
  • 每次用户添加标记时,我都会计算标记
  • 对于搜索,我只需要正确地查询数据库
  • 在解决方案1中,问题可能是性能问题(即使我在查询中计算了标记),在解决方案2中,我如何确保在计算标记时避免冲突

    我在MySQL中使用Play2。
    谢谢你的帮助。

    在解决方案2中,你害怕什么样的冲突?我假设您指的是这样一种可能性,即您正在计算一个标记,同时提供了一个新标记,并且您再次开始相同的计算,其中第二个计算存储在第一个计算之前。换句话说,你没有最新的平均值

    在给出答案之前,我认为你应该让你的代码以最简单的方式工作。只有当你遇到问题时,我才会考虑优化。在您真正从任何优化中获益之前,您将需要大量的标记和访问者(假设为web界面)。以后再优化它是我的建议

    对于答案,我会考虑3种选择。我不知道游戏2,所以我的答案一般

    1) 不必在意:这种变化是相当有限的,只是流量非常高的问题。由于您只计算一个临时值(直到出现新标记),我将忽略这种可能性。下次有人提供分数时,你的统计数据将是正确的。 1a)您可以每晚重新计算平均值,以确保第二天的计算结果正确无误

    2) 确保计算同步。换句话说,确保不同时启动两个计算。有多种选择,因为我不知道播放2,我会参考提供更多信息

    3) 这是最好的方法。由于您期望高流量,您希望确保您能够为客户提供服务。你最不想做的事情就是,比如,把你50%的CPU能量花在计算上。一种选择是让一个单独的进程在后台运行,偶尔检查一下标记表。一旦检测到新标记,它将计算平均值。由于您只有一个进程,因此可以限制它所需的CPU时间和数据库的负载。在高负载期间,您的计算可能有点落后,但一旦负载降低,计算速度就会加快

    如果你真的要去交通拥挤的地方,选择选项3)。根据您的问题,我建议您选择产品1,调查选项2,以了解更多关于信号量,并考虑选项3)作为一个学习练习。
    祝你好运。

    这就是我所说的完整答案,谢谢:)!你是对的,我想我会选择你的第一个解决方案,每晚重新计算平均值的想法非常好。如果我将来遇到问题,我会调查解决方案3。很高兴我能帮上忙。应该补充的是,选项3非常适合执行可能失败且需要重复的操作。我使用它,例如发送电子邮件;如果SMTP服务器关闭,那么我不需要在代码中关心它。我还有一个进程(从cron开始),它获取数据并定期重试。它使您的代码保持干净(主代码只将数据放在dd中)和健壮(在Android/iPhone上推送消息时也使用它)