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
を参照するその他のテーブルにも影響します。MyUsers
userid
代理整数キーのもう 1 つの利点は、 を参照するテーブルに影響を与えずにユーザー名を簡単に変更できることですMyUsers
。 がusername
自然キーとして使用され、他のテーブルが をMyUsers
介してに結合されている場合username
、ユーザー名を変更するのは非常に不便です (そうしないと外部キー関係が侵害されるため)。 をusername
外部キーとして使用するテーブルでユーザー名を更新する必要がある場合、次のような手法が考えられます。アップデートカスケードデータの整合性を維持するために必要です。
ナチュラルキー(ユーザー名など)を使用するケース
代理キーを使用する場合の欠点の 1 つは、列が必要な場合、代理キーを介して参照する他のテーブルをテーブルに戻すMyUsers
必要があることです。ナチュラル キーの潜在的な利点の 1 つは、クエリがを参照するテーブルの列のみを必要とする場合、ユーザー名を取得するために に結合し直す必要がないため、I/O オーバーヘッドがいくらか削減されることです。JOIN
MyUsers
Username
Username
MyUsers
MyUsers