27

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

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

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

+0

Аналогичный вопрос (но не дубликат): [Как создать внешний ключ, который также является первичным ключом в MySQL?] (Http://stackoverflow.com/questions/5575051/how-to-create-foreign-key -that-is-a-primary-key-in-mysql) – naXa

ответ

32

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

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

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

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

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

+2

Спасибо. В моем случае это первый сценарий, о котором вы упомянули, плюс тот факт, что в таблице 2 есть много столбцов, а также есть таблицы 3, 4 и т. Д., Которые находятся в аналогичном отношении к таблице 1, поэтому размещение всех столбцов будет слишком большим. – CodeVirtuoso

+5

Одна из ситуаций, когда это имеет смысл, заключается в том, что вы используете [наследование таблицы классов] (http://stackoverflow.com/a/3579462/1709587), а таблица 2 представляет собой подкласс таблицы 1. Я предполагаю, что это специальный случай вашего первого пункта. –

+0

Еще одна причина для этого - если у вас есть две разные таблицы, таблица A и таблица B, которые разделяют столбцы в таблице C. Например, у вас есть таблица под названием «Контакты», другая называется «Сотрудники», а другая называется «Люди». У людей есть имя, фамилия и т. Д., А контакты и сотрудники представляют людей. –

Смежные вопросы