2011-11-26 22 views
12

que tienen la siguiente estructura para mi programa de proyectos y desarrollador:MySQL identificador único o valor de id combinado

developer table 
id 
developer name 
etc... 

project table 
id 
project name 
etc... 

developer _project table 
??? 

Debido a que un desarrollador puede estar en varios proyectos y un proyectos puede tener desarrollador múltiple tengo que crear una nueva tabla pero por lo que leí es que no dicen qué identificación debería usar.

Si utilizo un id auto increment + user_id + project_id tendré duplicado ya que el id es la clave principal?

Respuesta

13

Usar una llave combinada único:

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

Si crea una ID que probablemente nunca va a usar ya que se consultará el developer_id y/o project_id en su LEFT JOIN

NOTA: asegúrese de que las definiciones de columna son los mismos que el developer y la project mesas.

+0

¿por qué tienen que ser la misma definición? – zackaryka

+0

digamos que tiene 'INT UNSIGNED' (valor máximo 4294967295 porque no está firmado) de la tabla del desarrollador y' tinyint' (el valor máximo es 127 porque está firmado, la palabra 'unsigned' no está definida) en la tabla de intersección. Debido a que se alcanza el número máximo en la tabla de intersección, no se insertará más que este número, se detendrá en 127 (obtendrá: 'Valor fuera del rango para la columna 'developer_id' en la fila 1'). leer más: http://help.scibit.com/mascon/masconMySQL_Field_Types.html –

+0

lo entiendo, gracias por la sugerencia – zackaryka

1

Una tabla combinada (en el banco de trabajo MySQL llamado automáticamente "developer_has_project") debe usar una clave primaria combinada (desarrollador, proyecto). Si se agrega una tercera columna para esta clave (ID) ya no tiene que ser único:

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

Usando sólo el desarrollador y el proyecto, que funcionará:

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

otra posibilidad es utilizar la Identificación como la única clave primaria, y añadir una restricción UNIQUE en (desarrollador, del proyecto):

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

para la relación de muchos a muchos, podría simplemente usar la clave primaria compuesta de dos campos.

Ejemplo (asumiendo tanto project_id y developer_id se entero):

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

O bien:

developer_project table 
developer_id 
project_id 
PRIMARY KEY (developer_id, project_id) 

o

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

I sugerimos que utilice la primera opción, a menos que tengas razones para no a. Hay ORM que no soportan bien las claves compuestas (primarias).

Cuestiones relacionadas