1

MySQL を使用して、ユーザーのテーブル、試合のテーブル (実際の結果で更新)、users_picks というテーブルがあります (現在、リーグは 1 つしかないため、最初は常に、ゲームウィークごとにリーグごとに 10 試合になります。しかし最終的にはさらに多くのリーグが登場し、そのうちのいくつかはゲームウィークあたり 8 試合しかありません)。

users_picks テーブルでは、各「ピック」(ピックとは「ホームチームのスコア」と「アウェイチームのスコア」の両方を意味します) を別の行に格納する必要がありますか、それとも 10 個すべてのピックを 1 つの行に格納する必要がありますか? user と gameweek の両方に FK があります。すべてのピックが 1 つの行にあるということは、次のような数字が追加された列があることを意味します。

Option 1: [pick_id, user_id, league_id, gameweek_id, match1_hometeam_score, match1_awayteam_score, match2_hometeam_score, match2_awayteam_score ... etc]

そして、そのオプションは私を喜びで満たすわけではなく、少しばかげているように見えます. 特に、データベースには多くの潜在的な NULL が存在するためです。2 番目のオプションは、最終的に数百万行を意味します。しかし、次のようになります。

Option 2: [pick_id, user_id, league_id, gameweek_id, match_id, hometeam_score, awayteam_score]

ベストプラクティスは何ですか? そして、2 番目のオプションを使用してあらゆる種類の統計を行うのは PITA でしょうか? 例えば。ユーザーが特定のラウンドで正確にヒットした試合の数、通算で正確なヒット数などを計算します。

あまり意味がわからない場合は、何でも詳しく説明しようとします。テーブルのデザインが最初からうまくいきたくないので、数か月で大きな頭痛の種になることはありません.

前もって感謝します。

4

3 に答える 3

3

2 番目の選択肢は、最初の選択肢よりもはるかに優れています。これはデータベースの正規化と呼ばれ、クエリを難しくするのではなく、簡単にします。リンクされた記事と、さまざまな「正規形」の関連する説明を読み、少なくとも第 3 正規形のデータ構造を目指すことをお勧めします。

最初のオプションの欠陥を確認するには、後で 11 試合の新しいリーグが含まれる場合を想像してください。または400。

于 2012-09-26T12:22:50.177 に答える
1

データベースの正規化について読む必要があります。

1 対 n の関係がある場合、たとえば 1 つのチームが多くの試合を行う場合のように、2 つのテーブルを作成します。1 つのテーブルは「teams」、2 つ目のテーブルは「matches」です。各行には、試合を行ったチームの ID が含まれています。

同様に、ユーザー、ピック、およびリーグ用に個別のテーブルも用意する必要があります。

于 2012-09-26T12:25:06.957 に答える
1

オプション 2 は、テーブルが適切に INDEX されていれば、(ご指摘のとおり) 非常に大きくなるため、より優れています。はpick_id主キーですが、フィールドに INDEX も作成しuser_idます。最も一般的なクエリは

SELECT * FROM `users_pics` WHERE `user_id`=?;

特定のユーザーのすべてのピックを取得します。

于 2012-09-26T12:26:37.083 に答える