MySQL FKの適切な命名規則は何ですか?


回答:


141

MySQLでは、外部キー制約にシンボリック名を付ける必要はありません。名前が指定されていない場合、InnoDBは一意の名前を自動的に作成します。

いずれにせよ、これは私が使用する規則です:

fk_[referencing table name]_[referenced table name]_[referencing field name]

例:

CREATE TABLE users(
    user_id    int,
    name       varchar(100)
);

CREATE TABLE messages(
    message_id int,
    user_id    int
);

ALTER TABLE messages ADD CONSTRAINT fk_messages_users_user_id 
    FOREIGN KEY (user_id) REFERENCES users(user_id);

user_id上記の例のように、参照テーブルと参照テーブルで同じフィールド名を使用しようとしています。これが実用的でない場合は、参照されるフィールド名も外部キー名に追加します。

この命名規則により、テーブル定義を見ただけでシンボリック名を「推測」でき、さらに一意の名前が保証されます。


13
シンボリック名を作成する理由は、制約を削除する必要がある場合、または削除する必要がある場合に参照するためです。OracleおよびSQL Serverでは、特定の制約を無効にすることができます。名前にfkがない場合は、制約が外部キー制約であることを確認する必要があります...
OMG Ponies

11
私がしたいのは、参照しているテーブル名と参照されているテーブル名の間に二重下線を使用することです。これは、テーブルのすべてのFKを一緒に維持するアルファベット順のリストの二重の利点を提供し、同時に複数の単語のテーブル名がある場合に名前の衝突/混乱を回避するのに役立ちます。些細な場合は、名前のフィールド部分も省略します(つまり、単一のintフィールドが別のテーブルのID PKを参照します)。
Joel Brown、

2
複数の外部キーがある場合はどうなりますか?例:member_id〜>テーブルメンバーへのリンク、edited_id〜>編集されたユーザーの外部キー、テーブルメンバーへのリンク。それらにどのように名前を付ける必要がありますか?
TomSawyer 2017年

@TomSawyer:すべての外部キーに「pk_」を追加し、その後に参照されるテーブル(「メンバー」など)、次に使用法/センス(「編集者」または「作成者」など)を追加します。だから私は「pk_members_author」や「pk_members_editor」のようなものを持っています。
Nrgyzer

28

私の選択は異なります。私の意見では、テーブルは単にidフィールドuser_idと呼ばれるので、テーブルにはフィールドではなくフィールドがあるはずuserです。

CREATE TABLE users(
   id    int,
   name       varchar(100)
);

CREATE TABLE messages(
   id int,
   user_id    int
);

user_idmessages、それが(あるIDを明確にしなければならないので、テーブルFKフィールドですuser_id)。

私の意見では、完全に自己説明的な命名規則は次のようになります:

fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]

i.e.: `fk_messages_user_id_users_id`

注意:

  • 場合によっては、2番目の要素([参照フィールド名])を省略できます
  • このfkは一意である可能性があります。これは、messages_userテーブルが存在する場合、参照するフィールド名はuser_id(だけではなくid)であり、fk名は次のようになっている必要があるためです。

    fk_messages_user_user_id_users_id

つまり、外部キーの命名規則では、「参照/参照フィールド」の命名規則も使用している場合は、一意の名前が確実に作成されます(もちろん、独自の名前を選択できます)。


4
名前には、コード全体で永続化する方法があります。最終的には、$idどのテーブルに属しているかわからない変数がどこかに見つかるでしょう。コードベースが古く、より多くの人がそれに取り組んでいるほど、その可能性は高くなります。
CJデニス

9

作成後にfkを頻繁に参照していることに気付かない場合、1つのオプションは、それを単純に保ち、MySQLに名前を付けさせることです(Daniel Vassalloが彼の回答の冒頭で述べたように)。

このメソッドでは制約名を一意に「推測」することはできませんが、クエリを実行することで外部キー制約名を簡単に見つけることができます。

use information_schema;
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA = 'your_db_schema_name' ORDER BY TABLE_NAME;

たとえば、クエリから次のものを受け取ることがあります。

+------------+-------------+-----------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------+-------------+-----------------+-----------------------+------------------------+
| note       | taskid      | note_ibfk_2     | task                  | id                     |
| note       | userid      | note_ibfk_1     | user                  | id                     |
| task       | userid      | task_ibfk_1     | user                  | id                     |
+------------+-------------+-----------------+-----------------------+------------------------+

この追加の手順が多すぎない場合は、探しているfkを簡単に見つけることができます。


1
fk-[referencing_table]-[referencing_field]

その理由は、の組み合わせでreferencing_tableありreferencing_field、データベース内で一意です。これにより、外部キーの名前が読みやすくなります。次に例を示します。

table `user`:
    id
    name
    role

table `article`:
    id
    content
    created_user_id /* --> user.id */
    reviewed_user_id /* --> user.id */

したがって、2つの外部キーがあります。

fk-article-created_user_id
fk-article-reviewed_user_id

user外部キー名にテーブル名を追加することは冗長です。


データベース名が次の場合はどうなりますuser_roleか?userrole多対多の関係を持っており、user_roleすべての外部キーを含むテーブルです。それでいいのfk_user_role_role
グエンĐứcTAM

@NguyễnĐứcTâmFK-USER_ROLE -役割
ヴァンQuyết
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.