Внешние ключи MySQL
Хотелось бы узнать у более опытных пользователей, как поступить? Вот у меня есть табличка Users, и мне требуется создать таблицу Projects, но чтобы в таблицу вносился ID пользователя, который имеет значение первичного ключа, который находится в таблице Users.
Этим хочу реализовать авторство пользователя над каждым проектом.
Но как поступить? Использовать в таблице Projects foreign key, ссылающийся на ID пользователя. Или просто брать ID из сессии, и при создании проекта вносить его в таблицу в месте с остальными данными?
Ответы (1 шт):
Да, желательно создать foreign key. Примерно так вы должны создать таблицу:
CREATE TABLE `project` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
CONSTRAINT `fk1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
)
Вы можете, например, сказать базе данных удалять проект, если из базы данных будет удален пользователь:
CREATE TABLE `project` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
CONSTRAINT `fk1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
)
ALTER TABLE `project`
ADD CONSTRAINT `fk1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE;
Но Вы сможете использовать JOIN и без FK.
SELECT `project`.*, `user`.`name` from `project`
LEFT JOIN `user` ON `user`.`id` = `project`.`user_id`
Создавать ключи рекомендуется потому что это может быть удобно для действий при обновлении или удалении пользователя. Кроме того, база данных не даст Вам создать проект с неверным ID пользователя, если вы не хотите привязывать проект к какому либо пользователю вы можете установить NULL если в данном поле разрешено данное значение. А так же некоторые менеджеры баз данных начинают более внятно выражаться в своем интерфейсе. Например HeidiSQL начинает показывать еще и имя в своей таблице:
Кроме того, говорят, что это увеличивает скорость поиска в базе данных, когда существует явный ключ, база данных будет сразу же знать, где ей искать данные. Хотя я не могу за это ручаться, так как подтверждений этому я не видел.
