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

Er streng eller int at foretrække for fremmednøgler?

Det afhænger af

Der er mange eksisterende diskussioner på afvejningen mellem naturlige og surrogatnøgler - du skal beslutte dig for, hvad der virker for dig, og hvad "standarden" er i din organisation.

I OP's tilfælde er der både en surrogatnøgle (int userId ) og en naturlig nøgle (char eller varchar username ). Begge kolonner kan bruges som en primær nøgle til tabellen, og i begge tilfælde vil du stadig være i stand til at gennemtvinge den anden nøgles unikke karakter.

Her er nogle overvejelser, når du vælger den ene eller den anden måde:

Sagen til brug af surrogatnøgler (f.eks. UserId INT AUTO_INCREMENT)

Hvis du bruger et surrogat (f.eks. UserId INT AUTO_INCREMENT ) som den primære nøgle, derefter alle tabeller, der refererer til tabellen MyUsers skal derefter bruge UserId som fremmednøgle.

Du kan dog stadig gennemtvinge entydigheden af ​​username kolonne ved brug af et yderligere unikt indeks , f.eks.:

CREATE TABLE `MyUsers` (
  `userId` int NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  ... other columns
  PRIMARY KEY(`userId`),
  UNIQUE KEY UQ_UserName (`username`)

Ifølge @Dagon, ved hjælp af en smal primær nøgle (som en int ) har ydeevne- og lagerfordele i forhold til at bruge en bredere (og variabel længde) værdi som varchar . Denne fordel påvirker også yderligere tabeller, der henviser til MyUsers , som fremmednøgle til userid vil være smallere (færre bytes at hente).

En anden fordel ved surrogat-heltalsnøglen er, at brugernavnet nemt kan ændres uden at påvirke tabeller, der refererer til MyUsers .Hvis username blev brugt som en naturlig nøgle, og andre tabeller er koblet til MyUsers via username , gør det det meget ubelejligt at ændre et brugernavn (da Foreign Key-forholdet ellers ville blive krænket). Hvis opdatering af brugernavne var påkrævet på tabeller med username som fremmednøgle, en teknik som ON UPDATE CASCADE er nødvendig for at bevare dataintegriteten.

Tilfældet for at bruge naturlige nøgler (dvs. brugernavn)

En ulempe ved at bruge Surrogate Keys er, at andre tabeller, der refererer til MyUsers via en surrogatnøgle skal JOIN være ed tilbage til MyUsers tabel hvis Username kolonne er påkrævet. En af de potentielle fordele ved naturlige nøgler er, at hvis en forespørgsel kun kræver Username kolonne fra en tabel, der refererer til MyUsers , at det ikke behøver at slutte sig tilbage til MyUsers for at hente brugernavnet, hvilket vil spare nogle I/O-overhead.



  1. Hvordan sammenkædes kolonner i en Postgres SELECT?

  2. Parse filnavn og sti fra fuld sti

  3. MySQL-udvælgede felter, der indeholder førende eller efterfølgende mellemrum

  4. Sådan indsættes i MYSQL-rækken fra flere $_POST-arrays