两人游戏的数据库架构

msc*_*cky 2 sql database-schema

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

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

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
  • 不幸的是,表中的数据现在是多余的

bit*_*ler 5

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

game( game_id, date, description, .... )
player( player_id, name, .... )
player_game( player_id, game_id, score )
Run Code Online (Sandbox Code Playgroud)

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

要找到他的游戏赢家,您可以:

select max(score), player_id from player_game where game_id = 'somegame'
Run Code Online (Sandbox Code Playgroud)

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

select sum(score) from player_game where player_id = 'someplayer'
Run Code Online (Sandbox Code Playgroud)

等等...