Что такое правильное соглашение об именах для MySQL FKs? - PullRequest
88 голосов
/ 11 февраля 2010

Поскольку они должны быть уникальными, что я должен назвать FK в БД MySQL?

Ответы [ 3 ]

123 голосов
/ 11 февраля 2010

В 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 в приведенном выше примере. Когда это нецелесообразно, я также добавляю имя поля, на которое ссылаются, к имени внешнего ключа.

Это соглашение об именах позволяет мне «угадать» символическое имя, просто взглянув на определения таблицы, и, кроме того, оно также гарантирует уникальные имена.

27 голосов
/ 05 августа 2011

мой выбор другой. по моему мнению, таблица должна иметь поле «id», а не «user_id», потому что таблица просто называется «user», поэтому:

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

CREATE TABLE messages(
   id int,
   user_id    int
);

"user_id" в таблице "messages" - это поле fk, поэтому оно должно уточнить, какой идентификатор ("user_id").

Полностью самоочевидное соглашение об именах, на мой взгляд, могло бы быть:

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

i.e.: fk_messages_user_id_users_id 

Примечание:

  • в некоторых случаях вы можете опустить второй элемент ([ссылка на имя поля])
  • этот fk может быть уникальным, потому что если существует таблица «messages_user», имя поля ссылки должно быть «user_id» (а не просто «id») и имя fk должно быть:

    fk_messages_user_user_id_users_id

Другими словами, соглашение об именовании внешнего ключа гарантирует, что вы будете использовать уникальные имена, если вы также используете соглашение об именовании «ссылочное / ссылочное поле» (и вы можете, конечно, выбрать свое собственное).

7 голосов
/ 16 августа 2014

Если вы не можете ссылаться на fk так часто после того, как они созданы, один из вариантов - сохранить простоту и позволить MySQL делать для вас имена (как Даниэль Вассалло упоминает в начале своего ответа ).

Хотя вы не сможете однозначно «угадать» имена ограничений с помощью этого метода - вы можете легко найти имя ограничения внешнего ключа, выполнив запрос:

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                     |
+------------+-------------+-----------------+-----------------------+------------------------+

Если этот дополнительный шаг не слишком сложен для вас, тогда вы сможете легко найти нужную вам ФК.

...