MySQL уникальный идентификатор или комбинированный идентификатор - PullRequest
12 голосов
/ 26 ноября 2011

У меня есть следующая структура для моего проекта и программы разработчика:

developer table
id
developer name
etc...

project table
id
project name
etc...

developer _project table
???

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

Если я использую идентификатор с автоинкрементом + идентификатор_пользователя + идентификатор_проекта, получу ли я дубликат, поскольку идентификатор является первичным ключом?

Ответы [ 4 ]

13 голосов
/ 26 ноября 2011

Используйте уникальный комбинированный ключ:

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.

5 голосов
/ 26 ноября 2011

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

Пример (при условии, что project_id и developer_id являются целыми числами):

CREATE TABLE `developer_project` (
  `developer_id` INT NOT NULL ,
  `project_id` INT NOT NULL ,
  PRIMARY KEY (  `developer_id` ,  `project_id` )
)
1 голос
/ 26 ноября 2011

Объединенная таблица (в MySQL Workbench автоматически называется "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,developer,project)
(1,1,1)
(2,1,1) <-- error
(3,2,1)
0 голосов
/ 26 ноября 2011

Или:

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, которые плохо справляются с составными (первичными) ключами.

...