Поскольку они должны быть уникальными, что я должен назвать FK в базе данных MySQL?
Что такое правильное соглашение об именах для MySQL FK?
Ответ 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
к имени внешнего ключа является избыточным.