В настоящее время я думаю о дизайне базы данных таблицы друзей (многие-ко-многим, сохраняет дружеские отношения между пользователями).
Столбцы: user_id friend_id
Имеет ли смысл предпочесть многоколоночный первичный ключ вместо дополнительного столбца "friendship_id"?
Если да, могу ли я добавить внешние ключи для обоих столбцов?
Самый быстрый способ работы с базой данных - это, вероятно,
PRIMARY KEY ('user_id', 'friend_id')
Это гарантирует, что они являются уникальными комбинациями, и в то же время оба могут быть внешними ключами. Возможно, вам нужен и индекс user_id, чтобы вы могли быстро найти всех друзей для одного пользователя.
INDEX ('user_id')
Нет необходимости иметь суррогатный ключ, потому что он создает дополнительную работу, связанную с поддержанием таблицы. Комбинации уникальны в любом случае, и вы уже знаете обе указанные идентификаторы.
Да, вы действительно можете создать два столбца внешнего ключа, часто это связано с созданием этой ассоциации. Вы также можете указать, что два столбца являются уникальными, поэтому (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)
);
Я бы взял ключ с суррогатной записью с одним столбцом (friendship_id
) плюс уникальное ограничение и индекс в комбинации user_id
, friend_id
. Я бы использовал суррогатный ключ для согласованности, поскольку вы, кажется, используете суррогаты (user_id
, по-видимому, ссылается на столбец id
на user
и т.д.) На другие таблицы.
Если вам нужно отслеживать события дружбы, у вас может быть дружба_ид (скажем, вы хотите, чтобы ящик, в котором перечислены самые последние дружеские отношения в системе со ссылкой на детали), но если ваша модель данных не требует этих отношений, первичный ключ с несколькими столбцами будет просто отлично. вы можете создать его так:
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.