Het hangt ervan af
Er zijn veel bestaande discussies over de afwegingen tussen natuurlijke en surrogaatsleutels - u zult moeten beslissen wat voor u werkt en wat de 'standaard' is binnen uw organisatie.
In het geval van het OP is er zowel een surrogaatsleutel (int userId
) en een natuurlijke sleutel (char
of varchar username
). Elke kolom kan worden gebruikt als primaire sleutel voor de tabel, en hoe dan ook, u kunt nog steeds de uniciteit van de andere sleutel afdwingen.
Hier zijn enkele overwegingen bij het kiezen van een of andere manier:
Het argument voor het gebruik van surrogaatsleutels (bijv. UserId INT AUTO_INCREMENT)
Als u een surrogaat gebruikt (bijv. UserId INT AUTO_INCREMENT
) als de primaire sleutel, dan alle tabellen die verwijzen naar tabel MyUsers
moet dan UserId
. gebruiken als de externe sleutel.
U kunt echter nog steeds de uniciteit van de username
afdwingen kolom door gebruik van een extra unieke index
, bijv.:
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
Volgens @Dagon, met behulp van een smalle primaire sleutel (zoals een int
) heeft prestatie- en opslagvoordelen ten opzichte van het gebruik van een bredere (en variabele lengte) waarde zoals varchar
. Dit voordeel is ook van invloed op andere tabellen die verwijzen naar MyUsers
, als de refererende sleutel naar userid
zal smaller zijn (minder bytes om op te halen).
Een ander voordeel van de surrogaat-getalsleutel is dat de gebruikersnaam eenvoudig kan worden gewijzigd zonder dat dit invloed heeft op tabellen die verwijzen naar MyUsers
.Als de username
werd gebruikt als een natuurlijke sleutel, en andere tabellen zijn gekoppeld aan MyUsers
via username
, maakt het het erg onhandig om een gebruikersnaam te wijzigen (aangezien de Foreign Key-relatie anders zou worden geschonden). Als het bijwerken van gebruikersnamen vereist was voor tabellen met username
als de externe sleutel, een techniek zoals ON UPDATE CASCADE
is nodig om de gegevensintegriteit te behouden.
De argumenten voor het gebruik van natuurlijke sleutels (d.w.z. gebruikersnaam)
Een nadeel van het gebruik van surrogaatsleutels is dat andere tabellen die verwijzen naar MyUsers
via een surrogaatsleutel moet JOIN
. zijn terug naar de MyUsers
tabel als de Username
kolom is vereist. Een van de potentiële voordelen van natuurlijke sleutels is dat als een zoekopdracht alleen de Username
. vereist kolom uit een tabel die verwijst naar MyUsers
, dat het niet terug hoeft te gaan naar MyUsers
om de gebruikersnaam op te halen, wat wat I/O-overhead bespaart.