【问题标题】:Database advice for counting wins/losses between players用于计算玩家之间赢/输的数据库建议
【发布时间】:2013-06-16 01:43:06
【问题描述】:

从数据库中跟踪所有玩家之间的分数的最佳方法是什么?一个玩家对另一个玩家赢/输了多少次。

我想到了一个 duel 表,其中有 3 个列:duel_idwinner_idloser_id,但我相信有更好的方法来做到这一点,避免冗余。

编辑:我很抱歉不够清楚。玩家实际上是从user 表中随机挑选的。我需要知道谁赢/输了谁。我不太喜欢我的解决方案的原因是因为在进行统计时,必须扫描整个duel 表才能返回两个玩家之间的输赢数量。

【问题讨论】:

  • 我看不出关联数组(这就是你的决斗表本质上是什么)是多余的。但我想说“最好”不是一个通用术语,它取决于您的要求。

标签: database redundancy


【解决方案1】:

表有自己的id、两个外键 - player1_idplayer2_id,以及用于获胜的两列wins_player1wins_player2

--------------------------------
| id | p1_id | p2_id | w1 | w2 |
--------------------------------
| 1  |   1   |   2   |  2 |  0 |
--------------------------------
| 2  |   1   |   3   |  1 |  1 |
--------------------------------
| ...|       |       |    |    |
--------------------------------

这样,当两个玩家玩游戏时,您无需在表中插入新元组,您只需更新他们的分数。

例如,如果玩家 1 和 2 玩,玩家 1 赢了,你会这样做:

UPDATE scores WHERE p1_id = 1 AND p2_id = 2 SET w1 = w1 + 1;

【讨论】:

  • 这很有趣,您是否也可以使用ON DUPLICATE 这个方法直接查询来完成这一切?
  • 我相信你能做到。不确定ON DUPLICATE 是否适用于外键
  • 我实际上也考虑过这个解决方案。这将需要在每场比赛后检查两个玩家的元组是否存在以及获胜者的 id 是否为p1_idp2_id。我会考虑的!
  • 好吧,为了避免检查,您可以考虑一个经验法则:让 p1_id 始终保存较小的玩家 id。
【解决方案2】:

如果您不介意不知道谁与谁决斗,您可以在您的用户数据表中放置一个 total_wins 列,并在每次比赛后为每个用户增加它。

它的优点是不占用太多空间。

但是,如果您有一个相当大的应用程序,您的数据库可能会因如此多的查询和写入而锁定

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2016-01-06
    • 2019-09-17
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多