1

得点とその得点を追跡する必要があります。以前は、次のようなフラットファイルデータベース(これは混乱していました)を使用してこれを行いました。

03611100025
00001000000
21011000000
00003000000
00021000000
10001050000
00001402000
00001000100
00001013050
00001000100
00001000000

各チームには行と列があり、全体が一種のグラフになっていると思います。これはMySQLでも実行できますが、肥大化し、各行に不条理な数の列を強制することになります。

私はこれを行うための他の劇的に簡単な方法を見逃しているに違いないと感じています。誰かが手を貸すことができますか?

4

2 に答える 2

5

チームとゲームの2つのテーブルがあります。ここで、チームにはチーム名とチームIDがあり、ゲームには2つのチームID(チーム1とチーム2)とゲームのスコアがあります。次に、ゲームテーブルとチームテーブルの間に(整合性のための)外部キーがあります。これは、最小限のスキーマと非常に単純な構造で、誰が誰をプレイし、スコアが何であったかを反映します。

Team
|-------------------------|
| Primary (int)| id       |
|         (chr)| name     |
|-------------------------|

Game
|-------------------------|
| Primary (int)| team1    |
| Primary (int)| team2    |
|         (int)| score1   |
|         (int)| score2   |
|-------------------------|

したがって、いくつかのサンプルデータは次のようになります。

Team
|------------------|
| id | name        |
|------------------|
|  1 | Blue Devils |
|  2 | Cardinals   |
|  3 | Fish        |
|  4 | Lemmings    |
|------------------|

Game
|---------------------------------|
| team1 | team2 | score1 | score2 |
|---------------------------------|
|     1 |     2 |      7 |      8 |
|     1 |     4 |      2 |     25 |
|     2 |     3 |      8 |      2 |
|     3 |     4 |     17 |     18 |
|---------------------------------|

このデータは、チーム1(Blue Devils)がチーム2(Cardinals)を7から8のスコアでプレーしたことを示しています。残りのデータも同様です。

チーム名を追跡する必要がない場合は、そのフィールドを省略できますが、これは多くの場合有用な情報です。

したがって、このスキーマを使用すると、次のようなクエリで特定のチームのスコアを取得できます。

SELECT * FROM Game g 
 INNER JOIN Team t on t.team1 = g.id

その後、必要に応じて、ゲームがいつ行われたか(日付)などの追加情報や、ゲームやチームに関するその他の統計などの他の情報を追加することもできます。

于 2010-01-13T17:35:42.517 に答える
1

最初の応答は正しいです。データをリレーションに整理し、リレーションごとに 1 つのテーブルを作成すると、データの操作がはるかに簡単になります。これについては、リレーショナル データベース設計で行う必要のある背景学習で詳しく説明します。

応答からチームとゲームの構造を使用する場合でも、その構造を質問で想像した種類の構造に変換できます。このプロセスは「クロス集計」または「ピボット」と呼ばれ、チュートリアルで詳しく説明されています。

リレーショナル構造からクロス集計構造に移行するのは簡単ですが、その逆は非常に困難です。クロス集計データに対して他のクエリを作成することも困難です。例として、各チームに対して獲得された最高得点を見つけることができます。データをデータベースに入れると、遅かれ早かれ、それを使って複数のことをしたくなるでしょう。

于 2010-01-14T13:28:05.697 に答える