代理キーをユーザーに公開する必要がありますか?


14

多くの場合、自然キーを持たないテーブルでは、ユーザーが一意に生成された識別子を保持できると便利です。テーブルに代理主キーがある場合(そして、そのような場合は必ず期待します)、そのキーをユーザーに公開する必要がありますか、その目的で別のフィールドを使用する必要がありますか?

サロゲートキーを公開しない理由の1つは、レコード間の関係を保持する操作を実行できないが、特定の種類の削除/再挿入、1つのデータベースからデータをコピーする多くの方法など、キー値を変更することです他など

代理キーを公開する主な利点は、とにかく持っているフィールドを簡単に使用できることです。

どのような状況で、代理キーをユーザーに直接公開する方がよいでしょうか?


この質問の一部は、「ユーザー」を定義する必要があるということです。ユーザーは、公開するAPIの消費者または肉体的な人間である可能性があります。答えは両方で同じになることはありません。
ジェームズスネル

1
肉質の人間。
psr

データを異なる方法で識別することができるすべての状況には、異なる識別子が必要です。そのため、新しいシステムがデータに接続する場合、独自のPKがあると想定し、それをデータに追加します。「ほとんど水の入ったugい袋」の視認性は、このシナリオの「システム」としてカウントされます。私の推奨する解決策は、エンティティのキ​​ーとタイムスタンプ(追加、変更、削除)を特別なテーブルに保存することです。このようにして、データを簡単に配布できます。

回答:


10

変更が必要なユーザー/顧客に公開される識別子の準備ができている必要があります。また、データベース内の行のIDを変更し、その変更をすべての外部キーに伝播することは、データを破壊することを要求するだけです。

データに自然なビジネスキーがない場合は、「ビジネス識別子」のフィールドを追加できます。これは、使用されるプロセスに対して最適化する必要があります。電話のキーパッド入力は数字のみを意味します。電話/口頭では、同様の音のシンボル(B / D、M / Nなど)を避けます。覚えやすいフレーズ(「グリーンゼリー」)を自動生成することもできます。

これの効果は、ビジネスが後でレコードを参照する方法を変更できることであり、唯一のデータスキーマの変更は、そのスタイルのIDに新しい列を追加するか、既にそこにあるIDを変換することです。変更はデータベース全体に反映されず、時間の経過とともに有効なID(サロゲート)がまだ1つあります。

つまり、サロゲートキーをユーザーに公開することは避けます。コメントが指摘しているように、代理キーはほとんど変更されません。逆に、企業はすべてを変えたいと思っています。代理キーが公開されている場合、ビジネスがそれを変更するのは時間の問題です。

補足として、ここで「公開する」と言うときは、キーを直接使用することを期待してユーザーにキーを提供することを意味します(注文番号でサポートに電話するなど)。


5
この答えは意味がありません。代理キーは決して変更されません。また、ユーザーに公開しないことを主張していません。
ロバートハーベイ

1
絶対とは絶対言うな。後者の設計がレコードの統合につながる場合はどうなりますか?IDをアップサイズして変換する必要がある場合はどうなりますか?
ダグ

3
@DougM:次に、独自の代理キーを使用してレコードを新しい統合テーブルに書き込み、必要に応じて、参照として新しいテーブル(および元のソーステーブルを識別するフィールド)の個別のフィールドに元のキーを保持します。この種の統合は非常にまれであり、設計が失敗した結果としてのみ発生します。繰り返してください: サロゲート。キー。決して。変化する。 それが彼らが代理人だからです。
ロバートハーベイ

2
@RobertHarvey代理キーは決して変更すべきではないことに同意します。そのため、外部識別子の質が低いと思います。最終的には顧客がどのように変更したいと思うでしょう、彼らはレコードを参照します。その時点で、不変の代理キーを中心にシステム全体を構築したか、先を考えてビジネス識別子と代理キーの間に間接性のレベルを設定しました。
クリスピットマン

2
@sqlvogel:「サロゲート」ではなく「システムで生成された主キー」という用語を使用すると、状況がより明確になりますか?代理キーを生成するアルゴリズムを変更することはできますが、基本的に不変の品質は変更されないことに同意します。
ロバートハーベイ

4

場合によっては、代理キーが期待され、ユーザーにとって意味があります。私のお気に入りの例は「注文番号」です。注文番号は実際には自然なキーではありません。自然なキーはタイムスタンプにユーザーを加えたものかもしれません。

それでも、ユーザーは注文番号の利便性を理解し、期待しています。ユーザーに通知しても、害はなく、多くの価値があります。

一方、一部の代理キーはユーザーにとって意味がありません。確かに、私の健康保険会社には、メンバーID、生年月日、キャリアなどに基づいて私を識別するいくつかの代理キーがありますが、それについては気にしません。私の雇用主であり、宇宙全体で一意ではありません...したがって、保険会社の代理キー)。


ユーザーがそれを理解し、それと対話することを期待している場合、それはもはや代理キーではありません。代理キーは、ビジネス上の意味がないと定義されます。ID番号だからといって、必ずしも代理であるとは限りません。また、「メンバーID、生年月日に基づいて私を識別する代理キー[...]」は意味がありません。彼らの代理キー(ビジネス上の意味はありません)は、自然なキーを構成できるものに基づいてあなたを識別すると言っていますか?
カイルマクベイ

多くの場合、従業員システムで同じ名前の他の人と区別されるように、従業員ID番号が与えられます。保険証には、会社と従業員IDが記載されている場合があります。しかし、健康保険会社は多くの場合、雇用主から受け取る名前、生年月日、従業員IDを使用する代わりに、すべてのシステムで使用できる独自の内部IDを生成します。これらの生成されたキーは、代理キーまたは自然キーですか?誰に尋ねるかによって異なります(en.wikipedia.org/wiki/Surrogate_keyで 2つの代替定義を確認してください)
アランシュトコ

1

適切に生成されたGUID / UUID *である場合にのみ、代理キーを公開する必要があります。OWASPのトップ10のセキュリティ問題では、連続した代理キーを公開するのが4です。

*実際には、暗号で保護されたランダムまたは擬似乱数ジェネレーターによって作成されたことがわかっていない限り、これらの目的のために適切に生成されなかったと想定するのが最善です。


2
GUIDがセキュリティをどのように改善するかは、回答から明らかではありません。
ロバートハーベイ

1
@RobertHarvey-連続していないため推測できないためだと思います。
ボブソン


@RobertHarvey、明確にした。
ピーターテイラー

1

テーブルに自然キーがない場合、代理キーはこのような行を許可します。

surrogate_key  some_name
--
1              Wibble
2              Wibble
...
17             Wibble
...
235            Wibble

代理キーではなく、これらの人工キーと呼びますが、この質問ではその区別は重要ではありません。

ここで、外部キーを介してこれらの代理キーを参照する重要なデータがあると仮定すると、エンドユーザーは代理キーの値を知らない場合、どの行を更新するかをどのように知るでしょうか?


列に「surrogate_key」というラベルを付けるのは少し矛盾していますが、それは「代理キーではなく人工キー」であると言います。ビジネス上の意味がなく、一意の識別子としてのみ機能するため、これらの人工キーを呼び出す場合、このキーを自然化(公開)し、新しい代理キーを作成する必要があります。つまり、帰化されたsurrogate_keyの名前をビジネス上の意味を持つものに変更し、クライアントに公開し、内部操作の真の代理となる新しい同様の列を作成します。理想的とは言えませんが、真のサロゲートを公開するよりも優れています。
カイルマクベイ

@KyleMcVay:それは矛盾していません。サロゲートの意味を尊重します。サロゲートの本質的な考え方は「代替」です。サロゲートキー自然キーの代用。(一般的に、コッド理論とリレーショナル理論はこの意味で代理キーを使用します。)自然キーを持たないテーブル、その意味で代理キーを持つことはできません。ただし、他の何かの代わりに使用される任意の値を持つことができます。それは私が人工キーと呼ぶものです。
マイクシェリル 'キャットリコール'

あなたの定義は不正確ではありませんが、サロゲートキーは、サロゲートという言葉を超えて、業界特有の特別な意味を持つようになったと思います。クライアントにキーを公開する場合、そのキーにはビジネス上の意味があると主張します。それは帰化されており、今では論理的にそれが表すエンティティの一部であると考えられるべきです。このロジックにより、公開された代理キーのようなものはありません。人工キーを公開する場合、それはもはや代理キーではなく、新しいキーが必要です。
カイルマクベイ

0

素人の言葉で:

  • サロゲートはユーザーに対して非表示にする必要があります。
  • 他のビジネス候補キーをユーザーに公開する必要があります。
  • 他の候補キーが存在しない場合は、PKを表示する必要があります。ただし、この場合、PKは他の列の代替ではないため、サロゲートとは見なされません。

なぜPKを表示する必要があるのですか?それが私の質問だと思います-自動生成されたPKが適切にサロゲートキーと呼ばれるかどうかは接線です。
psr

1
@psr質問のタイトルに「代理キーが公開される」とあります。私はノーと言った。ただし、他のキーを表示する必要があります。他のキーが存在しない場合は、所有しているキーのみを表示する必要があります。接線方向では、これらの場合、キーは実際には代理ではないことを明確にします。これは、キーが他の列の代替ではないためです。
Tulainsコルドバ

問題は、列を追加するか、キーを表示するかです。
psr

@psrより明確にするために答えを言い換えました。
Tulainsコルドバ

1
私はそれが実質的に取る​​に足らない違いだと思う。すべてのテーブルに人工キー(私のもの)があり、人工キーのみが結合に参加するというルール(これも私の原則です)の場合、他のキーはおそらく利用可能は重要ではありません。
ロバートハーベイ

0

ユーザーに有用な情報を提供するフィールドを直接またはユーザーに報告する際にのみフィールドを公開する必要があります。

逆に、ユーザーが実行する対話のレコード(単純または複雑)を識別する主な手段である場合は、常に「代理主キー」を公開する必要があります。


0

キーをエンドユーザーに公開するかどうかは問題ではありません。アプリケーションは、たとえば注文IDを知るだけでは、通常はアクセスできないものへのアクセスを許可できないように、必要な承認を実行する必要があります。

警告:これは、サーバー側の認証が可能な/実行可能なWebベースまたはn層のアプリケーションを想定しています。sqlを直接実行するVBアプリがある場合、それはまったく別の問題です。


質問で述べたように、外部キーの関係を維持しながら、レコードを挿入してから削除することはできませんか?
PSR

キーをユーザーに公開することと何の関係がありますか?「露出」という用語の使用方法が理解できないかもしれません。私は、あなたが「ユーザーに見られる」ことを意味するという仮定から取り組んでいます。
GrandmasterB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.