一般的に使用されているほとんどのエンジン (MS SQL Server、Oracle、DB2、MySQL など) では、代理キー システムを使用しても目立った問題は発生しません。サロゲートを使用することでパフォーマンスが向上する場合もありますが、パフォーマンスの問題はプラットフォームに大きく依存します。
大まかに言うと、自然鍵 (ひいては複合鍵) 対代理鍵の議論には長い歴史があり、「正しい答え」は見えません。
自然キー (単数または複合) の引数には、通常、次のものが含まれます。
1) それらはデータモデルですでに利用可能です。モデル化されているほとんどのエンティティには、関係を作成するためのキーのニーズを満たす 1 つ以上の属性または属性の組み合わせが既に含まれています。各テーブルに属性を追加すると、不要な冗長性が組み込まれます。
2) 特定の結合が不要になります。たとえば、顧客コードを持つ顧客と請求書番号を持つ請求書 (どちらも「自然な」キー) があり、特定の顧客コードのすべての請求書番号を取得したい場合は、単純に を使用できます"SELECT InvoiceNumber FROM Invoice WHERE CustomerCode = 'XYZ123'"
。従来の代理キー アプローチでは、SQL は次のようになります"SELECT Invoice.InvoiceNumber FROM Invoice INNER JOIN Customer ON Invoice.CustomerID = Customer.CustomerID WHERE Customer.CustomerCode = 'XYZ123'"
。
3) それらは、データ モデリングへのより普遍的に適用可能なアプローチに貢献します。自然キーを使用すると、異なる SQL エンジン間で同じ設計をほとんど変更せずに使用できます。多くの代理キー アプローチでは、キーの生成に特定の SQL エンジン手法を使用しているため、さまざまなプラットフォームに実装するには、データ モデルをより特殊化する必要があります。
代理キーの引数は、SQL エンジン固有の問題を中心に展開する傾向があります。
1) ビジネス要件/ルールが変更されたときに、属性を簡単に変更できます。これは、データ属性を単一のテーブルに分離できるためです。これは主に、DOMAIN などの標準 SQL 構造を効率的に実装しない SQL エンジンの問題です。属性が DOMAIN ステートメントによって定義されている場合、ALTER DOMAIN ステートメントを使用してスキーマ全体で属性を変更できます。SQL エンジンが異なれば、ドメインを変更するためのパフォーマンス特性も異なります。また、一部の SQL エンジンは DOMAINS をまったく実装していません。そのため、データ モデラーは代理キーを追加してこれらの状況を補い、属性を変更する機能を向上させます。
2) 自然キーよりも並行性の実装が容易になります。自然キーの場合、2 人のユーザーが同じ情報セット (顧客行など) を同時に操作しているときに、ユーザーの 1 人が自然キーの値を変更すると、2 番目のユーザーによる更新は失敗します。更新はデータベースに存在しなくなりました。サロゲート キーの場合、可変の顧客コードではなく、不変の ID 値がデータベース内の行の識別に使用されるため、更新は正常に処理されます。ただし、2 番目の更新を許可することが常に望ましいとは限りません。顧客コードが変更された場合、行の実際の「ID」が変更されているため、2 番目のユーザーが変更を続行できない可能性があります。間違った行を更新しています。代理キーも自然キーも、単独ではこの問題に対処できません。
3) 自然キーよりも優れたパフォーマンスを発揮します。パフォーマンスは、SQL エンジンの影響を最も直接的に受けます。異なる SQL エンジンを使用して同じハードウェアに実装された同じデータベース スキーマは、多くの場合、SQL エンジンのデータ ストレージおよび検索メカニズムにより、パフォーマンス特性が大幅に異なります。一部の SQL エンジンは、顧客コードなどの同じ属性がデータベース スキーマの複数の場所に現れる場合、データが実際に重複して格納されるフラット ファイル システムに非常によく似ています。SQL エンジンによるこの冗長ストレージは、データまたはスキーマを変更する必要がある場合にパフォーマンスの問題を引き起こす可能性があります。他の SQL エンジンは、データ モデルとストレージ/検索システムをより適切に分離し、データとスキーマをより迅速に変更できるようにします。
4) 代理キーは、特定のデータ アクセス ライブラリと GUI フレームワークでより適切に機能します。ほとんどの代理キー設計は同種の性質を持っているため (例: すべてのリレーショナル キーは整数)、データ アクセス ライブラリ、ORM、および GUI フレームワークは、データに関する特別な知識を必要とせずに情報を操作できます。自然キーは、異種の性質 (異なるデータ型、サイズなど) のため、自動化または半自動化されたツールキットおよびライブラリではうまく機能しません。組み込み SQL データベースなどの特殊なシナリオでは、特定のツールキットを念頭に置いてデータベースを設計することが許容される場合があります。他のシナリオでは、データベースは企業の情報リソースであり、複数のプラットフォーム、アプリケーション、レポート システム、およびデバイスから同時にアクセスされるため、特定のライブラリまたはフレームワークに重点を置いて設計された場合、適切に機能しません。加えて、
私は(明らかに)ナチュラルキーの側に落ちる傾向がありますが、私はそれについて熱狂的ではありません. 私が働いている環境では、私が設計を支援する特定のデータベースがさまざまなアプリケーションで使用される可能性があるため、データ モデリングの大部分に自然キーを使用し、サロゲートを導入することはめったにありません。ただし、サロゲートを使用する既存のデータベースを再実装しようとはしません。代理キー システムは問題なく機能します。すでに正常に機能しているものを変更する必要はありません。
各アプローチのメリットについて説明している優れたリソースがいくつかあります。
http://www.google.com/search?q=natural+key+surrogate+key
http://www.agiledata.org/essays/keys.html
http://www.informationweek.com/news/software/bi/201806814