我的项目和开发人员计划有以下结构:
developer table
id
developer name
etc...
project table
id
project name
etc...
developer _project table
???
因为开发人员可以在多个项目中,并且项目可以有多个开发人员,所以我必须创建一个新表,但从我读到的内容来看,他们并不知道我应该使用什么ID。
如果我使用id自动增量+ user_id + project_id我会重复,因为id是主键吗?
答案 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
和project
表相同。
答案 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不能很好地处理复合(主要)键。