テーブルを設計する際、私は 1 つの列を一意にして主キーにする習慣を身に付けました。これは、要件に応じて 3 つの方法で実現されます。
- 自動的に増分される ID 整数列。
- 一意の識別子 (GUID)
- 行識別子列として使用できる短い文字(x)または整数(またはその他の比較的小さな数値型)の列
番号 3 は、比較的小規模な検索に使用され、主に、一意の静的な長さの文字列コード、または年やその他の番号などの数値を持つテーブルを読み取ります。
ほとんどの場合、他のすべてのテーブルには、自動増分整数または一意の識別子の主キーのいずれかが含まれます。
質問 :-)
私は最近、一貫した行識別子を持たず、主キーが現在さまざまな列にクラスター化されているデータベースの操作を始めました。いくつか例を挙げます。
- 日付時刻/文字
- 日付時刻/整数
- 日付時刻/varchar
- char/nvarchar/nvarchar
これには有効なケースがありますか? このようなケースでは、常に ID 列または一意の識別子列を定義しています。
さらに、主キーがまったくないテーブルも多数あります。 これには、どのような正当な理由がありますか?
テーブルがなぜそのように設計されたのかを理解しようとしていますが、私には非常に混乱しているように見えますが、おそらくそれには正当な理由があったのでしょう。
答えを解読するのに役立つ 3 番目の質問: 複合主キーを構成するために複数の列が使用される場合、代理キーや人工キーと比較して、この方法には特定の利点がありますか? 主にパフォーマンス、メンテナンス、管理などについて考えています。
ベストアンサー1
私はいくつかのルールに従います:
- 主キーは、必要なだけ小さくする必要があります。数値型は文字形式よりもはるかにコンパクトな形式で保存されるため、数値型を推奨します。これは、ほとんどの主キーが別のテーブルの外部キーになるだけでなく、複数のインデックスで使用されるためです。キーが小さいほど、インデックスが小さくなり、キャッシュ内で使用されるページが少なくなります。
- 主キーは変更しないでください。主キーの更新は絶対に行わないでください。主キーは複数のインデックスで使用され、外部キーとして使用される可能性が最も高いためです。単一の主キーを更新すると、変更の波及効果が発生する可能性があります。
- 「問題の主キー」をロジック モデルの主キーとして使用しないでください。たとえば、パスポート番号、社会保障番号、従業員の契約番号など、これらの「自然キー」は実際の状況で変化する可能性があります。一貫性を保つために、必要に応じてこれらに UNIQUE 制約を追加してください。
代理キーと自然キーについては、上記のルールを参考にします。自然キーが小さく、変更されない場合は、主キーとして使用できます。自然キーが大きいか、変更される可能性がある場合は、代理キーを使用します。主キーがない場合でも、経験上、スキーマにテーブルを追加するたびに主キーを配置したくなるため、代理キーを作成します。