2

2 人のプレーヤー (またはチーム) がプレーするゲームを考えてみましょう。結果は両方のプレーヤーのスコアで表されます (例: サッカー)。そのようなゲームの結果をリレーショナル データベースに保存する慣用的な方法はありますか?

私は考えられる 2 つのスキーマを思いつきましたが、いずれも十分に普遍的ではないようです。

1. 1試合につき1列

games列を持つテーブルがありgame_id, winner, loser, winner_points, loser_points、各ゲームはテーブルの 1 つの行に格納されます。

  • この表現は、すべてのゲームを反復する必要がある場合に最適です。
  • プレーヤーの統計を計算するのは難しい (例: プレーヤーの平均ポイント数を計算する)

2. 1 ゲームにつき 2 列

列を持つgamesテーブルがありますgame_id, player, opponent, player_points, opponent_points。各ゲームはテーブルの 2 つの行に格納され、同じgame_id.

  • すべてのゲームを反復することは簡単ではありませんが、それでも簡単です
  • プレーヤーの平均ポイントの計算は簡単ですSELECT AVG(player_points) FROM games WHERE player = some_player
  • 残念ながら、テーブル内のデータは冗長になりました
4

2 に答える 2

5

プレイヤーとゲームの多対多の関係を処理するために、games テーブル、player テーブル、および 3 番目のテーブルを使用した、より優れたリレーショナル モデルを提案します。何かのようなもの:

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

私は間違いなくスコアごとに 1 行 (つまり、ゲームごとに 2 行) を行います。プレイヤーとポイントを保存し、対戦相手のプレイヤー/ポイントが必要な場合は、それを個別に調べます。ほぼ間違いなく、ゲームごとに個別のテーブルを作成し、いつプレイしたかなどについて言及します。

冗長なデータがなく、すべてを簡単に収集できます。

于 2013-06-28T01:31:20.443 に答える