Di solito, quando si dispone di una tabella con una chiave primaria multi-colonna, è il risultato di una tabella di join (molti-a-molti) che diventa elevata come 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 molte a molte:
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 esempio Iscrizione.
Studente 1 --- * Iscrizione * --- 1 lezione
(uno studente può avere molte iscrizioni, ogni iscrizione è per una classe (o andando nel modo opposto una classe può avere molte iscrizioni, ogni iscrizione è per uno studente).
Ora puoi fare domande su quanti studenti sono stati iscritti alla classe Chemistry 101 l'anno scorso? O in quali classi era iscritto lo studente John Doe mentre frequentava la Acme University? Ciò era possibile senza la chiave primaria separata, ma una volta che si dispone di una chiave primaria per l'iscrizione, una domanda più semplice sarebbe di queste iscrizioni (per ID), quanti studenti hanno ricevuto un voto di passaggio?
La determinazione del fatto che un'entità meriti un PK si riduce a quanta query (o manipolazione) farai per quell'entità. Diciamo ad esempio che volevi allegare i compiti completati per uno studente in una classe. Il luogo logico in cui allegare questa entità (Assegnazione) sarebbe sull'entità Iscrizione. Dare la registrazione alla propria chiave primaria renderebbe più semplici le query di assegnazione.