23

これが私を混乱させているものです。私はデータベーステーブルに複合主キーを持っていることがよくあります。このアプローチの悪い面は、エントリを削除または編集するときにかなり余分な作業が必要になることです。しかし、このアプローチはデータベース設計の精神に基づいていると思います。

反対に、複合キーを使用することはなく、テーブルに別の「id」列を導入する友人がいます。他のすべてのキーは単なるFKです。削除および編集手順をコーディングする際の作業ははるかに少なくなります。ただし、データエントリの一意性をどのように保持するかはわかりません。

例:
方法1

create table ProxUsingDept (
    fkProx int references Prox(ProxID) NOT NULL,    
    fkDept int references Department(DeptID) NOT NULL,    
    Value int,    
    PRIMARY KEY(fkProx,fkDept)
)

方法2

create table ProxUsingDept (
        ID int NOT NULL IDENTITY PRIMARY KEY
        fkProx int references Prox(ProxID) NOT NULL,    
        fkDept int references Department(DeptID) NOT NULL,    
        Value int
)

どちらが良いですか?2番目のアプローチを使用することの悪い面は何ですか?助言がありますか?

4

4 に答える 4

29

私は個人的にあなたの2番目のアプローチを好みIDます(そしてそれをほぼ100%使用します)-代理フィールドを導入します。

なんで?

  • テーブルを参照するテーブルの作業が大幅に楽になります-JOIN条件は、ID列が1つだけの場合(常に結合する必要のある2、3、またはそれ以上の列ではなく)、はるかに単純です。

  • テーブルを参照するテーブルはID、外部キーフィールドとして単一の列を保持するだけでよく、複合キーの複数の列を保持する必要がないため、作業が大幅に楽になります。

  • データベースが(を使用して)一意のID列の作成を処理できるため、作業が大幅に楽になりますINT IDENTITY

ただし、データエントリの一意性をどのように保持するかはわかりません。

非常に簡単です。主キーとして使用する複合列にUNIQUEINDEXを配置します。

CREATE UNIQUE INDEX UIX_WhateverNameYouWant 
   ON dbo.ProxUsingDept(fkProx, fkDept)

今、あなたのテーブルはあなたのテーブルに重複するペアが決してないことを保証(fkProx, fkDept)します-問題は解決しました!

于 2011-01-19T15:54:28.347 に答える
18

次の質問をします。

ただし、データエントリの一意性をどのように保持するかはわかりません。

一意性を維持するには、本来の主キーを形成する列に個別の複合UNIQUEインデックスを宣言します。

どちらが良いですか?

人によって意見は異なり、時には強く抱かれます。より多くの人が代理整数キーを使用していることがわかると思います(それが「正しい」解決策になるわけではありません)。

2番目のアプローチを使用することの悪い面は何ですか?

代理キーを使用することの欠点は次のとおりです。

  1. 自然主キーの一意性を維持するには、追加のインデックスが必要です。

  2. 必要な結果を得るためにデータを選択するときに、追加のJOINが必要になる場合があります(これは、複合自然キーの列のみを使用してクエリの要件を満たすことができる場合に発生します。この場合、JOINではなく外部キー列を使用できます。元のテーブルに戻ります)。

于 2011-01-19T15:57:07.237 に答える
0

M:N結合テーブルのように、複合キーが最も理にかなっている場合があります(そして、性質またはM:Nリンクが変更された場合は、とにかくこのテーブルを作り直す必要があります)。

于 2011-01-19T15:55:24.533 に答える
-3

この投稿が行われてから非常に長い時間がかかることを私は知っています。しかし、私は複合キーに関して同様の状況に遭遇しなければならなかったので、私は自分の考えを投稿しています。

2つのテーブルT1とT2があるとしましょう。

T1には列C1とC2があります。

T2にはC1、C2、C3の列があります

C1とC2は、テーブルT1の複合主キーとテーブルT2の外部キーです。

テーブルT1に代理キー(T1_ID)を使用し、それをテーブルT2の外部キーとして使用したと仮定します。テーブルT1のC1とC2の値が変更された場合、表T1で値が変更されていない、表T1の代理キーのみを確認しているため、表T2。これは、2番目のアプローチの1つの問題である可能性があります。

于 2013-04-29T19:58:45.800 に答える