sql >> Database >  >> RDS >> Mysql

Heeft string of int de voorkeur voor externe sleutels?

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.



  1. MySQL converteert graden, minuten, seconden naar decimaal graden

  2. Converteer JS date time naar MySQL datetime

  3. Hoe efficiënt is het vanuit prestatieperspectief om een ​​tijdelijke MySQL-tabel te gebruiken voor een veelgebruikte websitefunctie?

  4. (provider:Named Pipes Provider, fout:40 - Kan geen verbinding maken met SQL Server)