2011-11-26 75 views
12

我有我的项目,开发人员计划的结构如下:MySQL的唯一的ID或联合ID

developer table 
id 
developer name 
etc... 

project table 
id 
project name 
etc... 

developer _project table 
??? 

因为开发人员可以在多个项目和一个项目可以有多个开发人员,我要创建一个新表但从我读的是他们不告诉我应该使用什么样的ID。

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

回答

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表。

+0

他们为什么需要相同的定义? – zackaryka

+0

假设您在交集表中有'INT UNSIGNED'(最大值为4294967295,因为是无符号的),而'tinyint'(最大值为127,因为它的有符号 - 未定义的字未定义)。由于达到交集表中的最大数量,所以不会插入超过此数字的数字,它将在127处停止(您会得到:'行1'处的列'developer_id'超出范围值)。阅读更多:http://help.scibit.com/mascon/masconMySQL_Field_Types.html –

+0

我明白了,感谢您的提示 – zackaryka

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作为唯一的主键,在(开发商,项目)添加一个唯一的限制:

(id,developer,project) 
(1,1,1) 
(2,1,1) <-- error 
(3,2,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`) 
) 
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) 

建议你使用第一个选项,除非你有理由没有至。那里有ORMs不能很好地处理复合(主)键。