在数据库中表示梯形图的最佳方法

时间:2015-11-10 15:19:41

标签: algorithm sorting database-design

我需要在网站上代表以前保存在excel表格中的梯形图结果。

梯子上的球员没有得分。如果玩家A击败玩家B,玩家A将被放置在玩家B的上方。

我的问题如下: 假设我有5名球员,排名如下:

  1. 玩家1
  2. 播放器2
  3. 玩家3
  4. Player 4
  5. Player 5
  6. 如果玩家5击败玩家1,则玩家5现在移动到梯子顶部。如果玩家订单是根据排名编号决定的,我必须更新那些实际玩过的人之间所有玩家的排名,这对我来说是错误的。

    我知道为每个玩家分配分数,如果玩家A击败玩家B然后玩家A获得玩家B的分数+ 1,则排名按降序分数。这种情况相当好,直到玩家最终得分相同。我也可以通过在数据库中添加“LastUpdated”字段来解决这个问题,因此上次更新的任何分数都低于另一个(LastUpdated播放器实际上没有在同一分数上击败该播放器,它们只是向上移动)。然后,当一个人在同一天进行多次调整时,这将失败,因此多个玩家最终得到相同的分数,排名顺序完全取决于哪个玩家最后更新。这是一个问题,因为管理员需要能够自由地上下移动玩家。这也使得无法在具有相同分数的玩家之间添加玩家(获胜玩家必须跳过整个组)。

    我的最后一招是从数据库中获取当前排名顺序,将其全部放入表中,允许管理员随意移动玩家,然后进行单一保存操作,以获得当前所有排名球员并更新每个人。这听起来非常糟糕。

    梯子上大约有160名玩家,因此操作不会特别冗长,只是听起来不对。

    那么,更改排名顺序并将其保存在数据库中的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您的数据库支持精确的数字数据类型,可以通过将排名列精确数字来轻松解决 然后,当玩家5击败玩家2时,你所要做的就是在玩家2和玩家1之间设置玩家5的等级。因为它是一个精确的数字,你的限制是所选数据类型的精度限制。

示例数据:

id    name       rank
1.    Player 1   1.0  
2.    Player 2   2.0  
3.    Player 3   3.0  
4.    Player 4   4.0
5.    Player 5   5.0

现在玩家5击败了玩家2.所以你所要做的就是将它的等级设置为1.5,这是玩家2的等级之间的第一等级然后高于玩家2和#39 ; S。 如果玩家4击败玩家1,我会将其排名设为0.5,因为玩家1没有排名更高。