複合主キー(このテーブルは2つのエンティティ[2つのテーブル]を表す2つのテーブル間の関係を維持します)を持つ代わりに、identity
主キーとして列を持つように設計が提案され、一意のデータ制約が2つの列に適用されます。エンティティの主キーからのデータ。
私にとって、関係テーブルごとにID列があると、正規化ルールに違反します。
- 業界標準とは何ですか?
- これについて設計を決定する前に考慮すべきことは何ですか?
- どちらのアプローチが正しいですか?
複合主キー(このテーブルは2つのエンティティ[2つのテーブル]を表す2つのテーブル間の関係を維持します)を持つ代わりに、identity
主キーとして列を持つように設計が提案され、一意のデータ制約が2つの列に適用されます。エンティティの主キーからのデータ。
私にとって、関係テーブルごとにID列があると、正規化ルールに違反します。
主キーとしてID列を使用したいテーブルはたくさんあります。ただし、説明するM:M関係テーブルの場合、ベストプラクティスは、主キーに新しいID列を使用しないことです。
コメント内のRThomasのリンクは、ベストプラクティスがID列を追加しないことであるという優れた理由を提供します。これがそのリンクです。
短所はほとんどすべての場合に長所を上回りますが、長所と短所を求めたので、私はいくつかのありそうもない長所も入れました。
短所
複雑さを追加します
関係に一意性を強制しない限り、関係が重複する可能性があります(主キーがデフォルトで実行します)。
おそらく遅い:dbは1つではなく2つのインデックスを維持する必要があります。
長所
すべてのプロはかなり大ざっぱです
リレーションシップテーブルの主キーを別のテーブル(監査テーブルなど)への結合として使用する必要がある状況では、結合が高速になる可能性があります。(ただし、前述のように、レコードの追加と削除は遅くなる可能性があります。さらに、リレーションシップテーブル自体が一意のIDを使用するテーブル間のリレーションシップである場合、結合で1つのID列を使用することによる速度の向上は最小限に抑えられます。)
アプリケーションは、簡単にするために、動作するすべてのテーブルが主キーとして一意のIDを持っていると想定する場合があります。(これはアプリの設計が貧弱ですが、制御できない場合があります。)このようなアプリに余分な複雑さを導入するよりも、DBに余分な複雑さを導入する方がよいシナリオを想像できます。
外部キーとして使用される場合は常に、各テーブルにすべての列を作成する必要があります。これが最大の欠点です。
短所:
長所: