web-dev-qa-db-ja.com

外部キーの命名スキーム

私は初めて外部キーを使用し始めたばかりで、それらに使用する標準の命名スキームがあるのだろうか?

これらのテーブルを考えます:

task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)

タスクにメモがある場合、タスクはユーザーが所有し、ユーザーはメモを作成します。

この場合、3つの外部キーはどのように命名されますか?または、代わりに、それもまったく問題になります

更新:この質問は、フィールド名ではなく外部キー名に関するものです!

133
nickf

SQL Serverの標準的な規則は次のとおりです。

FK_ForeignKeyTable_PrimaryKeyTable

したがって、たとえば、メモとタスクの間のキーは次のようになります。

FK_note_task

そして、タスクとユーザーの鍵は次のとおりです。

FK_task_user

これにより、キーに関連するテーブルが「一目で」わかるため、特定のテーブル(最初の名前のテーブル)が依存しているテーブル(2番目のテーブル)を簡単に確認できます。このシナリオでは、キーの完全なセットは次のようになります。

FK_task_user
FK_note_task
FK_note_user

したがって、タスクはユーザーに依存し、メモはタスクとユーザーの両方に依存することがわかります。

161
Greg Beech

私は区切り文字として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))
        ...
35
onedaywhen

FK_TABLENAME_COLUMNNAME

[〜#〜] k [〜#〜] eep [〜#〜] i [〜#〜] t [〜#〜] s [〜 #〜] imple [〜#〜] s [〜#〜]可能であればいつでも愚かです。

15
EvilTeach

通常、IDという名前のPKをそのままにして、他のテーブルのFKに名前を付けるときにテーブル名とキー列名を連結します。一部のデータベースでは大文字と小文字が区別され、いずれにしても大文字または小文字の名前がす​​べて返されるため、キャメルケースに悩むことはありません。いずれにしても、あなたのテーブルの私のバージョンは次のようになります。

task (id, userid, title);
note (id, taskid, userid, note);
user (id, name);

行は永続化するオブジェクトの1つを表すため、表には単数形の名前も付けていることに注意してください。これらの規則の多くは個人的な好みです。他の人の規約を採用するよりも、規約を選択して常に使用することが重要であることをお勧めします。

9
Steve Moyer

SQL Serverに関するMicrosoftからのメモ:

FOREIGN KEY制約は、別のテーブルのPRIMARY KEY制約にのみリンクする必要はありません。別のテーブルのUNIQUE制約の列を参照するように定義することもできます。

そのため、従来のプライマリ/外部関係用語の代わりに、依存関係を説明する用語を使用します。

独立(親)テーブルのPRIMARY KEYを従属(子)テーブルの同様の名前の列で参照する場合、列名を省略します:

FK_ChildTable_ParentTable

他の列を参照する場合、列名が2つのテーブル間で異なる場合、または単に明示的にする場合:

FK_ChildTable_childColumn_ParentTable_parentColumn
8
bvj

これはおそらくやり過ぎですが、私にとってはうまくいきます。特にVLDBを扱う場合、非常に役立ちます。私は次を使用します:

CONSTRAINT [FK_ChildTableName_ChildColName_ParentTableName_PrimaryKeyColName]

もちろん、何らかの理由で主キーを参照していない場合、一意性制約に含まれる列を参照する必要があります。この場合、次のようになります。

CONSTRAINT [FK_ChildTableName_ChildColumnName_ParentTableName_ColumnInUniqueConstaintName]

長くてもいいですかレポートの情報を明確に保つのに役立ちましたか、潜在的な問題は100%がこの命名規則に関する人々の考えを知りたいと思っているprod-alertの間にあるという簡単なジャンプを得ました。

3
SSISPissesMeOff

私の通常のアプローチは

FK_ColumnNameOfForeignKey_TableNameOfReference_ColumnNameOfReference

または他の用語で

FK_ChildColumnName_ParentTableName_ParentColumnName

この方法で、history_info tableからcolumn actionBy and actionTousers_infoのような同じテーブルを参照する2つの外部キーに名前を付けることができます

のようになります

FK_actionBy_usersInfo_name - For actionBy
FK_actionTo_usersInfo_name - For actionTo

注意してください:

子テーブルの名前は含めませんでしたが、それは私にとって常識のように思えます。私は子供のテーブルにいるので、子供のテーブル名を簡単に推測できます。 合計文字数は26文字で、Charles Burnsがコメントについて述べたOracleの30文字の制限によく適合しています ここ

読者への注意:以下にリストしたベストプラクティスの多くは、30文字の名前制限があるためOracleでは機能しません。テーブル名または列名はすでに30文字に近い場合があるため、2つを1つの名前に結合する規則では、切り捨ての標準またはその他のトリックが必要です。 –チャールズバーンズ

1
Cary Bondoc

ここでの回答とコメントに基づいて、FKテーブル、FKフィールド、およびPKテーブル(FK_FKTbl_FKCol_PKTbl)を含む命名規則は、FK制約名の衝突を回避する必要があります。

したがって、ここで指定されたテーブルの場合:

fk_task_userid_user
fk_note_userid_user

したがって、タスクまたはメモを最後に変更した人を追跡する列を追加すると...

fk_task_modifiedby_user
fk_note_modifiedby_user
0
Chad Kieffer

最初のオクテットをFKと「-」(ダッシュ)ではなく「_」(アンダースコア)に置き換えて、大文字のバージョン4 UUIDを使用してみてください。

例えば。

  • FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
  • FK_1786_45A6_A17C_F158C0FB343E
  • FK_45A5_4CFA_84B0_E18906927B53

根拠は次のとおりです

  • 厳密な生成アルゴリズム=> 統一名;
  • キーの長さは30文字未満、これはOracleの命名の長さの制限です(12c以前)。
  • エンティティ名が変更された場合FKの名前を変更する必要はありませんエンティティ名ベースのアプローチのように(DBがテーブル名変更演算子をサポートしている場合);
  • 外部キー制約の名前を使用することはほとんどありません。例えば。 DBツールは通常、制約の適用対象を示します。 「解読」のためにそれを使用することを避けることができるので、不可解な外観を恐れる必要はありません。
0
coldserenity