自然 ID に関係を作成することはありますか? それとも内部 ID を使用して自然 ID 関係をエミュレートしますか?[重複]

StackOverflow https://stackoverflow.com/questions/2095388

質問

重複の可能性:
サロゲート vs.ナチュラル/ビジネスキー

2 つのテーブルが与えられた場合、Level1 [ID, Title, Number] Level2 [ID, FKID???, Title, Number]

システムのユーザーは、レベル 1 の番号に基づいてレベル 2 がレベル 1 に関連付けられていることを理解しています。私からの質問は、内部 ID に基づいて関係を作成し、「番号」との関係を「エミュレート」するのか、それとも単純に「数値」フィールドで終わりですか?

役に立ちましたか?

解決

自然 ID ではなくデータベース ID に関連付ける標準的な理由は次の 2 つです。

  1. いかなる状況でも自然 ID が決して変更されないことを保証するのは困難です
  2. 一般に、自然 ID はより多くのスペースを必要とし、データベース ID ほどインデックス作成の効率が良くありません (もちろん、これは難しいことではありません。自然 ID を構成するデータによって異なります)。データベースIDを利用することで業務データの重複を避けることができます。

他のヒント

この議論はここの周りに殴り殺されました。少数の人々は唯一の自然キーを守り、ほとんどが代理キーの使用を奨励します。いくつかは(ビジネスルールが適用されているので、自然キーを使用しています。)もちろん、あなたが真である、両方を持つことができると言う。

私は自然キーが本当にキー(それはないほとんどの時間。)であれば二度考える傾向があります。それであれば、私はそれを使用します。

しかし、再び、現実の中で最も自然なキーはキーではなく、様々な理由により、重複しています。例えば、国民IDカードが発行されている国では、同じID番号を持つ2人を見つけることも珍しくありません。

私は代理キーのルートを行くと思いならば、私はこのようなテーブルを設定したい、と述べた。

Level1 [ID, Title, Number] Level2 [ID, FKID references Level1]

を2回タイトルと番号を保存する必要はありません。

これは何度も取り上げられていると思います。

ほとんどの場合、IDENTITY/AUTONUMBER を外部キーとして使用する方が安全です。

ほとんどの自然キーは (エラーであっても) 複製できます。

私の国では、X-) の個人 ID 番号についても問題があります。

「番号」の列が自然な方法で2つのテーブルを相関させるために使用することができる場合、私は内部(代理)キーに基づいて関係を強制しないであろう。

あなたがID列でスペースを無駄にしないように、

一方で、「数」欄には、十分に良いかもしれません。 「番号」列は、右の特性を持っていない場合一方、(かもしれない変更を、インデックスなどに難しいかもしれない)、その後、サロゲートのIDは、より良い選択肢かもしれません。

これはすべての「数」列の意味論に帰着ます。

  • 自然な鍵を使用するのが最善である場合があります もし (たとえば、SSN、または従業員ID)重要な安定性が保証されています。

  • 代理キーを使用すると、FKは基本的に生成された1つのシステムから、生成された別のシステム#からの関係です。極端な場合、そのような人為的な関係は、現実と完全に同期していない可能性があります。

  • 他の投稿者は、ナチュラルキーを変更する必要があるときに起こる混乱についてコメントしています。確かにそれは問題です。しかし、これらの例外がどのくらいの頻度で発生するかを検討する価値はあります。すべての場合において、尻尾 (例外) が犬 (デザイン) を振るべきでしょうか?

  • 私はこれに熱中しているわけではありませんが、自然キーと代理キーが混在する同じデータベース内で異なる規約が存在するのが不便であることには同意します。

  • ナチュラルキーが複数のフィールドである場合、DateofBirth + lastName +部門(またはそのような奇妙なこと)がある場合は、人工キーを使用する方が良いでしょう。

上記のすべての引数は、 論理レベル データモデルの。物理レベルでは、状況、サーバー、パフォーマンスの制約が決定を左右します。時期尚早に最適化しないことが最善です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top