MySQL唯一ID或组合ID

时间:2011-11-26 15:34:05

标签: mysql primary-key

我的项目和开发人员计划有以下结构:

developer table
id
developer name
etc...

project table
id
project name
etc...

developer _project table
???

因为开发人员可以在多个项目中,并且项目可以有多个开发人员,所以我必须创建一个新表,但从我读到的内容来看,他们并不知道我应该使用什么ID。

如果我使用id自动增量+ user_id + project_id我会重复,因为id是主键吗?

4 个答案:

答案 0 :(得分:13)

使用唯一的组合键:

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,则可能永远不会使用它,因为您将查询LEFT JOIN

中的developer_id和/或project_id

注意:确保列定义与developerproject表相同。

答案 1 :(得分:5)

对于多对多关系,您可以简单地使用两个字段的复合主键。

示例(假设project_id和developer_id都是整数):

CREATE TABLE `developer_project` (
  `developer_id` INT NOT NULL ,
  `project_id` INT NOT NULL ,
  PRIMARY KEY (  `developer_id` ,  `project_id` )
)

答案 2 :(得分:1)

组合表(在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)

答案 3 :(得分:0)

或者:

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不能很好地处理复合(主要)键。