以下のようなテーブルがあります
_Role(Role ID, Name, Other_Columns)
Command(Command ID, Name, Other_Columns)
_
関連付けテーブルRoleCommandがあります。 RoleCommand(RoleName, CommandName)
の代わりにRoleCommand(Role ID, Command ID)
を使用してもかまいませんか。この場合、名前を参照に使用すると、関連付けテーブルの読み取りや入力が簡単になると思います。 RoleCommand
には、挿入クエリを手動で入力することに注意してください。 Web UIはありません。 Name
列に一意のキー制約と外部キー参照を設定します。この種の参照を本番環境で使用する人はいますか?ほとんどの場合、関連付けテーブルに使用されているのはIDだけです。
更新:
name
の挿入クエリがRoleCommand
内にネストされたSELECT
クエリを使用すると、ID値を取得できないため、外部キー参照にVALUES
を使用することを検討しています。名前。エラーを回避するために、挿入クエリでIDだけを使用したくありません。
name
を両方のテーブルのPKにして、ID
を完全に削除することもできます。私が推奨するのは、サロゲートを使用することをすでに決定している場合は、サロゲートに固執し、FKにそれらを指すようにすることです。
また;名前列に一意の制約を作成した場合、それらはキー列と見なされるので、理論的にはFKをそれらにポイントできますが、私はそれがエレガントでないと思います。
間違いは、Name
の方が読みやすいため、ID
ではなくName
を使用することです。あなたがすべきことはあなたのID
をもっと読みやすくすることです。
RoleCode
ではなくRoleID
と考えてください
Role(RoleCode Pk, Name, Other_Columns)
Command(CommandID PK, RoleCode FK, Other_Columns)
サンプルデータ
RoleCode Name Other_Columns
-------- ---- -------------
Admin Administrator
PwrUser Power User
User Standard User
これで、参照整合性は安全です。
はい、一意の制約を持つ列でなければならない場合を除き、外部キー参照に非ID列を使用することは問題ありません。
外部キーの基本的な定義は次のとおりです。「あるテーブルの主キーが別のテーブルの外部キーとして機能する」。標準SQLでは、外部キーの参照は、参照されるテーブルのPRIMARY KEYまたはUNIQUE KEYである必要があります。
非ID列を主キーとして使用できる場合は、それで問題ありません。ただし、ID列を外部キー参照として使用することにはいくつかの利点があります。
ID列、特にIDENTITY列である列は、ほとんど更新されないという意味で(場合によっては)インデックスとしても適しています。テーブルから行を削除しないと、インデックスの断片化が減少します。
Create_date/entry_date列がなく、データを入力された順序で確認する必要がある場合。IDとしてID列があると、それが可能になります。
複合キーは機能しますが、単一の主キーの方が扱いやすい場合があります。たとえば、削除を実行すると、特定の行を選択するのが非常に簡単になります。多くの場合、数値キーで検索する方が効率的です。
ありがとうございました !