Dipende
Ci sono molte discussioni esistenti sui compromessi tra chiavi naturali e surrogate - dovrai decidere cosa funziona per te e qual è lo "standard" all'interno della tua organizzazione.
Nel caso dell'OP, esiste sia una chiave surrogata (int userId
) e una chiave naturale (char
o varchar username
). Entrambe le colonne possono essere utilizzate come chiave primaria per la tabella e, in ogni caso, sarai comunque in grado di imporre l'univocità dell'altra chiave.
Ecco alcune considerazioni sulla scelta di un modo o dell'altro:
Il caso per l'utilizzo di chiavi surrogate (ad es. UserId INT AUTO_INCREMENT)
Se utilizzi un surrogato, (ad es. UserId INT AUTO_INCREMENT
) come chiave primaria, quindi tutte le tabelle fanno riferimento alla tabella MyUsers
dovrebbe quindi utilizzare UserId
come chiave esterna.
Puoi comunque imporre l'univocità del username
colonna tramite l'uso di un ulteriore indice univoco
, ad esempio:
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
Come per @Dagon, usando una chiave primaria stretta (come un int
) offre vantaggi in termini di prestazioni e archiviazione rispetto all'utilizzo di un valore più ampio (e di lunghezza variabile) come varchar
. Questo vantaggio influisce anche su altre tabelle che fanno riferimento a MyUsers
, come chiave esterna per userid
sarà più stretto (meno byte da recuperare).
Un altro vantaggio della chiave intera surrogata è che il nome utente può essere modificato facilmente senza influire sulle tabelle che fanno riferimento a MyUsers
.Se il username
è stata utilizzata come chiave naturale e altre tabelle sono accoppiate a MyUsers
tramite username
, rende molto scomodo modificare un nome utente (poiché la relazione della chiave esterna verrebbe altrimenti violata). Se è stato richiesto l'aggiornamento dei nomi utente sulle tabelle utilizzando username
come chiave esterna, una tecnica come ON UPDATE CASCADE
è necessario per mantenere l'integrità dei dati.
Il caso dell'utilizzo di chiavi naturali (ovvero nome utente)
Uno svantaggio dell'utilizzo delle chiavi surrogate è che altre tabelle fanno riferimento a MyUsers
tramite una chiave surrogata dovrà essere JOIN
ed è tornato a MyUsers
tabella se il Username
la colonna è obbligatoria. Uno dei potenziali vantaggi delle chiavi naturali è che se una query richiede solo il Username
colonna da una tabella che fa riferimento a MyUsers
, che non è necessario che si unisca nuovamente a MyUsers
per recuperare il nome utente, che salverà un po' di sovraccarico di I/O.