2011-12-06 12 views
5

Note to Mod: Ho letto una dozzina di post che sembravano riguardare questo problema, ma nessuno di loro ha risposto alla mia domanda. Si prega di non contrassegnare questo post per la cancellazione; questa non è una domanda doppia.MySQL richiede una chiave primaria per una tabella di collegamenti molti-a-molti?

Sto costruendo un database per una galleria web che conterrà relazioni molti-a-molti. Ad esempio, tag e immagini. Ovviamente, per raggiungere questo obiettivo verrà creato un terzo link. Posso vedere un uso per avere una colonna chiave primaria nella tabella dei tag e nella tabella delle immagini, ma non riesco a immaginarne un uso nella tabella dei link. Prenderà solo spazio sul server. Quindi, sto pensando di non avere una colonna chiave primaria nella tabella dei link. MySQL lo consente? Oppure, ci sarebbero motivi validi per avere una chiave primaria nella tabella dei link? Grazie.

link Tabella:

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

Chiarimento

Will non avere una chiave primaria in una tabella di rompere il database?

+0

È una chiave primaria _required_? No. C'è quasi sempre un candidato per uno? Sì. Puoi usare una tabella senza indici, ma non è un ottimo approccio per la velocità. :-) – Wiseguy

risposta

6

Non è necessaria la chiave primaria nella tabella di collegamento. Sebbene una chiave composta sia una buona idea. L'unicità può essere ottenuta utilizzando UNIQUE (tag_ids, image_ids)

+1

Una chiave 'UNIQUE' è essenzialmente la stessa di una chiave' PRIMARY' in questa situazione. http://stackoverflow.com/questions/158392/primary-key-versus-unique-constraint – ceejayoz

+0

@ceejayoz - il punto è che puoi avere più vincoli unici in una tabella complessa. E quella chiave primaria non è obbligatoria. Ma sì unico si comporterà come la chiave primaria in questo caso. –

5

Sì, la chiave primaria deve essere una chiave composta/composta di tag_id e image_id, ad esempio PRIMARY KEY (tag_id, image_id). In questo caso non è necessaria una colonna di autoincremento aggiuntiva.

+0

Compound/composite è un nuovo termine per me. È quello di dire che se 'tag_id = 23' e' image_id = 54', quindi 'linke_id' (chiave primaria) dovrebbe essere 2354? Qual è il vantaggio di avere una colonna chiave primaria? –

+0

Una chiave primaria in questo caso ti proteggerà dall'avere lo stesso tag aggiunto più volte e accelera il recupero dei dati dalla tabella. – ceejayoz

+0

Grazie, è molto utile. –

8

Non è necessario avere una chiave primaria.

Tuttavia, non è necessario che una chiave primaria sia solo un campo. In questo caso potresti dichiarare la tua chiave primaria (tag_id, image_id).

Hai una domanda in risposta a un altro post che mi dà l'idea che forse stai pensando di concatenare i due campi per rendere la chiave primaria. Non farlo. Definire la chiave come

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

non dicono

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

(penso "+" è l'operatore di concatenazione in MySQL. E 'stato un po'. Lo standard SQL è "&", ma MySQL utilizza che per qualcos'altro.)

C'è una grande differenza tra i due, vale a dire, nel primo caso, 25,34 e 253,4 sono due valori diversi, mentre nel secondo caso entrambi arrivare trasformato in 2534.

Passerai sempre da una tag all'altra o vorresti passare dall'immagine al tag? Se devi andare in entrambe le direzioni, dovresti creare due indici, o una chiave primaria e un indice, con i campi in entrambe le direzioni.Come:

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

Se si effettua solo il primo (per esempio), quindi prendere in considerazione questa query:

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' 

Questo sembra abbastanza plausbile: trovare tutti i tag che corrispondono immagini che soddisfano una determinata condizione. Ma senza il secondo indice, questa query potrebbe richiedere molto tempo, poiché il db dovrà leggere l'intera tabella dei collegamenti in sequenza per trovare tutti i record con un determinato image_id.

0

Quando si lavora con MySQL Workbench è altamente consigliabile poiché senza una chiave primaria non consentirà alcun accesso ai propri tavoli tranne la sola lettura, il che è un problema quando si prova a testare il database. Anche se sembra inutile avere un PK che non verrà mai referenziato in una relazione.

Problemi correlati