キーとして1列のみが必要なテーブルで、その列の値はの場合、IDフィールドを使用しないでください。アイデンティティ列を持つことは良い考えではありませんか?
逆に、同じテーブルと列では、手動でその値を生成し、各レコードに自動生成された値を使用しないのはいつですか?
テーブルにたくさんの挿入と削除がある場合はそうだと思います。私は正しい?他にどんな状況がありますか?
キーとして1列のみが必要なテーブルで、その列の値はの場合、IDフィールドを使用しないでください。アイデンティティ列を持つことは良い考えではありませんか?
逆に、同じテーブルと列では、手動でその値を生成し、各レコードに自動生成された値を使用しないのはいつですか?
テーブルにたくさんの挿入と削除がある場合はそうだと思います。私は正しい?他にどんな状況がありますか?
Great Primary Key Debacleのサロゲート側にすでに解決済みの場合は、IDキーを使用しない単一の理由が見つかりません。通常の選択肢はguid(主にサイズやランダム性から多くの欠点があります)とアプリケーション層生成キーです。しかし、アプリケーション層にサロゲートキーを作成することは、見た目より少し難しく、非アプリケーション関連のデータアクセス(バッチロード、インポート、他のアプリケーションなど)もカバーしません。 1つの特別なケースは、guidsやシーケンシャルguidがサイトID + IDキーの代わりになるより良い代替方法を提供する場合に、分散アプリケーションです。
両方のフィールドがforeign keysである多対多のリンクテーブルを作成する場合、IDフィールドは必要ありません。
今日、ほとんどのORMsは、すべてのテーブルにIDフィールドがあると考えています。一般的に、それを提供することは良い習慣です。
INSERT INTO MyTable (id, name) VALUES (1, 'Smith')
このソートを行うために:ID列に挿入する場合、列「ID」は、以下のSQLは、失敗する識別として指定された場合は(通常は)例えばように、値を指定することができない
その表に対してIDENTITY_INSERTをオンにする必要があります。これは通常のものではなく、任意の時点でデータベースの最大1つの表に対してのみ有効です。
私はあなたの文脈について十分理解していますが、
"(何らかの理由で)ユニークな列を作成するためにデータベースが必要な場合は、単調に増加する整数(ID)列ではいけませんか?
このような場合、DBMSが提供する機能以外の目的で使用する理由はありません。あなたのケースでは(SQL Server?)それはアイデンティティです。
除き:
あなたは衝突から重複したキーを防ぐことができますGUIDを使用し、他のソースからのデータを使用してテーブルをマージする必要があります場合。
データベースをマージする必要がある場合は、キーを再生成する必要がない場合は非常に簡単です。
サロゲートが必要な場合は、グローバル一意性の必要性に応じてIDENTITY列またはGUID列を使用します。
ナチュラルプライマリキーがある場合、またはプライマリキーが他の外部キーのユニークな組み合わせとして定義されている場合は、通常、IDENTITYを持たず、プライマリキーとしても使用しません。
私は監査トリガーで追跡しているスナップショット構成テーブルですが、例外があります。この場合、通常は論理的な「主キー」(通常、スナップショットの日付と行の自然キー - 行が構成レコードであるコストセンターまたはGLアカウント番号など)が使用されますが、 "プライマリキー"をプライマリキーとして、IDENTITYを追加してプライマリキーにし、日付とナチュラルキーにユニークなインデックスまたは制約を設定します。理論的には日付とナチュラルキーは変更してはいけませんが、これらの表では、ユーザーが新しい行を追加して古い行を削除するのではなく、その主キーで識別される行の変更を反映する監査キーの消滅や新しいキーの登場ではなく、行の変化を反映させるためです。
IDフィールドを望まない1つのケースは、1対1の関係になります。セカンダリテーブルはプライマリキーとしてプライマリテーブルと同じ値を持ちます。その状況でIDフィールドを持つ唯一の理由は、ORMを満たすことにあるようです。
最近、私は小説を索引付けし、検索文字列のサイズに比例した検索を非常に高速に実行できるようにするために、C#でSuffix Trieを実装しました。要件の一部(これは宿題だった)はオフラインストレージを使用することでしたので、MS SQLを使用しました。テーブル内にノードを表す構造が必要でした。
私は次の構造で終わった:NodeID Character ParentID、など、NodeIDは主キーだった。
2つの主な理由から、これを自動インクリメントIDとして実行したくありませんでした。
+1 - 分散型のGUIDに関する追加情報が好きです。経験から、これはまさに整数キーを使用するより簡単かもしれません。 –