Что такое правильное соглашение об именовании для MySQL FKs?


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

3 77

3 ответа:

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

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

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

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

CREATE TABLE messages(
   id int,
   user_id    int
);

"user_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 

Примечание:

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

    fk_messages_user_user_id_users_id

Если вы не обнаружите, что часто ссылаетесь на 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                     |
+------------+-------------+-----------------+-----------------------+------------------------+

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