外部キーには文字列と整数のどちらが適していますか? 質問する

外部キーには文字列と整数のどちらが適していますか? 質問する

useridと列を持つユーザー テーブルがありusername、両方とも一意です。

と のどちらをuserid外部usernameキーとして使用するのがよいでしょうか。
その理由は? 上司は文字列を使用したいと考えていますが、問題ありませんか?

ベストアンサー1

外部キーには文字列と int のどちらが適していますか?

場合によります

沢山あります既存の議論トレードオフについて自然キーと代理キー- 自分にとって何が効果的か、組織内の「標準」は何かを決定する必要があります。

OP の場合、代理キー ( int userId) と自然キー (charまたはvarchar username) の両方があります。どちらの列もテーブルの主キーとして使用でき、どちらの方法でも、他のキーの一意性を強制することができます。

どちらかの方法を選択する場合の考慮事項は次のとおりです。

代理キーを使用する場合(例:UserId INT AUTO_INCREMENT)

代理キー (例UserId INT AUTO_INCREMENT) を主キーとして使用する場合、テーブルを参照するすべてのテーブルは を外部キーとしてMyUsers使用する必要があります。UserId

ただし、username追加のユニークインデックス例:

CREATE TABLE `MyUsers` (
  `userId` int NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  ... other columns
  PRIMARY KEY(`userId`),
  UNIQUE KEY UQ_UserName (`username`)

@Dagon によると、狭い主キー ( などint) を使用すると、 のような広い (可変長) 値を使用する場合よりもパフォーマンスとストレージの利点が得られます。この利点は、 への外部キーがより狭くなる (フェッチするバイト数が少なくなる)ため、varcharを参照するその他のテーブルにも影響します。MyUsersuserid

代理整数キーのもう 1 つの利点は、 を参照するテーブルに影響を与えずにユーザー名を簡単に変更できることですMyUsers。 がusername自然キーとして使用され、他のテーブルが をMyUsers介してに結合されている場合username、ユーザー名を変更するのは非常に不便です (そうしないと外部キー関係が侵害されるため)。 をusername外部キーとして使用するテーブルでユーザー名を更新する必要がある場合、次のような手法が考えられます。アップデートカスケードデータの整合性を維持するために必要です。

ナチュラルキー(ユーザー名など)を使用するケース

代理キーを使用する場合の欠点の 1 つは、列が必要な場合、代理キーを介して参照する他のテーブルをテーブルに戻すMyUsers必要があることです。ナチュラル キーの潜在的な利点の 1 つは、クエリがを参照するテーブルの列のみを必要とする場合、ユーザー名を取得するために に結合し直す必要がないため、I/O オーバーヘッドがいくらか削減されることです。JOINMyUsersUsernameUsernameMyUsersMyUsers

おすすめ記事