MySQL - Использование внешнего ключа в качестве первичного ключа - PullRequest
27 голосов
/ 21 января 2012

У меня есть таблица 1 с первичным ключом user_id и таблица 2, где user_id - внешний ключ.

В таблице 2 может существовать только 1 запись на user_id, и без нее не может быть никакой записи.

ВОПРОС: Может ли user_id в таблице 2 быть как внешним, так и первичным ключом одновременно, и если да, то хорошая ли это идея, каковы плюсы / минусы?

1 Ответ

32 голосов
/ 21 января 2012

Да, вы можете сделать это (и вы должны это сделать с точки зрения проектирования базы данных).

Однако рассмотрим, что это значит, если user_id является первичным ключом в таблице 2. Вы фактически говорите, что каждая строка в таблице 2 соответствует пользователю, но у вас уже есть таблица, в которой каждая строка соответствует пользователю. : таблица 1. Это поднимает вопрос «почему тогда вы не помещаете все данные таблицы 2 в пустые столбцы таблицы 1?». В конце концов, наличие двух таблиц означает, что вам придется выполнить два запроса, чтобы получить эти данные вместо одного.

Теперь есть несколько сценариев, где эта практика может быть хорошей идеей:

  • если у вас много пользователей, но только несколько строк в таблице 2, возможно, запрос к таблице 2 будет выполняться редко; в то же время вы получаете место для хранения и скорость модификации в таблице 1
  • в будущем возможно изменение первичного ключа таблицы 2 при сохранении внешнего ключа; если вы поместите все данные в таблицу 1, эта модификация, скорее всего, нарушит модель вашей базы данных

Это может быть хорошей идеей, но это зависит от особенностей вашего приложения.

...