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.