2010-11-27 11 views
10

この資料はchoosing a primary keyにあります。プライマリキーの選択方法は?

  • 特定のテーブルのプライマリキーを選択する方法についてのガイド/ブログポストはありますか?
  • 自動インクリメント/生成キーを使用する必要がありますか、またはモデル化されるデータにプライマリキーを設定する必要があります(これは本当にユニークなフィールドを持つと仮定します)。
  • パフォーマンスのためにプライマリキーを常に長くする必要がありますか、それとも文字列であっても外部ユニークIDをプライマリキーとして使用できますか?

答えて

10

実際には、natural keyを使用することは、ほとんどsurrogate keyよりも優れていると思います。

次は、主キーとして自然キーを使用しての主な欠点です:

  • あなたは間違ったキー値を持つ可能性がある、またはあなたは、単にキー値の名前を変更することもできます。これを編集するには、それを外部キーとして使用するすべてのテーブルを更新する必要があります。

  • 本当にuniqueナチュラルキーを持つことは難しいことがよくあります。

  • ナチュラルキーは多くの場合文字列です。数値フィールドのインデックスは、文字列フィールドのインデックスよりはるかにコンパクトです。

プライマリキーのデータタイプを厳しくする必要はありません。数値キーは通常よりうまく実行されますが、特にテーブルが大きくなく、テーブルを参照するテーブルが大きくない場合は、文字列を使用できます。

+0

+1 DBのナチュラルキーとadmin personelの組み合わせでは、12個のアクティブなJoe Blogしかないのにjoeblogs13は必要ないので、顧客IDの再利用を主張しています。すべての可能なレポートを間違ったものにして、私たちのウェブサイトの各ページに競合状態を残してしまいます... – tobyodavies

+0

@Daniel Vassallo:車のVINコードや書籍のISBNコードを主キーとして使用するのではなく、代理キーを使用しますか?これらのコードはISO準拠ですが、業界の問題に取り組んでいれば代理キーよりも効果があると思いませんか? – Spredzy

+1

@Spredzy:ほとんどの場合、はい。私が言及した最初の点は依然として非常に問題になる可能性があります。主キーは変更するつもりはないので、変更したいISBNに簡単にタイプミスがある可能性があります。自然キーには他にも複雑な問題があります([Wikipedia](http: /en.wikipedia.org/wiki/International_Standard_Book_Number)): "個人的に印刷されたり、著者が通常のISBN手順に従わなかったりすると、書籍が印刷されたISBNなしで表示されることがあります。これらの例外は扱いにくいです... –

-4

私は常に主キーとしてuuidを選択します。 int/longキーと比較して、わずかなオーバーヘッドがありますが、多くの利点があります。型オーバーフローには対応できず、後で主キーを変更することなくデータベースをシャードできます。あなたの主キーは常にユニークで、UUIDはここなど

+0

-1申し訳ありませんが、対「常にUUIDを選択し、」4つのバイト対36「の適切な時にUUIDを使用する」 - なるほど、これらのバッファを埋めます! –

0

プロのシステムのデータモデル(主に銀行ソフトウェア)とther eは異なる解決策でした。私が見たGUID解決策がありましたが、パフォーマンスにあまり影響を与えていないようでした。私は、「システムによって提供される番号は、システム全体でユニークな番号」と見てきました。私はGUIDのようなものを提供するアルゴリズムを見てきましたが、 "短く"なっています。私はビジネスキーが(アカウント番号のように)使用されていることも見てきました。これはデザインが悪く、問題を引き起こしました。私はそれをお勧めしません。私は各テーブルの自動インクリメントキーを見てきました。

何が一番好きでしたか?サービスによってシステム全体の番号として提供される番号。それはうまくいく。また、単純なキー変換テーブルを使用すると、ユーザーキー(口座番号など)を使用して、ユニークな番号とデータオブジェクトの種類を特定することができます(必ずしもテーブルではない)そのタイプに応じて異なるテーブルに分割されます)。

ブログはありますか? Graeme SimsionとGraham Wittが「データモデリングの基礎」と呼ぶ本を持っています。彼らは私の好みの解決方法を示唆していないかもしれませんが、多くの実際の生き生きとした例を示し、可能な異なる種類の解決策を示しています。

1

私は、多くの場合、自動生成されたint型/ BIGINTデータ型で構成された無意味キーと呼ば代理キーを使用します。

は、ここで私はこれらのキーを使って好きな理由の一部です。私はそれはあなた自身のカスケードを書くことが

  • 簡単に削除します見つける

    • (例えば、古い電子メールなど)のリストから複数の項目を削除するときは、整数の代わりに、GUIDのか、自然キー
    • のカンマ区切りのリストを供給することができます整数型フィールドで内部結合が高速になると思う。
    • ドキュメントがなくても新しいシステムを学ぶことができます。
  • 1

    キーは、一意性と最小限性の2つの基本的な機能を持つ属性セットです。 Minimalityは、キーが一意性を保証するために必要な最小数の属性しか持たないことを意味します。

    良いキーを選択する一般的指針として適用される三つの基準があります。

    • 熟知 - キーが有意義と
    • はシンプルそれらを使用する人々に精通している必要があります - キーは同じくらい簡単であるべきで、安定
    • できるだけ簡潔 - キー値が、まれに

    これらは良い指針ですが、絶対的な要件ではありません変更する必要があります。どのような場合でも、機能上の要件とデータの整合性の必要性によって、使用するキーが決まります。 downvoteのため

    関連する問題