状況によって異なります
多くの
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
を使用してテーブルでユーザー名を更新する必要がある場合 外部キーとして、 ON UPDATECASCADE
のような手法 データの整合性を維持するために必要です。
自然キー(ユーザー名など)を使用する場合
サロゲートキーを使用することの1つの欠点は、MyUsers
を参照する他のテーブルです。 代理キーを介してJOIN
である必要があります MyUsers
に戻ります Username
の場合はテーブル 列が必要です。自然キーの潜在的な利点の1つは、クエリにUsername
のみが必要な場合です。 MyUsers
を参照するテーブルの列 、MyUsers
に再度参加する必要はありません ユーザー名を取得します。これにより、I/Oのオーバーヘッドがいくらか節約されます。