私は初めて外部キーを使用し始めたばかりで、それらに使用する標準の命名スキームがあるのだろうか?
これらのテーブルを考えます:
task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)
タスクにメモがある場合、タスクはユーザーが所有し、ユーザーはメモを作成します。
この場合、3つの外部キーはどのように命名されますか?または、代わりに、それもまったく問題になります?
更新:この質問は、フィールド名ではなく外部キー名に関するものです!
SQL Serverの標準的な規則は次のとおりです。
FK_ForeignKeyTable_PrimaryKeyTable
したがって、たとえば、メモとタスクの間のキーは次のようになります。
FK_note_task
そして、タスクとユーザーの鍵は次のとおりです。
FK_task_user
これにより、キーに関連するテーブルが「一目で」わかるため、特定のテーブル(最初の名前のテーブル)が依存しているテーブル(2番目のテーブル)を簡単に確認できます。このシナリオでは、キーの完全なセットは次のようになります。
FK_task_user
FK_note_task
FK_note_user
したがって、タスクはユーザーに依存し、メモはタスクとユーザーの両方に依存することがわかります。
私は区切り文字として2つのアンダースコア文字を使用します.
fk__ForeignKeyTable__PrimaryKeyTable
これは、テーブル名自体にアンダースコア文字が含まれることがあるためです。データ要素の名前にはアンダースコア文字が含まれることが多いため、これは一般に制約の命名規則に従います。
CREATE TABLE NaturalPersons (
...
person_death_date DATETIME,
person_death_reason VARCHAR(30)
CONSTRAINT person_death_reason__not_zero_length
CHECK (DATALENGTH(person_death_reason) > 0),
CONSTRAINT person_death_date__person_death_reason__interaction
CHECK ((person_death_date IS NULL AND person_death_reason IS NULL)
OR (person_death_date IS NOT NULL AND person_death_reason IS NOT NULL))
...
FK_TABLENAME_COLUMNNAME
?
[〜#〜] k [〜#〜] eep [〜#〜] i [〜#〜] t [〜#〜] s [〜 #〜] imple [〜#〜] s [〜#〜]可能であればいつでも愚かです。
通常、IDという名前のPKをそのままにして、他のテーブルのFKに名前を付けるときにテーブル名とキー列名を連結します。一部のデータベースでは大文字と小文字が区別され、いずれにしても大文字または小文字の名前がすべて返されるため、キャメルケースに悩むことはありません。いずれにしても、あなたのテーブルの私のバージョンは次のようになります。
task (id, userid, title);
note (id, taskid, userid, note);
user (id, name);
行は永続化するオブジェクトの1つを表すため、表には単数形の名前も付けていることに注意してください。これらの規則の多くは個人的な好みです。他の人の規約を採用するよりも、規約を選択して常に使用することが重要であることをお勧めします。
SQL Serverに関するMicrosoftからのメモ:
FOREIGN KEY制約は、別のテーブルのPRIMARY KEY制約にのみリンクする必要はありません。別のテーブルのUNIQUE制約の列を参照するように定義することもできます。
そのため、従来のプライマリ/外部関係用語の代わりに、依存関係を説明する用語を使用します。
独立(親)テーブルのPRIMARY KEYを従属(子)テーブルの同様の名前の列で参照する場合、列名を省略します:
FK_ChildTable_ParentTable
他の列を参照する場合、列名が2つのテーブル間で異なる場合、または単に明示的にする場合:
FK_ChildTable_childColumn_ParentTable_parentColumn
これはおそらくやり過ぎですが、私にとってはうまくいきます。特にVLDBを扱う場合、非常に役立ちます。私は次を使用します:
CONSTRAINT [FK_ChildTableName_ChildColName_ParentTableName_PrimaryKeyColName]
もちろん、何らかの理由で主キーを参照していない場合、一意性制約に含まれる列を参照する必要があります。この場合、次のようになります。
CONSTRAINT [FK_ChildTableName_ChildColumnName_ParentTableName_ColumnInUniqueConstaintName]
長くてもいいですかレポートの情報を明確に保つのに役立ちましたか、潜在的な問題は100%がこの命名規則に関する人々の考えを知りたいと思っているprod-alertの間にあるという簡単なジャンプを得ました。
私の通常のアプローチは
FK_ColumnNameOfForeignKey_TableNameOfReference_ColumnNameOfReference
または他の用語で
FK_ChildColumnName_ParentTableName_ParentColumnName
この方法で、history_info table
からcolumn actionBy and actionTo
のusers_info
のような同じテーブルを参照する2つの外部キーに名前を付けることができます
のようになります
FK_actionBy_usersInfo_name - For actionBy
FK_actionTo_usersInfo_name - For actionTo
注意してください:
子テーブルの名前は含めませんでしたが、それは私にとって常識のように思えます。私は子供のテーブルにいるので、子供のテーブル名を簡単に推測できます。 合計文字数は26文字で、Charles Burnsがコメントについて述べたOracleの30文字の制限によく適合しています ここ
読者への注意:以下にリストしたベストプラクティスの多くは、30文字の名前制限があるためOracleでは機能しません。テーブル名または列名はすでに30文字に近い場合があるため、2つを1つの名前に結合する規則では、切り捨ての標準またはその他のトリックが必要です。 –チャールズバーンズ
ここでの回答とコメントに基づいて、FKテーブル、FKフィールド、およびPKテーブル(FK_FKTbl_FKCol_PKTbl)を含む命名規則は、FK制約名の衝突を回避する必要があります。
したがって、ここで指定されたテーブルの場合:
fk_task_userid_user
fk_note_userid_user
したがって、タスクまたはメモを最後に変更した人を追跡する列を追加すると...
fk_task_modifiedby_user
fk_note_modifiedby_user
最初のオクテットをFKと「-」(ダッシュ)ではなく「_」(アンダースコア)に置き換えて、大文字のバージョン4 UUIDを使用してみてください。
例えば。
FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
FK_1786_45A6_A17C_F158C0FB343E
FK_45A5_4CFA_84B0_E18906927B53
根拠は次のとおりです