Záleží
Existuje mnoho existujících diskuzí o kompromisech mezi přirozeným a náhradním klíčem - budete se muset rozhodnout, co pro vás funguje a jaký je „standard“ ve vaší organizaci.
V případě OP existuje oba náhradní klíč (int userId
) a přirozený klíč (char
nebo varchar username
). Každý sloupec lze použít jako primární klíč pro tabulku a v obou případech budete stále moci vynutit jedinečnost druhého klíče.
Zde jsou některé úvahy při výběru jednoho nebo druhého způsobu:
Případ použití náhradních klíčů (např. UserId INT AUTO_INCREMENT)
Pokud používáte náhradní, (např. UserId INT AUTO_INCREMENT
) jako primární klíč, pak všechny tabulky odkazující na tabulku MyUsers
pak použijte UserId
jako cizí klíč.
Stále však můžete vynutit jedinečnost username
sloupec pomocí dalšího unikátního indexu
, např.:
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
Podle @Dagon pomocí úzkého primárního klíče (jako int
) má výhody výkonu a úložiště oproti použití širší hodnoty (a proměnné délky), jako je varchar
. Tato výhoda také ovlivňuje další tabulky, které odkazují na MyUsers
, jako cizí klíč k userid
bude užší (méně bajtů k načtení).
Další výhodou náhradního celočíselného klíče je to, že uživatelské jméno lze snadno změnit, aniž by to ovlivnilo tabulky odkazující na MyUsers
.Pokud username
byl použit jako přirozený klíč a ostatní tabulky jsou spojeny s MyUsers
přes username
, je velmi nepohodlné měnit uživatelské jméno (protože by jinak došlo k porušení vztahu cizího klíče). Pokud byla vyžadována aktualizace uživatelských jmen v tabulkách pomocí username
jako cizí klíč, technika jako ON UPDATE CASCADE
je potřeba k zachování integrity dat.
Případ pro použití přirozených klíčů (tj. uživatelské jméno)
Jednou nevýhodou použití náhradních klíčů je, že jiné tabulky odkazují na MyUsers
přes náhradní klíč bude muset být JOIN
ed zpět do MyUsers
pokud Username
sloupec je povinný. Jednou z potenciálních výhod přirozených klíčů je, že pokud dotaz vyžaduje pouze Username
sloupec z tabulky odkazující na MyUsers
, že se nemusí připojovat zpět k MyUsers
k načtení uživatelského jména, což ušetří režii I/O.