0

タイトルがはっきりしない場合は申し訳ありません。データベース設計のスキルレベルを考えると、要件が一種の高度なものに該当するため、データベーススキーマを計画する方法について少し混乱しています:)ここで実際にいくつかのヘルプを使用できます。とにかく、ここに行きます...

チームの試合の詳細を追跡する必要があります。簡単にするために、試合の日付、結果、および試合を行ったチームを追跡する必要があるとします。次に、同じ一致の複数のレコードを保持しなくても、関連するすべてのデータが確実に返されるように、テーブルを設計するにはどうすればよいですか。明確に説明しているかどうかわからないので、以下に例を示します。

match_id    team1             team2    result
________    ________    ________     ________
1           Arsenal          Chelsea    5-3
2           Manchester Utd   Arsenal    1-0
3           Liverpool        Newcastle  2-0
4           Arsenal          Everton    1-0

このデータから、アーセナルがプレーした試合のmatch_idsを検索すると、以下の結果、1、2、4が得られるはずです。

さて、私が知っている基本的な設計では、通常、指定されたチーム名で一致するチーム名を検索し、結果を返します。ただし、ここでは、チーム名を2つの異なる列に含めることができ、両方を関連付けることができます。それで、それは私がデザインレベルで決定する必要があるものなのか、それともある種のクエリで実行できるものなのか。

(注:チームをホーム/アウェイとして保存することは、私の要件のオプションではありません)。

4

5 に答える 5

2

両方の列にクエリを実行できますが、問題はありません。

select match_id
from matches
where team1 = 'Arsenal' or team2 = 'Arsenal';

チームを別々のテーブルに配置し、一致テーブルにIDのみを残すことで、このスキーマを正規化することもできますが、それでもそれほど変わらないので、両方の列にクエリを実行する必要があります。データベースの正規化については、SQLブックで説明されています。)。

于 2012-04-20T22:05:38.377 に答える
1

試合ごとに常に2つのチームがある場合は、ここで良い仕事をしたと思います。特定のチームを照会するときは、一方の列またはもう一方の列(SELECT match_id FROM matches WHERE team1 = "?" OR team2 = "?")を検索する必要があります。

ただし、注意点が1つあります。スコアを2つの列に確実に分割します。

match_id  team1           team2      score1  score2
________  ______________  _________  ______  ______
1         Arsenal         Chelsea    5       3
2         Manchester Utd  Arsenal    1       0
3         Liverpool       Newcastle  2       0
4         Arsenal         Everton    1       0

このようにして、必要に応じて、後でスコアを照会できるようになります。(例:Big wins = SELECT match_id FROM matches WHERE ABS(score1 - score2) > 3;

試合ごとに3つ以上のチームが存在する可能性がある場合は、他のオプションをよりスケーラブルにする必要があります。この場合、match_idの一意性の制約を削除し、チーム/スコアの列を2から1に切り取るとよいでしょう。

match_id    team            score
________    ________        ____
1           Arsenal         5
1           Chelsea         3
2           Manchester Utd  1
2           Arsenal         0
3           Liverpool       2
3           Newcastle       0
4           Arsenal         1
4           Everton         1       

そしてもちろん、あなたは間違いなく、これらすべてのものを別々のテーブルに入れる際にセルジオのアドバイスを受けたいと思うでしょう。「チーム」はさまざまな属性(出身地、コーチ名など)を持つ可能性が高く、そのデータを複製する必要はありません。

于 2012-04-20T22:19:50.883 に答える
0

これにより、希望する結果が得られますが、より良いデザインもあるかもしれません。

Select * 
from table 
where (team1 = 'ARSENAL' or Team2 = 'ARSENAL')

Team1Score Team2Scoreなどのスコアを分離することをお勧めします。そうしないと、簡単に計算できません。

于 2012-04-20T22:06:27.340 に答える
0

スターの場合、時間の名前は保存しません。時間を他のテーブルに保存し、linqを使用してIDを使用する方がよいと思います。

次に、列ID、一致ID、チームIDを使用してテーブルを作成し、そのテーブルでチームIDを検索するだけです。

于 2012-04-20T22:12:26.377 に答える
0

このクエリを使用でき、プログラムに問題はありません。

YOUR_FIELD_NAME(team1)='Arsenal'またはYOUR_FIELD_NAME(team2)='Arsenal'であるYOUR_TABLE_NAMEからYOUR_ID_FIELDSを選択します。

exmale(チェルシー)の場合は、YOUR_TABLE_NAMEからYOUR_ID_FIELDSを選択します。YOUR_FIELD_NAME(team1)='チェルシー'またはYOUR_FIELD_NAME(team2)='チェルシー';

于 2012-04-20T22:14:32.790 に答える