IDという名前のフィールドを使用します。整数の主キー。一部のIDフィールド/関係が混乱した場合にテーブルを再構築できるように、2番目の一意のフィールドも指定することは重要ですか、それとも心配ではありませんか?
Sql-CEデータベースで自動インクリメント整数を使用しています。シングルユーザー。
IDという名前のフィールドを使用します。整数の主キー。一部のIDフィールド/関係が混乱した場合にテーブルを再構築できるように、2番目の一意のフィールドも指定することは重要ですか、それとも心配ではありませんか?
Sql-CEデータベースで自動インクリメント整数を使用しています。シングルユーザー。
テーブルのセマンティクスで必要な場合は、必要に応じて一意のキーをいくつでも追加します。たとえば、問題のドメインですべての「従業員」エンティティがNameによって一意に識別される場合、Nameには一意のインデックスまたは制約が必要です。同じ名前の従業員が2人いる可能性がある場合は、もちろん、その列に一意性の制約はありません。
現在、学校ごと、会計年度ごとに情報を保持する必要があるクライアントがいます。学校と年の列を組み合わせた一意の制約(またはインデックス)が必要です。これら2つが主キーでもある場合もありますが、主キーでない場合でも、これらは一意です。
2番目の一意のIDフィールドを追加する動機がよくわかりません-何のために?? それからあなたが見る利益は何ですか?
必要なのは、ID
一意で安定していて、個々の行を明確に識別でき、主キーとして機能できるINT IDENTITY
ものです。SQLServerではそれが完全にうまく機能します。
各行に2番目の一意のIDを追加してもポイントやメリットはありません...
すべてのテーブルには、1つ以上の候補キーがあります。主キーとなるものを1つ選択してください。セマンティックの正確さを強制するために、他にUNIQUE制約を追加します。何かが「台無し」になった場合にテーブルを再構築できることとは何の関係もありません。
また、アクセスをできるだけ速くするために、WHERE句に表示される列にインデックスを付ける必要があります。これらはアプリケーション/ユースケース固有です。
私が意味する例は、アドレステーブルです。代理主キーがある場合があります。SELECTを効率的にするために、zip、市、州、郡などのさまざまな組み合わせのインデックスも用意します。また、street1 / street2 / city / Province/zipの組み合わせをUNIQUEにすることもできます。あなたのビジネス上の問題に依存します。
テーブルには、データの整合性に耐えるのに必要な数のキーが必要です。この場合の「ID」が代理キーを意味する場合、答えは「はい」です。通常、適切に正規化されたデータベースで一意性を確保するために自然キーが必要です。そうでない場合、意味のあるビジネスデータを複製する可能性があります。自然キーの前に代理キーを特定している場合は、設計に欠陥のあるアプローチを取っていると思います。
キーを選択するための適切な基準は、親しみやすさ、シンプルさ、安定性です。考えられる不利な点と追加の複雑さを考慮して、正当な理由がある場合にのみ、モデルに代理キーを追加します。
バックアップのための冗長性は、価値のある設計になる可能性があります。
ただし、ほとんどの人は、質問が示すように、冗長な列をスキーマテーブルにロードすることによってそれを実装しません。そのようにすることには多くのオーバーヘッドがあり、メインIDが台無しになると同時に重複IDが台無しになる多くの障害モードがあります。
限られた期間にわたってIDの履歴を追跡する履歴テーブルを設計する方がよい場合があります。多くの人が履歴テーブルをオフラインストレージのステージング領域として設計し、データベースには最近の履歴のみが保持されます。この種の歴史は、あなたが興味を持っている問題に加えて、他の問題に取り組むことができます。