Di solito quando si ha una tabella con una chiave primaria multi-colonna, è il risultato di una tabella di join (molti-a-molti) che diventa elevata per essere la propria entità (e quindi merita la propria chiave primaria). Ci sono molti che sostengono che qualsiasi tabella di join DOVREBBE essere un'entità per impostazione predefinita, ma questa è una discussione per un altro giorno.
Diamo un'occhiata a un'ipotetica relazione da molti a molti:
Studente * --- * Classe
(uno studente può essere in più classi, una classe può avere più studenti).
Tra queste due tabelle ci sarà una tabella di giunzione chiamata StudentClass (o ClassStudent a seconda di come la scrivi). A volte, vuoi tenere traccia di cose come quando lo studente era in classe. Quindi lo aggiungerai alla tabella StudentClass. A questo punto, StudentClass è diventato un'entità unica ... e dovrebbe essere assegnato un nome per riconoscerlo come tale, ad es. Iscrizione.
Studente 1 --- * Iscrizione * --- 1 Classe
(uno studente può avere più iscrizioni, ogni iscrizione è per una classe (o andare nella direzione opposta a una classe può avere più iscrizioni, ogni iscrizione è per uno studente).
Ora puoi interrogare cose come, quanti studenti sono stati arruolati nella classe Chemistry 101 l'anno scorso? O a quali classi è stato iscritto lo studente John Doe mentre frequentava la Acme University? Questo era possibile senza la chiave primaria separata, ma una volta che hai una chiave primaria per l'iscrizione, una query più semplice sarebbe di queste iscrizioni (per id), quanti studenti hanno ricevuto un voto?
La determinazione di se un'entità merita un PK si riduce a quanta query (o manipolazione) si faranno per quell'entità. Diciamo per esempio che volevi allegare i compiti completati per uno studente in una classe. Il luogo logico per collegare questa entità (assegnazione) si trova nell'entità Registrazione. Dando la registrazione la propria chiave primaria renderebbe più semplici le query di assegnazione.