2011-11-26 117 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不能很好地處理複合(主)鍵。