web-dev-qa-db-ja.com

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

それらは一意でなければならないので、MySQL DBでFKを何と命名する必要がありますか?

90
Zombies

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のように、参照テーブルと参照テーブルで同じフィールド名を使用しようとします。これが実用的でない場合は、参照フィールド名も外部キー名に追加します。

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

124
Daniel Vassallo

私の選択は異なります。私の意見では、テーブルは単に「user」と呼ばれるため、「user_id」フィールドではなく「id」フィールドを持つ必要があります。

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

CREATE TABLE messages(
   id int,
   user_id    int
);

「messages」テーブルの「user_id」はfkフィールドなので、どのidが(「user_id」)であるかを明確にする必要があります。

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

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

i.e.: fk_messages_user_id_users_id 

注意:

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

    fk_messages_user_user_id_users_id

言い換えると、「参照/参照フィールド」の命名規則も使用する場合は、外部キーの命名規則により一意の名前を確認できます(もちろん、独自の名前を選択できます)。

28
lorenzo

Fkを作成した後に頻繁に参照することに気付かない場合、1つのオプションは、fkを単純に保ち、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を簡単に見つけることができるはずです。

8
user12345