Mysql
 sql >> Database >  >> RDS >> Mysql

In quali condizioni è necessario utilizzare chiavi composite nel database

Le chiavi composite non dovrebbero mai essere considerate nelle "nuove" applicazioni. Erano usati in passato, da persone che pensavano che le "chiavi aziendali" fossero migliori delle "chiavi surrogate".

Modifica:come chiesto da Chris, sto ampliando la mia risposta.

Vorrei iniziare affermando che ho capito questa domanda come "chiavi primarie composite" rispetto a "chiavi surrogate".

Inoltre, ammetto che ce n'è uno caso d'uso in cui una chiave composita ha senso:nelle tabelle di riferimento incrociato, dette anche "tabelle di collegamento". Questi sono usati nelle tabelle molti-a-molti e consistono in due soli campi, entrambi chiavi esterne che formano una chiave primaria per la tabella xrif. Ad esempio, UserRole la tabella conterrebbe user_id e role_id , nient'altro. Non esiste una rappresentazione di classe in Java, ad esempio, per una tabella come questa. Di solito è un @ManyToMany , con una Collection in entrambi i lati.

Ho condiviso le mie opinioni su chiavi naturali e chiavi surrogate in un'altra risposta ( Ibernazione:opinioni in Composite PK vs Surrogate PK ) e credo che le chiavi composite condividano alcuni degli svantaggi della chiave naturale, senza apportare alcun beneficio reale.

Il problema con le chiavi composte è che te ne serviranno due valori per identificare univocamente un record. Questo diventa un problema quando inizi ad avere tabelle che fanno riferimento a record in questa prima tabella. La seconda tabella quindi ha bisogno di due colonne per poter fare riferimento a uno disco. E se questa seconda tabella utilizza una chiave composta composta da un unico valore + la chiave esterna, ora ne hai tre colonne per identificare in modo univoco uno disco. E un terzo tavolo avrebbe bisogno di questi tre colonne extra solo per fare riferimento a uno registrare nella seconda tabella. Davvero, questa è una palla di neve.

Un altro svantaggio è che i requisiti do modificare. Tutto il tempo. Quindi, quella che sembra essere una buona chiave composita oggi non è affatto una chiave domani. Ecco perché abbiamo delle chiavi surrogate:per essere a prova di futuro.

Le chiavi composite vengono utilizzate principalmente in modo che i record in una tabella siano univoci in base a un insieme di colonne. Ad esempio, se hai un Customers tabella, potresti avere un NationalId +Country come valore univoco, il che significa che due utenti non possono condividere lo stesso SSN se il loro paese è USA. Ma è possibile avere lo stesso numero per due record, se non si trovano nello stesso paese. Se ti piacciono le chiavi composite, questo sarebbe un buon candidato. Ma come ho accennato in precedenza, puoi usare una chiave surrogata e applicare un unique vincolo. Avrai i vantaggi di una chiave composita più la sicurezza di una chiave surrogata.