Уникальный идентификатор или комбинированный идентификатор MySQL
У меня есть следующая структура для моей программы проекта и разработчика:
developer table
id
developer name
etc...
project table
id
project name
etc...
developer _project table
???
Поскольку разработчик может быть в нескольких проектах, и у проектов может быть несколько разработчиков, я должен создать новую таблицу, но из того, что я прочитал, они не говорят, какой идентификатор я должен использовать.
Если я использую auto increment + user_id + project_id, у меня будет дубликат, так как id является первичным ключом?
Ответы
Ответ 1
Используйте уникальный комбинированный ключ:
CREATE TABLE `developer_project` (
developer_id INT(10) UNSIGNED /* etc... */,
project_id INT(10) UNSIGNED /* etc... */,
PRIMARY KEY dev_project (developer_id, project_id)
);
Если вы создаете ID
, вы, вероятно, никогда не будете использовать его, так как вы запросите Developer_id и/или project_id в своем LEFT JOIN
ПРИМЕЧАНИЕ. Убедитесь, что определения столбцов совпадают с таблицами developer
и project
.
Ответ 2
для отношений "многие ко многим" вы можете просто использовать составной первичный ключ из двух полей.
Пример (предполагая, что как project_id, так и developer_id являются целыми):
CREATE TABLE `developer_project` (
`developer_id` INT NOT NULL ,
`project_id` INT NOT NULL ,
PRIMARY KEY ( `developer_id` , `project_id` )
)
Ответ 3
Комбинированная таблица (в Workbench MySQL автоматически называется "developer_has_project" ) должна использовать объединенный первичный ключ (разработчик, проект). Если вы добавите третий столбец к этому ключу (ID), он больше не должен быть уникальным:
(id,developer,project)
(1,1,1)
(2,1,1)
(3,1,1)
Используя только разработчика и проект, он будет работать:
(developer,project)
(1,1)
(1,1) <-- error!
(2,1)
В качестве альтернативы вы можете использовать ID как единственный первичный ключ и добавить ограничение UNIQUE (разработчик, проект):
(id,developer,project)
(1,1,1)
(2,1,1) <-- error
(3,2,1)
Ответ 4
Или:
developer_project table
developer_id
project_id
PRIMARY KEY (developer_id, project_id)
или
developer_project table
id
developer_id
project_id
PRIMARY KEY (id)
UNIQUE KEY (developer_id, project_id)
Я предлагаю вам использовать первый вариант, если у вас нет причин. Существуют ORM, которые не хорошо справляются с составными (первичными) ключами.