2

让我们有一场由两名球员(或球队)进行的比赛,结果由两名球员的得分表示(例如足球)。是否有一种惯用的方式将此类游戏的结果存储在关系数据库中?

我想出了两种可能的模式,但似乎都不够通用。

1. 每场一排

games将有一个带有列的表格,game_id, winner, loser, winner_points, loser_points每个游戏将存储在表格的一行中。

  • 当需要遍历所有游戏时,这种表示非常有用。
  • 计算球员的统计数据很困难(例如计算球员的平均得分)

2. 每场比赛两排

会有一个games带有列的表game_id, player, opponent, player_points, opponent_points。每个游戏将存储在表的两行中,并且它们将具有相同的game_id.

  • 遍历所有游戏并非易事,但仍然很容易
  • 计算球员的平均分很简单SELECT AVG(player_points) FROM games WHERE player = some_player
  • 不幸的是,表中的数据现在是多余的
4

2 回答 2

5

我会建议一个更好的关系模型,其中包含一个游戏表、一个玩家表和第三个表来处理玩家与游戏的多对多关系。就像是:

game( game_id, date, description, .... )
player( player_id, name, .... )
player_game( player_id, game_id, score )

现在您有了一个非常灵活的规范化(非冗余等)模式。

要找到游戏的获胜者,您可以:

select max(score), player_id from player_game where game_id = 'somegame'

要查找玩家的总分,您可以:

select sum(score) from player_game where player_id = 'someplayer'

等等...

于 2013-06-28T01:38:31.633 回答
0

我肯定会在每个分数上做一排(即每场比赛两排)。我会存储球员和分数,如果我想要对手球员/分数,我会单独查找。我几乎可以肯定每场比赛都有一个单独的表格,其中会提到比赛时间等内容

没有多余的数据,一切都很容易收集等。

于 2013-06-28T01:31:20.443 回答