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.