2010-01-04 5 views

risposta

8

La definizione corretta per questa tabella è la seguente:

CREATE TABLE user_movies (
    user_id INT NOT NULL, 
    movie_id INT NOT NULL, 
    PRIMARY KEY (user_id, movie_id), 
    FOREIGN KEY (user_id) REFERENCES users(user_id), 
    FOREIGN KEY (movie_id) REFERENCES movies(movie_id) 
) ENGINE=InnoDb; 

Avviso "chiave primaria" è un vincolo, non è una colonna. È consigliabile disporre di una chiave primaria vincolo in ogni tabella. Non confondere il vincolo della chiave primaria con una colonna pseudokey generata automaticamente.

In MySQL, la dichiarazione di una chiave esterna o di una chiave primaria crea implicitamente un indice. Sì, questi sono benefici.

+0

so che questo è vecchio ma non posso evitarlo: per favore usa un nome singolare per il nome della tabella: ad es. ** utente ** e * non * ** utenti ** .. e tutti i DBA hanno goduto! – dwkd

+1

@dwkd, grazie per il suggerimento. Puoi usare la tua convenzione di denominazione e userò la mia. La cosa più importante di una convenzione di denominazione è seguirla in modo coerente. –

1

Indicherei entrambe le colonne separatamente e sì, è possibile eliminare la chiave primaria.

+1

Oppure creare un composto PK. –

0

Se si utilizza un "join-table", probabilmente si useranno alcuni join nelle query, e questi probabilmente trarranno vantaggio da un indice su ciascuna di queste due colonne (che significa due indici separati) .

1

Ho sempre sentito dire che è necessario creare un indice univoco su entrambe le colonne, prima da una parte (user_id + movie_id) poi l'altro modo (movie_id + user_id). Funziona leggermente più veloce (non molto, circa il 10-20%) nella mia applicazione con alcuni test rapidi e sporchi.

Si assicura inoltre che non è possibile avere due righe che legano lo stesso allo stesso user_id (che potrebbe essere buono, ma forse non sempre).

Problemi correlati