[解決済み】テーブルの主キーに関するベストプラクティスは何ですか?[解決済み]
質問
テーブルを設計するとき、私はユニークなカラムをひとつだけ用意し、それを主キーにする習慣を身につけました。 これは、要件に応じて3つの方法で実現している。
- 自動インクリメントの整数型カラムを使用する。
- 一意な識別子(GUID)
- 行の識別子となる短い文字(x)または整数(またはその他の比較的小さな数値型)のカラム。
3番は、かなり小さなルックアップに使われる。主に、ユニークな静的長さの文字列コードや、年などの数値を持つ可能性のあるテーブルを読み込むのに使われるだろう。
その他のテーブルには、自動インクリメントの整数値か一意な識別子の主キーを設定します。
疑問点 :-)
最近、一貫した行識別子を持たないデータベースを扱うようになり、主キーがさまざまな列に分散している状態です。 いくつかの例を挙げます。
- 日時/文字
- 日時/整数
- datetime/varchar
- char/nvarchar/nvarchar
このような場合、有効なケースはあるのでしょうか? 私なら、このような場合のために、常にIDまたは一意な識別子のカラムを定義しています。
また、主キーを持たないテーブルも多く存在します。 その正当な理由があるとすれば、それは何でしょうか?
なぜテーブルがそのように設計されたのかを理解しようとしているのですが、私には大混乱に見えますが、もしかしたらそれなりの理由があったのかもしれませんね。
3つ目の質問は、答えを読み解くための一助となるものです。複数のカラムを使用して複合主キーを構成する場合、この方法と代理キー/人工キーとの間に特定の利点がありますか? 主にパフォーマンス、メンテナンス、管理などに関して考えています。
どのように解決するのですか?
私はいくつかのルールに従っています。
- 主キーは必要最小限小さくする。数値型は文字型よりもはるかにコンパクトなフォーマットで保存されるため、数値型を推奨します。なぜなら、ほとんどの主キーは別のテーブルの外部キーとなり、また複数のインデックスで使用されるからです。キーが小さければ小さいほど、インデックスも小さくなり、キャッシュのページ数も少なくなります。
- 主キーは絶対に変えてはいけない。主キーを更新することは、常に問題外であるべきです。なぜなら、複数のインデックスで使用されたり、外部キーとして使用される可能性が高いからです。1つの主キーを更新すると、変更の波及効果を引き起こす可能性があります。
- ロジックモデルの主キーとして、問題の主キーを使用しないでください。例えば、パスポート番号、社会保障番号、従業員契約番号など、これらの「自然キー」は現実の状況下で変化する可能性があるからです。一貫性を維持するために、必要に応じてUNIQUE制約を追加してください。
サロゲートキーとナチュラルキーの比較については、上記のルールを参照してください。もし自然キーが小さくて変化しないのであれば、主キーとして使うことができます。ナチュラル・キーが大きく、変更される可能性がある場合は、サロゲート・キーを使用する。なぜなら、経験上、スキーマにテーブルを追加すると、必ず主キーを設定すればよかったと思うからです。
関連
-
[解決済み】SQLクエリ「00904. 00000 - "%s: 無効な識別子"
-
[解決済み] バックエンドバージョンでは、データベースのダイアグラムやテーブルのデザインはサポートされていません。
-
[解決済み】SQL Server サブクエリが1つ以上の値を返しました。サブクエリが =, !=, <, <= , >, >= に続く場合、これは許可されません。
-
[解決済み] ORA-12801: 並列クエリサーバー P004 および ORA-01555 でシグナルされたエラー: スナップショットが古すぎる。
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] GUIDを主キーとして使用する場合のベストプラクティス、特にパフォーマンスに関して教えてください。[クローズド]。
-
[解決済み】Eメールアドレスを主キーにする?
-
[解決済み] 複合主キーのNullableカラムの何が問題なのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] varchar 値 'simple, ' をデータ型 int に変換する際に変換に失敗しました。
-
[解決済み] アンピボットの主キーを含む対象コードページで、テキストが切り捨てられたか、1つ以上の文字が一致しない。
-
[解決済み] ORA-01790: 式は、対応する式と同じデータ型でなければならないエラーが発生するケース
-
[解決済み] Presto SQL ピボッティング(言葉は悪いですが)データ
-
[解決済み] 集計を行わずに行から列へピボット移動する
-
[解決済み] 列名または提供された値の数がテーブル定義と一致しません。
-
[解決済み] nvarchar 値 ... をデータ型 int に変換する際に、変換に失敗しました。
-
[解決済み] SQLで複数のGROUP BYを使用する場合とは?
-
[解決済み] アプリケーション開発者が陥りやすいデータベース開発の失敗例【終了しました
-
[解決済み] サロゲートキーとナチュラルキー/ビジネスキーの比較【終了しました