2

私はASP.NETとEntity Frameworkを使ってウェブサイトを作っています。私は現在、ユーザーとサッカーチームとの間の多対多の関係のためのマップテーブルを持っています。だから、:外部キーにも使用されるマップテーブルにコンポジットキーを使用する必要がありますか?

ユーザー
チーム
UserTeams

パート1:それはマップテーブルの主キーのための複合キーを使用することをお勧めはありますか?

UserTeamsテーブル
PKユーザーID
PK TeamId
PreferenceId

パート2:他の言葉での注意点は、私はまた、別のテーブルを持っているということです。それを "UserTeamPredictions"と呼ぶことにしましょう。このUserTeamPredictionsは、各チームのユーザーの予測を毎年保存します。そのテーブルには、マップテーブルを指す外部キーがあります。これは、エンティティで正常に動作するようです

UserTeamPredictionsテーブル
PK UserTeamPredictionId
FKユーザーID
FK TeamId
予測 PredictionYear

:だから、次のようになりますフレームワーク、しかし、私は関係を参照するときにいくつかの問題がありました私がTelerikのように使用するサードパーティのコントロールでps。理想的なデータ設定ではないかもしれませんが、データバインディングなどのコードで作業しやすいように、テーブルの構造や関係を変更する必要がありますか?

それが現在そうであるよう変化が複合キーを介して代わりに、直接キーを参照するUserTeamPredictionsテーブルを可能にUserTeamsマップテーブルに整数主キーを追加することであろう。

UserTeamsテーブルを
PK UserTeamId
FKユーザーID
FK TeamId
PreferenceId

UserTeamPredictionsテーブル
PK UserTeamPredictionId
FK UserTeamId
予測 PredictionYear

あなたはどう思いますか!?

答えて

2

私は選択しません。代理キーを使用し、UserIdとTeamIdの列に一意のインデックスを付けます。 3つ以上のコンポジットキーが混在している場合は、コンポジットキーが本当にうんざりします。コンポジットキーとサロゲートキーが混在しているのではなく、可能な限り、すべてのサロゲート、無意味なオートインクリメントキーを使用します。

これは、ジョインで良好なパフォーマンスが得られるという特典があり、スキーマを参照することなく、指定したテーブル(テーブル名+ ID)のキーを常に知っていることを意味します。一部のORMツールは、コンポジットキーではなく単一の列でも正しく動作します。

+0

私はサロゲートを使用するように切り替えましたが、それまでは正常に動作しています。ありがとう。 –

4

変更する必要があります。 「自然キー」に関する議論のためにスタックオーバーフローを検索します。特に、エンティティ生成を使用する場合は、サロゲートキーが優れていることがほぼ全面的に合意されています。ナチュラルキーまたはコンポジットキーはではありません。はエンティティフレームワークスタイルのDALレイヤで一般的によく機能します。たとえば、LightspeedとSubsonicはどちらも、PKとして単一の一意の列を持っていることを要求しています...現在のバージョンのLightspeedは、次のバージョンを変更する予定であるにもかかわらず、列が "Id"

+0

入力いただきありがとうございます! –

関連する問題