現在、フットボール データベースには次の 3 つのテーブルがあります。
チーム(名前) 季節(名前、始まり、終わり) ゲーム(ID、日付、シーズン、ホームチーム、アウェイチーム、ホームチームスコア、アウェイチームスコア) (ホームチーム、アウェイチーム、シーズンは外部キーです)
ここで、各チームの得点と失点、および各シーズンで獲得したポイント (引き分けごとに 1 ポイント、勝利ごとに 3 ポイント) を記録する新しいテーブルを作成したいと思います。これによりランキングが取得しやすくなります。
次のようなテーブルを作成することを検討しました。
統計(シーズン、チーム、得点、失点、ポイント)
そして、新しい一致が挿入されるたびに、このテーブルも更新します。このテーブルには、各チームのシーズンの組み合わせが 1 行含まれます。冗長性を導入していることはわかっているので、これが最適な解決策かどうかはわかりませんが、この情報は頻繁に計算する必要があるため、役立つかもしれないと思いました。この情報を更新するトリガーを作成したいのですが、その方法がよくわかりません。どのチームが試合に参加しているかに応じて、統計テーブルの 2 つの行を更新する必要があります。ホームでもアウェーでも、別の値で更新する必要があります。
理想的には、チームがゲームが属するシーズンのレコードを挿入していない場合、このトリガーはこの新しいテーブルにエントリを作成するはずですが、そのような条件が MySQL で可能かどうかさえわかりません。 私が行ったことのテストを提供していないことはわかっていますが、それは、オンラインで同様のリクエスト (より一般的には、必要な情報を簡単にクエリできるリクエスト) が実際には見つからなかったからです。
また、この状況に対処する方法についてのより良いアイデアも歓迎します。
次のような構造を検討する必要があると思います:
リーリーこの構造も最適ではありません。 私の個人的な意見では、より良い構造を使用することもできます:
リーリーGoal テーブルはすべてのゴールを記録するために使用され、「HomeTeamScore」フィールドと「AwayTeamScore」フィールドの使用を避けて、そこから試合結果を構築できます。
統計テーブルに関しては、誰がポイントを獲得したかを知る必要があるため、最終的なテーブル構造にこだわりましょう:
リーリーMatches のステータス フィールドの値は次のとおりです: ['1','X','2']
これにより、たとえば ID 12 のチームなど、統計を計算するためのすべてを簡単に入手できます。 リーリー
これを開始点として使用して、group by 関数と group 関数を使用してチーム統計を計算する、もう少し複雑なクエリを構築できます。 このようなクエリを正常に作成したら、Viewsを使用することをお勧めします。
ちなみに、実行したいクエリは重くないので、必ずしもトリガーが必要なわけではありません。最初にデータベースの設計を検討してください。トリガーを使用して冗長データを維持するよりもはるかに簡単な方法は、ビューを使用することです。これは単なる基本的な和集合の合計です:
リーリー