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

Я сейчас думаю о дизайне базы данных таблицы «друзей» (многие ко многим, хранит дружбу между пользователями).

Столбцы: user_id friend_id

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

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

Ответы [ 4 ]

1 голос
/ 09 января 2010

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

PRIMARY KEY ('user_id', 'friend_id')

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

INDEX ('user_id')

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

1 голос
/ 09 января 2010

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

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

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.

0 голосов
/ 09 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...