3

チームとゲームの 2 つのデータベース テーブルがあります。

この質問の目的のために、私たちはフットボール (サッカー) チームとゲームを扱っています。

各ゲームには正確に 2 つのチームがあり、通常はホーム チームとアウェー チームですが、場合によっては両方のチームがニュートラルになることもあります。

私の質問は、Games テーブル (home_team_id、away_team_id) で 2 つの外部キーを使用してこのデータ関係を表す必要があるかどうか、または games_teams テーブルとの多対多関係を使用して 2 つをリンクする必要があるかどうかです。チームがホームチームかアウェイチームかを保存することも少しやり過ぎのようです。

混乱を招くために、私は KohanaPHP で ORM ライブラリを使用しています。これらは、fk が team_id と呼ばれるか、リンク テーブルが 2 つの列のみを含むことを期待します。KohanaPHP でこの問題を経験したことがある場合は、返信を残してください。それ以外の一般的なアドバイスも大歓迎です。

4

7 に答える 7

9

2 つの列を使用するだけです。それ以外の場合は、ジョイナー テーブルで修飾する必要があります。これは睡眠時限爆弾ではなく、ある日突然、本当の多対多が必要であることに気付くでしょう。

于 2009-11-04T16:06:09.187 に答える
6

私の意見では、ここでは2列が完全に適切です。どのゲームにも 2 つのチームしか存在できない可能性があるという事実は、2 つの列を持つことでデータベース スキーマに反映されます。リンク テーブルを導入することで、1 つのゲームに 2 つのホーム チームと 2 つのアウェー チームが存在する可能性が生じ、このシナリオが発生しないようにするために追加の検証が必要になります。物事を 2 つの列に分離することで、スキーマは本質的にデータの整合性を強化します。

于 2009-11-04T16:07:31.033 に答える
3

データベースサーバーに「Xth Normal Form」バッジをピン留めできるようにしたい場合は、おそらく多対多として扱う必要があります。有用なデータが必要になるたびに参加するだけです。

于 2009-11-04T16:05:56.870 に答える
2

正規化に関して: はい。1 つ以上の 1 対多の関係に分解されるのは、1 対多または多対多のみです。

でも、現実的に言えば、GENDERみたいなのを救うとしたら。これにマルチステートと日時スタンプが本当に必要ですか?

驚くべき答えは「はい」ですが、ビジネス上の理由で性別の変化を追跡する必要がある場合に限ります。ほとんどの実用的な目的では、答えは「いいえ」です。

2 つのキーを持つ 1 つのテーブルを保持しますが、それを追跡するビジネス上の理由がない限りです。

于 2009-11-04T16:08:15.423 に答える
1

どのように抽象化したかにもよりますが、サッカー ゲームには 2 つのチームが必要であると言えます。

チーム ID が Game の主キーの自然な部分であると想像することさえできます。

于 2009-11-04T16:19:20.180 に答える
1

2つの列を使用することが最良の選択であるという他の回答を尊重しますが、KohanaでORMライブラリを使用していると述べています。games テーブルで 2 つの列を使用すると、多対多の関係の ORM 機能が失われます。games_teams ピボット テーブルを設定すると、次のことが可能になります。

$game = ORM::factory('game', 1); // 1 is the game id

次に、そのゲームのチームをループできます。

foreach ($game->teams as $team) {
// do stuff with $team
}
于 2009-11-11T20:00:07.097 に答える