2011-01-19 12 views
17

私は何を混乱させるのですか?私はしばしば、データベーステーブルに複合主キーを持っています。そのアプローチの悪い点は、エントリを削除または編集するときにかなり余分な作業があることです。しかし、私はこのアプローチがデータベース設計の精神であると感じています。複合主キーかどうか

反対側には、私の友人がいて、コンポジットキーを決して使っていないのですが、テーブルに別の '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のアプローチを使うことの悪い面は何ですか?助言がありますか?

+0

をチェックアウトhttp://stackoverflow.com/questions/159087/composite-primary-keys-versus-unique-object-id-field – TechTravelThink

答えて

23

私個人的には、は、の2番目のアプローチ(それはほぼ100%の時間を使用する)を優先します - 代理IDフィールドを導入してください。

なぜですか?

  • は、あなたのテーブルを参照するすべてのテーブルのための非常に簡単に命を作る - の条件はただ1つのID列(というよりも2、3、またはあなたが参加する必要があり、さらに列を持つをはるかに単純をしているのJOINあなたのテーブルを参照するすべてのテーブルが唯一の外部キーフィールドとして単一IDを運ぶために必要があるため、すべての時間)

  • は、人生はずっと楽になり - ではないいくつかの列あなたの複合キーから

  • は、人生はずっと楽になりデータベースca nはしかし、私は彼らがデータエントリの一意性を保つ 方法がわからない(INT IDENTITYを使用して)ユニークID

の作成を処理。

非常に単純です:プライマリキーとして使用する複合カラムにUNIQUE INDEXを配置してください。

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

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

+0

よろしくお願いします。私はユニークなインデックスについても知らなかった。再度、感謝します! – sandalone

+3

@askmo。だから私はこの権利を得ることができます。簡単なコーディングのために、(a)自動インクリメント列(b)と追加のインデックスを追加しますか?完全な非datまたは非ビジネス要件に関する懸念はありませんか?負のパフォーマンスに懸念はありませんか?失われた航海(ラリーの答えを参照)? – PerformanceDBA

+4

@marc_s。これは、自分の好き嫌いを心配している人に、コーディングの容易さ、デザインの "データベース"。全体的な使用、パフォーマンス、標準、関係力に関心のある専門的なデータベース設計者の代わりに。業界は非常に悲しい状態です。 – PerformanceDBA

0

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

+0

実際、私は、M:Mのコンビネーションキーが最も理にかなっていることを意味していたと思いますが、人工(サロゲート)キーを導入する方が良い方法です。アプリ開発を管理する方が簡単です。 – sbrbot

16

次の質問をする:

しかし、私は彼らがデータエントリの一意性を保つ 方法がわかりません。

自然なプライマリキーを形成する列に対して、別の合成UNIQUEインデックスを宣言することによって、一意性を維持できます。

どちらが良いですか?

さまざまな意見があり、時には強く支持される人もいます。私は、より多くの人々が代理整数型キーを使用することが分かると思います。

2番目のアプローチの悪い面は何ですか?ここで

代理キーを使用しての欠点の一部です:

  1. あなたは自然主キーのユニークネスを維持するために追加のインデックスが必要です。

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

+1

良い答え。常に、時々ではない。 (2)いくつかの読者とすべての応答者の説明が必要な場合があります。親に対する大男は失われます。 IDは、孫を孫に養子縁組する必要があります。 – PerformanceDBA

+1

+1サロゲートキーを使用して2つ目の引数を+1します。 (私は代理キーに反対ではない - 実際には正反対) –

+0

私よりも公平に述べられている。要塞としてのDBの概念は、新しいフレームワークでは失われているようです。はい、シンプルな代理キーにより、ORMを簡単に設定できます。しかし、コンポジット・キー、特にコンポジット・ナチュラル・キーは、データ分析を容易にし、生のSQLをよりリーンにします。私がやる作業では、すべてのテーブルのIDカラムを使って作業するのは大変面倒です。アプリは出て行ってもデータはそのまま残り、最も価値があります。シンプル・キーとコンポジット・キー、サロゲート・キーとナチュラル・キーは決して解決されない引数です。 Dan Chakの "Enterprise Rails"を読んでください。いくつかはそれを得る、いくつかはしないで、他の人はそれを無視します。 – juanitogan

-2

この投稿が作成されて以来、非常に長い時間です。しかし、私はコンポジットキーに関する同様の状況を遭遇しなければならなかったので、私は自分の考えを投稿しています。

テーブルT1とT2が2つあるとします。

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

T2は、列を有するC1、C2及びC3

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

テーブルT1の代理キー(T1_ID)を使用し、これをテーブルT2の外部キーとして使用したとしましょう。テーブルT1のC1とC2の値が変更された場合、参照を強制する追加作業です表T1からのサロゲート・キー(表T1で値が変更されていないサロゲート・キーのみを参照しているので、表T2に対するイングジェーリゼーション制約)を示しています。これは2番目のアプローチでは1つの問題になる可能性があります。

+4

正規化されたデータベースでは、 C1とC2を含んでいるので、私はこれが有効な議論ではないと思います。 – Caltor

関連する問題