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

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

Ответ 1

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

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

Ответ 2

мой выбор другой. по моему мнению, таблица должна иметь поле 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

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

Ответ 3

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

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

Ответ 4

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 */

Итак, у нас есть два внешних ключа:

fk-article-created_user_id
fk-article-reviewed_user_id

Добавление имени таблицы user к имени внешнего ключа является избыточным.