【问题标题】:Database design regarding calculating an average score关于计算平均分的数据库设计
【发布时间】:2014-05-02 03:56:17
【问题描述】:

我有一个看起来像这样的数据库:

这是一个旨在跟踪游戏中玩家的数据库。在游戏中,玩家对每个事件都有一个分数。每个玩家可以在每个事件中获得多个分数。您可以将事件视为一天。

我想跟踪他们的胜利、失败和技巧。技能被定义为他们当天玩的所有游戏的平均得分以及与所有玩家平均得分的差值。 IE,一个玩家的平均得分是305,但是所有玩家的平均得分是300,所以他的技能是+5。此外,所有玩家的平均值应该只被加权一次,所以一个玩了 100 场游戏的玩家与一个玩了 1 场游戏的玩家的平均权重不会更高。

我的问题是,实现这一目标的最佳方法是什么?游戏的结果一次添加一个,我目前正在使用触发器更新赢/输。我不确定尝试使用 DBMS 完成我的平均技能计算是否明智,因为在每次插入之间它必须再次计算所有内容。我的程序每秒大约执行 1-2 次插入。

从这个数据库中检索速度非常重要,所以我宁愿让插入更慢,而不是每次检索时都要计算这个信息,如果它在那个方法中很慢的话。

【问题讨论】:

  • 您是否需要在新插入上重新计算 everything 以获得所需的检索性能?我想重新计算单个球员的平均水平很快,重新计算整体平均水平很快,但是在赛事中更新每个球员的技能很慢。你能简单地生成检索技能,每行一个减法,而不是存储它并不断更新它吗?

标签: mysql database


【解决方案1】:

我的处理方式是在中间。我将构建一个每分钟或每几分钟运行一次的存储过程。然后,在插入时,我会将该玩家的姓名添加到队列中,除非他们已经存在于该队列中。当存储过程运行时,它从队列中提取名称,并处理它们的数据,在开始汇总之前将它们从队列中删除(因此,如果在汇总期间插入了一条记录,它会强制进行另一个计算以确保没有遗漏任何内容)。这提高了性能,因为您消除了许多重复项,但保持了不错的精度,因为您每隔几分钟运行一次,所以您准确到那个时间段。

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多