2011-12-06 15 views
5

Nota para Mod: Leí aproximadamente una docena de publicaciones que parecían pertenecer a este tema, pero ninguna de ellas respondió mi pregunta. No marques esta publicación para eliminarla; esta no es una pregunta duplicada¿Requiere MySQL una clave primaria para una tabla de enlaces de muchos a muchos?

Estoy construyendo una base de datos para una galería web que contendrá relaciones de muchos a muchos. Por ejemplo, etiquetas e imágenes. Obviamente, para lograr esto se creará una tercera, enlace, tabla. Puedo ver un uso para tener una columna de clave principal en la tabla de etiquetas y la tabla de imágenes, pero no puedo imaginar un uso para ella en la tabla de enlaces. Simplemente ocuparía espacio en el servidor. Por lo tanto, estoy pensando en simplemente no tener una columna de clave principal en la tabla de enlaces. ¿MySQL lo permite? O bien, ¿habría alguna razón de peso para tener una clave principal en la tabla de enlaces? Gracias.

Enlace Tabla:

+--------------+---------+-----------+ 
| primary key? | tag ids | image ids | 
+--------------+---------+-----------+ 

Aclaración

Will no tener una clave principal en una tabla romper la base de datos?

+0

¿Es la clave principal _required_? No. ¿Casi siempre hay un candidato para uno? Sí. Puede usar una tabla sin índices, pero ese no es un gran enfoque para la velocidad. :-) – Wiseguy

Respuesta

6

No hay necesidad de clave principal en la tabla de enlaces. Aunque una clave compuesta es una buena idea. Se puede lograr la exclusividad utilizando UNIQUE (tag_ids, image_ids)

+1

Una tecla 'UNIQUE' es esencialmente lo mismo que una tecla' PRIMARY' en esta situación. http://stackoverflow.com/questions/158392/primary-key-versus-unique-constraint – ceejayoz

+0

@ceejayoz - el punto es que puede tener múltiples restricciones únicas en una tabla compleja. Y esa clave principal no es obligatoria. Pero sí único se comportará igual que la clave principal en este caso. –

5

Sí, la clave principal debe ser una clave compuesta/compuesta de tag_id y image_id, es decir, PRIMARY KEY (tag_id, image_id). No hay necesidad de una columna de autoincrement adicional en este caso.

+0

Compuesto/compuesto es un nuevo término para mí. ¿Es eso decir que si 'tag_id = 23' y' image_id = 54', entonces 'linke_id' (clave principal) debería ser 2354? ¿Cuál es la ventaja de tener una columna de clave principal? –

+0

Una clave principal en este caso lo protegerá de tener la misma etiqueta agregada varias veces, y acelerará la recuperación de datos de la tabla. – ceejayoz

+0

Gracias, eso es muy útil. –

8

No es necesario que tenga una clave principal.

Sin embargo, tampoco es obligatorio que una clave principal sea solo un campo. En este caso, puede declarar que su clave principal es (tag_id, image_id).

Tienes una pregunta en respuesta a otra publicación que me da la idea de que tal vez estás pensando que debes concatenar los dos campos para crear la clave principal. No lo hagas Definir la clave como

alter table link add primary key (tag_id, image_id); 

no dicen

alter table link add primary key (tag_id + image_id); 

(creo "+" es el operador de concatenación en MySQL. Ha sido un tiempo. El estándar SQL es "&", pero MySQL utiliza ese por otra cosa.)

Hay una gran diferencia entre los dos, es decir, en el primer caso, 25,34 y 253,4 son dos valores diferentes, mientras que en el segundo caso que ambos llegar a convertirse en 2534.

¿Siempre irá de una etiqueta a otra, o también querrá ir de una imagen a otra? Si necesita ir en ambas direcciones, debe crear dos índices, o una clave principal y un índice, con los campos en ambas direcciones.Al igual que:

create index link_tag_image on link(tag_id, image_id); 
create index link_image_tag on link(image_id, tag_id); 

Si realiza sólo la primera (por ejemplo), y luego considerar esta consulta:

select tag.name 
from image 
join link on image.image_id=link.imagae_id 
join tag on tag.tag_id=link.tag_id 
where image.foo='bar' 

Esto parece bastante plausbile: encontrar todas las etiquetas que coincidan con las imágenes que cumplen una determinada condición. Pero sin el segundo índice, esta consulta podría llevar mucho tiempo, porque el archivo db tendrá que leer la tabla de enlaces completa secuencialmente para encontrar todos los registros con un determinado image_id.

0

Al trabajar con MySQL Workbench es muy aconsejable, ya que sin una clave principal no permitirá el acceso a sus tablas que no sea de solo lectura, lo cual es un problema al intentar probar su base de datos. Aunque parece un desperdicio tener un PK que nunca va a ser referenciado en una relación.

Cuestiones relacionadas