2011-11-26 38 views
12

Tôi có cấu trúc sau đây cho chương trình dự án và phát triển của tôi:MySQL id duy nhất hoặc kết hợp id

developer table 
id 
developer name 
etc... 

project table 
id 
project name 
etc... 

developer _project table 
??? 

Bởi vì một nhà phát triển có thể ở nhiều dự án và các dự án có thể có nhiều nhà phát triển tôi đã tạo ra một bảng mới nhưng từ những gì tôi đọc là họ không biết tôi nên sử dụng id nào.

Nếu tôi sử dụng tăng tự động id + user_id + project_id, tôi có bị trùng lặp vì id là khóa chính không?

Trả lời

13

Sử dụng một phím kết hợp độc đáo:

CREATE TABLE `developer_project` (
developer_id INT(10) UNSIGNED /* etc... */, 
project_id INT(10) UNSIGNED /* etc... */, 
PRIMARY KEY dev_project (developer_id, project_id) 
); 

Nếu bạn tạo một ID bạn có thể sẽ không bao giờ sử dụng nó vì bạn sẽ truy vấn developer_id và/hoặc PROJECT_ID trong bạn LEFT JOIN

LƯU Ý: đảm bảo các định nghĩa cột là giống như developerproject những cái bàn.

+0

lý do tại sao chúng cần phải có cùng định nghĩa? – zackaryka

+0

giả sử bạn có 'INT UNSIGNED' (giá trị lớn nhất 4294967295 vì chưa được ký) từ bảng nhà phát triển và' tinyint' (giá trị lớn nhất là 127 vì chữ ký của nó - từ 'unsigned' không được xác định) trong bảng giao nhau. Bởi vì số lượng tối đa trong bảng giao nhau đạt được, nó sẽ không chèn nhiều hơn số này, nó sẽ dừng lại ở 127 (bạn sẽ nhận được: 'Ngoài giá trị phạm vi cho cột 'developer_id' ở hàng 1'). đọc thêm: http://help.scibit.com/mascon/masconMySQL_Field_Types.html –

+0

tôi hiểu, nhờ mẹo – zackaryka

1

Một bảng kết hợp (trong bàn làm việc MySQL tự động được gọi là "developer_has_project") nên sử dụng khóa chính kết hợp (nhà phát triển, dự án). Nếu bạn thêm một cột thứ ba để phím này (ID) nó không còn phải là duy nhất:

(id,developer,project) 
(1,1,1) 
(2,1,1) 
(3,1,1) 

Chỉ sử dụng các nhà phát triển và dự án, nó sẽ làm việc:

(developer,project) 
(1,1) 
(1,1) <-- error! 
(2,1) 

Hoặc bạn có thể sử dụng ID làm khóa chính duy nhất, và thêm một sự kiềm chế UNIQUE trên (nhà phát triển, dự án):

(id,developer,project) 
(1,1,1) 
(2,1,1) <-- error 
(3,2,1) 
5

cho mối quan hệ nhiều-nhiều, bạn có thể chỉ cần sử dụng khóa chính kết hợp của hai trường.

Ví dụ (giả sử cả PROJECT_ID và developer_id là số nguyên):

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

Hoặc:

developer_project table 
developer_id 
project_id 
PRIMARY KEY (developer_id, project_id) 

hoặc

developer_project table 
id 
developer_id 
project_id 
PRIMARY KEY (id) 
UNIQUE KEY (developer_id, project_id) 

tôi đề nghị bạn sử dụng tùy chọn đầu tiên, trừ khi bạn có lý do đến. Có các ORM ngoài đó không đối phó tốt với các phím ghép (chính).

Các vấn đề liên quan