Конструкция таблицы MySQL: возможен первичный внешний многоколонный ключ?

0

В настоящее время я думаю о дизайне базы данных таблицы друзей (многие-ко-многим, сохраняет дружеские отношения между пользователями).

Столбцы: user_id friend_id

Имеет ли смысл предпочесть многоколоночный первичный ключ вместо дополнительного столбца "friendship_id"?

Если да, могу ли я добавить внешние ключи для обоих столбцов?

Теги:
database-design
foreign-keys

4 ответа

1
Лучший ответ

Самый быстрый способ работы с базой данных - это, вероятно,

PRIMARY KEY ('user_id', 'friend_id')

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

INDEX ('user_id')

Нет необходимости иметь суррогатный ключ, потому что он создает дополнительную работу, связанную с поддержанием таблицы. Комбинации уникальны в любом случае, и вы уже знаете обе указанные идентификаторы.

  • 0
    Нет ли автоматически сгенерированных индексов для внешних ключей?
  • 0
    Вероятно. Но не больно быть конкретным.
Показать ещё 2 комментария
1

Да, вы действительно можете создать два столбца внешнего ключа, часто это связано с созданием этой ассоциации. Вы также можете указать, что два столбца являются уникальными, поэтому (user_id, friend_id) уникален.

Изменить: пример может быть:

CREAT TABLE friendship (
    user_id INT,
    friend_id INT,
    FOREIGN KEY (user_id) REFERENCES user(id),
    FOREIGN KEY (friend_id) REFERENCES user(id),
    UNIQUE(user_id,friend_id)
);
0

Я бы взял ключ с суррогатной записью с одним столбцом (friendship_id) плюс уникальное ограничение и индекс в комбинации user_id, friend_id. Я бы использовал суррогатный ключ для согласованности, поскольку вы, кажется, используете суррогаты (user_id, по-видимому, ссылается на столбец id на user и т.д.) На другие таблицы.

0

Если вам нужно отслеживать события дружбы, у вас может быть дружба_ид (скажем, вы хотите, чтобы ящик, в котором перечислены самые последние дружеские отношения в системе со ссылкой на детали), но если ваша модель данных не требует этих отношений, первичный ключ с несколькими столбцами будет просто отлично. вы можете создать его так:

create table friend (
  user_id int,
  friend_id int,
  foreign key (user_id) references user(id),
  foreign key (friend_id) references user(id),
  primary key (user_id, friend_id)
);

будет указатель на оба столбца, индивидуально созданных с помощью ограничения внешнего ключа, и уникальный уникальный столбец с несколькими столбцами на user_id, friend_id.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню