在MySQL中保存排名

时间:2013-04-19 11:53:46

标签: mysql sql ranking

我计划每天计算一次区域和全球排名。将有多个排名,每个排名基于评级或统计数据。

保存这些球员排名的最佳方法是什么?为每个单独的stat创建一个表更好,每行包含playerID,区域排名和全局排名,还是创建一个包含大量列的单个排名表?第二个选项会导致某些行具有空列,因为播放器可能没有该特定的统计信息。

此外,保存每日排名的最有效方法是能够创建一个能够显示玩家进度的图表吗?如果我决定不创建图表,我将在创建新图表之前删除表格。

3 个答案:

答案 0 :(得分:0)

只需在playerId和date上创建一个包含主键的表,并为每个stat添加一列。然后你可以轻松地分析那张桌子上的任何东西。

答案 1 :(得分:0)

或者,您可以创建两个表: 1-排名表(player_id,date,rank_id,rank) 2- Ranking_type(rank_id,description)

它与上一个答案基本相同,但您可以添加或删除排名类型而无需更改排名表,这取决于您的应用程序的动态程度

答案 2 :(得分:0)

问题在于如何使用数据以及性能要求。

如果您的情况几乎所有玩家都拥有几乎所有的统计数据且您的应用程序同时使用所有统计数据,那么从性能角度来看,这是一个明智的选择。您希望将它们存储在单个表中,因此不会产生每个统计数据额外“playerid”的开销,以及将数据组合在一起所需的连接。

在另一个极端,如果大多数统计数据都是空的并且应用程序一次只使用一个统计数据,那么单个表“playerid”,“statid”,“value”是一个很好的方法。

第二种方法是实体 - 属性 - 值(EAV)模型的一个示例,在您需要添加新统计信息时也非常有用。但是,您希望每天重新创建一次所有值,并且不提及历史要求。在您的情况下,这种好处并不明显。

将单独的值存储在单独的表中的选项可能不是最好的方法,特别是如果所有统计信息具有相同的表示(即一个数字)。增殖表通常是一个坏主意。一个例外与访问控制有关。如果您对每个统计信息都有单独的安全要求,那么将它们存储在单独的表中可能会使安全性更容易实现。

根据你所说的话,我会选择每个玩家的非行列式,一行,并且有很多统计数据。你可能想看看玩家的样子,数据就在那里,没有额外的处理,除非你有很多玩家或很多很多统计数据。