sql >> Databáze >  >> RDS >> Mysql

Je pro cizí klíče preferován řetězec nebo int?

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.



  1. Udělte uživateli oprávnění pro všechny nové tabulky vytvořené v postgresql

  2. AKTUALIZACE SQL pro začátečníky

  3. Jak opravit chybu při provádění DDL alter table events drop cizího klíče FKg0mkvgsqn8584qoql6a2rxheq prostřednictvím prohlášení JDBC

  4. Chci přidat 30 dní do řádku data mysql