【问题标题】:using a relational database to store results from head-to-head(-to-head) gaming使用关系数据库存储头对头(对头)游戏的结果
【发布时间】:2011-06-13 23:29:59
【问题描述】:

我有一个人们记录游戏结果的网站。 95% 的游戏是单人玩的,但有 5% 的游戏没有脱离每个场景的双赢统计数据。

每场战斗有2个阵营,所有可能的结果是:

  • 第一方获胜
  • 第二方获胜

如果 2 个人互相比赛,并且都记录了一场比赛,那么在应该只有一方的情况下,你会为​​给定一方赢得 2 场胜利(有意义吗?)并且它会破坏平衡评级。当需要显示战斗的统计数据时,这些记录应该被合并。

我最初的计划是对 PHP 进行编程,以使 相同的播放日期 + 相同的结果 = 仅分组为一个结果,但是随着用户群的增长(人们在同一天玩并获得偶然的相同结果)变得更加频繁。

随着我的编程能力提高,我觉得已经准备好去除杂物并用适当的面对面处理程序替换它,但是在提出可接受的数据库结构时遇到了麻烦。

目前,所有记录都存储在一个表中,battle_results,其结构如下:

[play_id] [user_id] [battle_id] [play_date] [win_side]
  000001    007       DeRa001    2010-01-01     1
  000002    010       DeRa001    2010-01-01     1

我想让我的用户能够列出这是单人游戏还是面对面游戏,以及他们在玩哪一边,所以我打算像这样修改表格:

[play_id] [user_id] [battle_id] [play_date] [win_side] [play_type] [user_side]
  000001    007       DeRa001    2010-01-01    1           multi        2
  000002    010       DeRa001    2010-01-01    1           multi        1

这很容易。但是用户需要能够说出他们在和谁一起玩。起初我认为多对多表可以解决问题:

[play_id] [user_id] [opponent_id]
  00001     007        010

但后来我意识到,当对手提交相同的记录时,你只是在反转列:

[play_id] [user_id] [opponent_id]
  00001     007        010
  00002     010        007

我真的不知道如何提取这些数据并构建一个可以识别出这些人都在一起玩的胜率胜率......

我说得有道理吗?我如何匹配这些记录?

【问题讨论】:

    标签: php mysql database-design statistics many-to-many


    【解决方案1】:

    我会做的略有不同。

    我假设您有一张桌子battle,并且对于每场战斗,可以有两个人一起玩的多个游戏。

    battle_results 将包含:

    play_id Battle_id play_date play_type 1 DeRa001 2011-01-01 多

    现在您需要一个新表 participants,其中列出了每场比赛的参与者:

    play_id user_id is_winner 位置 1 007 0 侧 1 1 010 1 侧 2

    该表将以 (play_id, user_id) 作为主键,因此同一用户不能为同一播放播放两次(这解决了相同的组合可以以不同的“方向”插入两次的问题。请注意,play_id 对于单个播放是唯一的。因此,您将始终有两行具有相同的 play_id。

    编辑:您可以通过将 is_winner 设置为 0 来表示所有参与者的平局。

    要找出特定用户(例如 007)与谁一起玩很简单:

    选择用户 ID 来自参与者 在哪里 play_id (选择 p2.play_id 来自参与者 p2 其中 p2.user_id = '007')

    要查找用户的总获胜次数:

    选择计数(*) 来自参与者 WHERE user_id = '007' AND is_winner = 1

    要找到赢/输比:

    选择 total_loss / total_wins 从 ( 选择用户 ID, count(CASE WHEN is_winner = 0 THEN 1 ELSE NULL) 作为total_loss, count(CASE WHEN is_winner = 1 THEN 1 ELSE NULL) as total_wins 来自参与者 ) T WHERE user_id = '007'

    【讨论】:

      【解决方案2】:

      这样存储数据有什么问题:

      [battle_id] [opponent_1] [opponent_2] [result_1] [result_2]
          1            007         010          1          0
          2            011         007          0          1
          3            007         012          0          0
      

      寻找007 玩家获胜(结果为2):

      select count(*) from battles 
      where 
         (opponent_1 = '007' AND result_1 = 1 and result_2 = 0) 
         OR 
         (opponent_2 = '007' AND result_1 = 0 and result_2 = 1)
      

      寻找玩家007 抽签(结果为1):

      select count(*) from battles 
      where 
           (opponent_1 = '007' AND result_1 = 0 and result_2 = 0) 
           OR 
           (opponent_2 = '007' AND result_1 = 0 and result_2 = 0)
      

      等等

      【讨论】:

      • 2 个问题 - 对手的数量各不相同,而我的困难在于寻找特定战斗的结果,并尝试合并玩家一起玩的记录(多个站点记录 = 1 个真实世界的游戏) ...这就是我的问题的症结
      • 啊.. 没有注意到超过 2 名玩家的要求。这将不起作用:(
      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2016-01-16
      相关资源
      最近更新 更多