Perché utilizzare più colonne come chiavi primarie (chiave primaria composta)

Questo esempio è tratto da w3schools .

CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) ) 

La mia comprensione è che entrambe le colonne insieme ( P_Id e LastName ) rappresentano una chiave primaria per la tabella Persons . È corretto?

  • Perché qualcuno dovrebbe voler utilizzare più colonne come chiavi primarie invece di una singola colonna?
  • Quante colonne possono essere utilizzate insieme come chiave primaria in una data tabella?

La tua comprensione è corretta.

Lo faresti in molti casi. Un esempio è in una relazione come OrderHeader e OrderDetail . Il PK in OrderHeader potrebbe essere OrderNumber . Il PK in OrderDetail potrebbe essere OrderNumber AND LineNumber . Se fosse uno di questi due, non sarebbe unico, ma la combinazione dei due è garantita unica.

L’alternativa è usare una chiave primaria generata (non intelligente), per esempio in questo caso OrderDetailId . Ma allora non vedresti sempre la relazione facilmente. Alcuni preferiscono un modo; alcuni preferiscono l’altro modo.

Un altro esempio di chiavi primarie composte è l’utilizzo delle tabelle di associazione. Supponiamo di avere una tabella di persone che contiene un gruppo di persone e una tabella di gruppo che contiene un gruppo di gruppi. Ora vuoi creare una relazione molte a molte di persona e di gruppo. Il significato di ogni persona può appartenere a molti gruppi. Ecco come apparirà la struttura della tabella utilizzando una chiave primaria composta.

 Create Table Person( PersonID int Not Null, FirstName varchar(50), LastName varchar(50), Constraint PK_Person PRIMARY KEY (PersonID)) Create Table Group ( GroupId int Not Null, GroupName varchar(50), Constraint PK_Group PRIMARY KEY (GroupId)) Create Table GroupMember ( GroupId int Not Null, PersonId int Not Null, CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId), CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId), CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, PersonID)) 

L’esempio di W3Schools non dice quando si devono usare le chiavi primarie composte e si dà solo una syntax di esempio usando la stessa tabella di esempio delle altre chiavi.

La loro scelta di esempio è forse fuorviante combinando una chiave senza significato (P_Id) e una chiave naturale (LastName). Questa strana scelta della chiave primaria dice che le seguenti righe sono valide secondo lo schema e sono necessarie per identificare univocamente uno studente. Intuitivamente questo non ha senso.

 1234 Jobs 1234 Gates 

Ulteriori letture: il grande dibattito sulla chiave primaria o semplicemente le meaningless primary keys Google o anche sfogliare questa domanda dell’SO

FWIW – I miei 2 centesimi sono per evitare chiavi primarie a più colonne e utilizzare un singolo campo ID generato (chiave surrogata) come chiave primaria e aggiungere ulteriori vincoli (univoci) dove necessario.

Sì, entrambi formano la chiave primaria. Soprattutto nelle tabelle in cui non si dispone di una chiave surrogata , potrebbe essere necessario specificare più attributi come identificatore univoco per ciascun record (esempio errato: una tabella con sia un nome che un cognome potrebbe richiedere la combinazione di essi per essere unico).

Le colonne multiple in una chiave, in generale, hanno prestazioni più scarse rispetto a una chiave surrogata. Preferisco avere una chiave surrogata e quindi un indice univoco su una chiave a più colonne. In questo modo puoi avere prestazioni migliori e mantenere l’unicità necessaria. E ancora meglio, quando uno dei valori in quella chiave cambia, non è necessario aggiornare un milione di voci figlio in 215 tabelle figlio.

Si utilizza una chiave composta (una chiave con più di un attributo) ogni volta che si desidera garantire l’unicità di una combinazione di più attributi. Una singola chiave attributo non raggiungerebbe la stessa cosa.

La tua seconda domanda

Quante colonne possono essere utilizzate insieme come chiave primaria in una data tabella?

è specifico per l’implementazione: è definito nel DBMS effettivo utilizzato. [1], [2], [3] Devi controllare le specifiche tecniche del sistema di database che usi. Alcuni sono molto dettagliati, altri no. La ricerca sul Web di questa limitazione può essere difficile perché la terminologia varia. Il termine chiave primaria composta deve essere reso obbligatorio;)

Se non riesci a trovare informazioni esplicite, prova con un database di test per assicurarti di poter aspettarti una gestione stabile (e specifica) della violazione dei limiti (che sono ragionevolmente prevedibili). Fai attenzione a ottenere le giuste informazioni a riguardo: a volte i limiti vengono accumulati e vedrai risultati diversi con diversi layout di database.


  • [1] sql – Limite chiave primaria composita? – Stack Overflow
  • [2] SQL Server: colonne massime per chiave primaria
  • [3] Quanti numeri massimi di colonne possono far parte della chiave primaria in una tabella in Oracle 9i e 10g?

L’utilizzo di una chiave primaria su più tabelle è utile quando si utilizza una tabella intermedia in un database relazionale.

Userò un database che ho creato per un esempio e in particolare tre tabelle all’interno di quella tabella. Ho creato un database per un webcomic alcuni anni fa. Un tavolo era chiamato “fumetti”: un elenco di tutti i fumetti, i loro titoli, il nome del file immagine, ecc. La chiave principale era “comicnum”.

Il secondo tavolo era “personaggi”, i loro nomi e una breve descrizione. La chiave primaria era su “charname”.

Dato che ogni fumetto – con alcune eccezioni – aveva più personaggi e ogni personaggio appariva in più fumetti, non era pratico mettere una colonna in “personaggi” o “fumetti” per riflettere questo. Invece, ho creato un terzo tavolo chiamato “comicchars”, e questo era un elenco di quali personaggi apparivano in cui i fumetti. Poiché questa tabella essenzialmente si univa alle due tabelle, aveva bisogno di due colonne: charname e comicnum e la chiave primaria era su entrambe.