2013-06-28 71 views
1

让我们玩两个玩家(或团队)玩的游戏,其中结果由两个玩家(例如足球)的分数表示。在关系数据库中存储这种游戏的结果是否有一种惯用的方式?双人游戏的数据库模式

我想出了两个可能的模式,其中没有一个似乎足够普遍。每场

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

回答

4

我建议有更好的关系模型游戏桌,玩家桌和第三张桌,以处理玩家与游戏之间的多对多关系。例如:

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 where player_id = 'someplayer' 

等等...

0

我肯定会每个分数做一行(即每场2行)。我会存储玩家和分数,如果我想要对手的玩家/分数,我会分别查看。我几乎肯定会为每个游戏一个单独的表,这将提东西,当它被打得像等

没有冗余的数据,一切都容易聚集等