176

初めて外部キーを使い始めたばかりで、それらに使用する標準の命名スキームがあるかどうか疑問に思っていますか?

これらのテーブルを考えると:

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

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

この状況で、3 つの外部キーはどのように命名されるでしょうか? または、それはまったく問題ですか?

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

4

10 に答える 10

202

SQLServerの標準の規則は次のとおりです。

FK_ForeignKeyTable_PrimaryKeyTable

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

FK_note_task

そして、タスクとユーザーの間の鍵は次のようになります。

FK_task_user

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

FK_task_user
FK_note_task
FK_note_user

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

于 2008-10-14T00:21:37.487 に答える
48

区切り文字として 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))
        ...
于 2008-10-14T07:28:14.503 に答える
18

どうFK_TABLENAME_COLUMNNAMEですか?

可能な限り単純愚かさ保ちます。

于 2008-10-14T00:02:48.087 に答える
13

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

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

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

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

FK_ChildTable_ParentTable

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

FK_ChildTable_childColumn_ParentTable_parentColumn
于 2014-07-14T05:22:11.633 に答える
9

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

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

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

于 2008-10-14T00:03:56.600 に答える
6

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

CONSTRAINT [FK_ChildTableName_ChildColName_ParentTableName_PrimaryKeyColName]

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

CONSTRAINT [FK_ChildTableName_ChildColumnName_ParentTableName_ColumnInUniqueConstaintName]

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

于 2016-02-17T23:49:46.627 に答える
3

私の通常のアプローチは

FK_ColumnNameOfForeignKey_TableNameOfReference_ColumnNameOfReference

または他の言葉で

FK_ChildColumnName_ParentTableName_ParentColumnName

このようにして、 history_info tablewithテーブルのように同じテーブルを参照する 2 つの外部キーに名前を付けることができます。column actionBy and actionTousers_info

のようになります

FK_actionBy_usersInfo_name - For actionBy
FK_actionTo_usersInfo_name - For actionTo

ご了承ください:

私には常識のように思えるので、子テーブル名は含めませんでした。私は子のテーブルにいるので、子のテーブル名を簡単に推測できます。その合計文字数は 26 であり、チャールズ・バーンズがここのコメントで述べたオラクルの 30 文字制限にうまく適合します。

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

于 2016-01-28T01:30:20.023 に答える
0

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

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

fk_task_userid_user
fk_note_userid_user

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

fk_task_modifiedby_user
fk_note_modifiedby_user
于 2014-03-26T21:13:30.567 に答える
-2

FK をそれほど頻繁に参照せず、MySQL (および InnoDB) を使用している場合は、MySQL に FK の名前を付けさせることができます。

後でクエリを実行して、必要な FK 名を見つけることができます。

于 2014-08-16T04:51:23.793 に答える