2011-11-26 9 views
12

Mam następującą strukturę dla mojego programu projektu oraz programu:MySQL unikalny identyfikator lub łączone id

developer table 
id 
developer name 
etc... 

project table 
id 
project name 
etc... 

developer _project table 
??? 

Bo deweloper może być w wielu projektów, a także projekty mogą mieć wiele developer muszę utworzyć nową tabelę ale z tego, co czytam, nie mówią, jaki id powinienem użyć.

Jeśli używam przyrostu auto id + identyfikator_użytkownika + identyfikator projektu, czy będę mieć duplikat, ponieważ identyfikator jest kluczem podstawowym?

Odpowiedz

13

Korzystanie unikalny klucz kombinowany:

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

Jeśli utworzysz ID będzie prawdopodobnie nigdy go używać, ponieważ będzie kwerendy developer_id i/lub PROJECT_ID w swoim LEFT JOIN

UWAGA: upewnij się, że definicje kolumn są takie same jak developer i project tabele.

+0

dlaczego muszą być tej samej definicji? – zackaryka

+0

załóżmy, że masz 'INT UNSIGNED' (wartość maksymalna 4294967295, ponieważ jest niepodpisana) z tabeli deweloperów i' tinyint' (wartość maksymalna to 127, ponieważ jej podpis - słowo 'unsigned' nie jest zdefiniowane) w tabeli przecięć. Ponieważ osiągnięta zostanie maksymalna liczba w tabeli przecięć, nie wstawi ona więcej niż ta liczba, zatrzyma się na 127 (otrzymasz: 'Wartość poza zakresem dla kolumny 'developer_id' w wierszu 1'). czytaj dalej: http://help.scibit.com/mascon/masconMySQL_Field_Types.html –

+0

otrzymuję, dziękuję za podpowiedź – zackaryka

1

Połączona tabela (w środowisku roboczym MySQL automatycznie nazywana "developer_has_project") powinna używać połączonego klucza podstawowego (programista, projekt). Jeśli dodać trzecią kolumnę do tego klucza (Id), to nie musi już być wyjątkowy:

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

Korzystanie tylko deweloper i projekt, to będzie działać:

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

Alternatywnie można użyć ID jako jedynego klucza podstawowego i dodać UNIQUE na powściągliwość (programisty, projekt):

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

dla relacji wiele do wielu, można po prostu użyć złożonego klucza podstawowego dwóch pól.

Przykład (przy założeniu, że zarówno PROJECT_ID i developer_id jest liczbą całkowitą)

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

albo:

developer_project table 
developer_id 
project_id 
PRIMARY KEY (developer_id, project_id) 

lub

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

proponujemy pierwszej możliwości, chyba że masz powody, nie do. Istnieją ORMy, które nie radzą sobie dobrze z kluczami złożonymi (podstawowymi).