代理キーと自然キーの間には健全な議論があります。
大多数と一致しているように思われる私の意見 (わずかな過半数) は、自然キーが完全に明白であり、変更されないことが保証されていない限り、代理キーを使用する必要があるというものです。次に、自然キーに一意性を適用する必要があります。これは、ほぼ常に代理キーを意味します。
Company テーブルから始まる 2 つのアプローチの例:
1: 代理キー: テーブルには、PK (および ID) である ID フィールドがあります。会社名は州ごとに一意である必要があるため、一意の制約があります。
2: 自然キー: テーブルは CompanyName と State を PK として使用します -- PK と一意性の両方を満たします。
Company PK が他の 10 個のテーブルで使用されているとします。それを裏付ける数字がない私の仮説は、ここでは代理キーアプローチの方がはるかに高速であるということです。
自然キーについて私が見た唯一の説得力のある議論は、自然キーとして 2 つの外部キーを使用する多対多テーブルの場合です。その場合は一理あると思います。ただし、リファクタリングが必要な場合は問題が発生する可能性があります。それはこの投稿の範囲外だと思います。
代理キーを使用する一連のテーブルと自然キーを使用する同じ一連のテーブルのパフォーマンスの違いを比較する記事を見た人はいますか? SO と Google を調べてみても、価値のあるものは何も得られませんでした。
重要な更新:この質問に答える一連のテスト テーブルの作成を開始しました。次のようになります。
- PartNatural - 固有の PartNumber を PK として使用するパーツ テーブル
- PartSurrogate - ID (int、identity) を PK として使用し、PartNumber に一意のインデックスを持つパーツ テーブル
- Plant - PK としての ID (int、identity)
- エンジニア - PK としての ID (int、identity)
すべての部品がプラントに結合され、プラントの部品のすべてのインスタンスがエンジニアに結合されます。このテストベッドに問題がある場合は、今がその時です。