2011-02-10 16 views
5

可能性の重複:私は、リレーショナルテーブルを作成するとき
Relational database design question - Surrogate-key or Natural-key?SQL:主キー列。人工「ID」欄対「ナチュラル」の列

は値が一意である列を主キー列を選択する誘惑があります。しかし、最適化と一様性の目的のために、私は毎回アーティファクトID列を作成します。一意でなければならない列(または列の組み合わせ)がある場合、それらを(複合)主キー列としてマークするのではなく、そのための一意索引を作成します。

プライマリキーの自然な列ではなく、人為的な "Id"列+インデックスを使用することは、常に良い方法ですか?

+1

回答を特定するのが非常に難しい場合もあります。それらはすべてとても良いです。 –

+0

はい、そうです。 =)そしてSOの仕組みは、投票と受け入れられた答えによるものです。良い裁判官になり、より完全なものを選んでください。初心者の座席を持って読んで、あなたが学んだ答えや最も学んだ答えから何かを見つけようとします。誰もあなたに怒っていることはありません! ;-)さらに、評判を増やすチャンスが増えたとき(あなただけの価値がある場合)、質問に答えることで、人々はあなたのお手伝いをしようと努力しています。気をつけて、良い昼/夜を! =) –

答えて

5

これは少し宗教的な議論です。私の個人的な好みは、自然の主キーではなく、合成主キーを持つことですが、両側に良い議論があります。現実的には、一貫性と妥当性がある限り、いずれのアプローチもうまくいく可能性があります。

自然キーを使用する場合、主に2つの主な欠点は、複合キーと変更された主キー値の存在です。コンポジットの主キーがある場合は、明らかに各子テーブルに複数の列を設定する必要があります。エンティティ間に多くの関係がある場合、データモデルの観点からは扱いにくいことがあります。しかし、クエリを開発する人々にも悲しみを引き起こす可能性があります.N結合条件のN-1を使用するクエリを作成して、ほぼ正しい結果を得ることは非常に簡単です。ナチュラルキーがあれば、必然的にナチュラルキーの値が変化し、その変化を多くの異なるエンティティに波及させる必要があります。これはテーブルのユニークな値を変更するよりもはるかに複雑です。

一方、合成キーを使用すると、追加の列を追加して追加のオーバーヘッドを追加してスペースを無駄にし、機能的に重複した結果を得るリスクが高まります。ビジネスキーに固有の制約を作成すること、またはその組み合わせに一意でないインデックスが存在することを忘れて、それが一意のインデックスであると仮定するのは非常に簡単です。私は実際には数日前にこの特定の失敗によって噛まれました。ユニークな制約を作成するのではなく、合成された自然キーを索引付けしました。ダムの間違いですが、それは比較的簡単です。

クエリの作成と命名規則の観点からは、Aの主キーがA_IDになり、Bの主キーが次のようになっているテーブルを結合していることを知ってうれしいので、合成キーを使用する傾向があります。 B_IDになります。これは、Aの主キーがA_NAMEとA_REVISION_NUMBERの組み合わせであり、Bの主キーがB_CODEであることを覚えようとするよりもはるかに自己記述的です。

0

はい、そうです。他に何もない場合、人工主キーの最も重要な特性の1つは不透明度です。つまり、人工キーはそれ自身の情報を反映しません。自然な行の内容をキーに使用すると、その情報をWebインターフェイスのようなものに公開することになります。これは、すべての原則ではひどい考えです。

+0

意味のあるキーを公開することは、あまりにもひどい考えではありません!ユーザは、データベースが記録を残しておくと思われるものを外部世界で識別するために、通常はそれらの自然キーが必要です。ユーザーインターフェイスにキーを公開することは、情報やビジネスルールを正確に表現する必然性に過ぎません。 – sqlvogel

1

私の好みは常に人工キーを使用することです。

まずは一貫しています。アプリケーションに取り組んでいる人は、キーがあることを知っていて、それを前提とすることができます。これにより、理解と維持が容易になります。

私は、ナチュラルキー(従業員を識別するHRシステムの文字列)をアプリケーションの使用期間中に変更する必要があるシナリオも見てきました。ナチュラルIDと従業員レコードをリンクする人工キーがある場合、そのテーブルのナチュラルIDを変更するだけで済みます。しかし、その自然のIDがプライマリキーであり、それを他のテーブルのいくつかに外部キーとして重複させると、あなたの手には混乱が生じます。

1

私の謙虚な意見では、私があなたの意味を正しく理解していれば、常に人工的なIDを持つ方が良いです。

たとえば、ビジネス上重要なユニークな値をテーブルIDとして使用する人もいますが、MSDNとNHibernateの公式ドキュメントでも読んでいますが、ユニークなビジネス意味のない値が望ましい将来の参照のためにその値に索引を作成する必要があります。だから、会社が命名法を変更する日、システムはまだ完璧に動いているはずです。

2

これはあなたの自然の列によって異なります。それらが小さくて着実に増加している場合、それらは主キーの良い候補です。

  • 小 - 小さいキー、あなたは、単一の行に取得することができます複数の値、およびより速く索引スキャンが
  • が着実に増加します - テーブルには、パフォーマンスの向上、大きくなるにつれて少なくインデックスreshufflesを生成します。
2

PRIMARY KEY制約を適用したキーとUNIQUE制約を適用したキーにはほとんど違いがありません。重要なことは、データの完全性の観点から必要なすべてのキーを強制することです。通常、それは少なくともの1つの「自然な」キー(データのユーザー/消費者に公開され、談話の世界についての事実を識別するために使用されるキー)を意味します。

オプションで、エンドユーザーではなくアプリケーションとデータベースの機能(通常はサロゲートキーと呼ばれます)をサポートするための「技術的な」キーを作成することもできます。しかし、これは非常に重要な副次的な考慮事項になるはずです。シンプルさ(そして非常にしばしばパフォーマンス)のために、通常はサロゲートキーを作成するのが理にかなっています。

関連する問題