Vad välja som primärnyckel till en databastabell?

  • Författare
  • Meddelande
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10975
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Vad välja som primärnyckel till en databastabell?

Inlägg18 apr 2017, 23:14

Hur svårt kan det vara att välja en primärnyckel till en databastabell?

Låt oss försöka bryta ut vad kärnan i primärnyckelns funktion är och vilka alternativ vi har och vad vi bör beakta.

När man modellerar en databas så har man ofta naturliga nycklar som kan göra en rad unik. När vi modellerar kallar vi dessa kandidatnycklar, det är en eller flera kolumner, eller kombinationer av kolumner, som gör en rad unik. En naturlig nyckel utgörs av befintliga kolumn(er). Den naturliga kandidat nyckeln är alltså redan en del av den befintliga värdemängden.

Om man inte är nöjd med de kandidatnycklar som finns så kan man alltid ta in en surrogatnyckel, till exempel i form av en siffra. En surrogatnyckel finns inte naturligt i värdemängden och är ett extra bihang som enbart finns för att göra raden unik.

Sedan väljer man primärnyckel från de kandidatnycklar man har.

Här bör man betänka att nyckeln skall vara unik och den bör inte ändras. Att ändra en primärnyckel kan få konsekvenser.

Någon skulle solklart hävda att ett personnummer är unikt och kan fungera som primärnyckeln. Men någon annan skulle lika säkert kunna ifrågasätta hur unikt ett personnummer verkligen är och hur framtidssäker det valet av naturlig nyckel vore. Kanske är en surrogatnyckel ett gott alternativ?

Det leder oss till regel 1.

1. Välj en primärnyckel som är unik och tillräckligt framtidssäker.

Någon skulle kunna hävda att det är enklast att alltid använda surrogatnycklar om INTEGER AUTO_INCREMENT, det är unikt, framtidssäkert och INTEGER är effektiv som primärnyckel. Detta leder oss fram till regel 2.

2. Välj inte en surrogatnyckel av slentrian.

Vilken datatyp bör man ha för en nyckel, kan någon fråga. Någon svarar då att alla datatyper som vald storage engine stödjer, är möjliga datatyper för en primärnyckel. Det är fullt logiskt korrekt.

Normalt försöker man välja datatyper INTEGER, CHAR eller möjligen VARCHAR som datatyp. Troligen är valet redan gjort efter regel 1. Men kan man påverka det så är gäller att kortare nyckel tar mindre plats och kan eventuellt påverka lagringsutrymme och prestanda. Men vi är potentiell inne på området om premature optimizations (PO), så håll dig till regel 1.

Om vi ändå skall ha en regel så får det bli något i stil med följande.

3. Välj medvetet mellan SIGNED/UNSIGNED INTEGER och välj medvetet CHARSET för CHAR/VARCHAR. Båda kan påverka nyckelns omfång och behov av lagring.

4. Har du möjlighet att välja? Ta då en kortare nyckel.

Så, man kan ha en VARCHAR(80) CHARACTER SET utf8 som primärnyckel. Det kan kännas stort och personligen hade jag normalt sett mig om efter alternativa nycklar. Men svaret är att det går bra att skapa en sådan nyckel, inget hindrar det, databasen fungerar.

Är det bra eller inte? Spelar det någon roll? Hur många rader finns det i tabellen? Används nyckeln för att joina? Finns det sekundära index som är kopplade till primärnyckeln? Det kan bara du som utvecklar databasen svara på. Undvik PO.

Applikationen som sådan kan också påverka valet av nycklar. Någon kan hävda att det är enklare att ha en kurskod som nyckel och främmande nyckel då den är tydlig och dess innehåll uppenbart. Samma person påpekar det negativa att joina tabeller med surrogatnycklar (INTEGER) och förordar tydligheten i en CHAR(6) för kurskoden. Någon annan försöker då påpeka prestanda i joins och lagringsutrymme för nyckel och sekundära index.

Om ni då inte kommer överens så backar ni till regel 1 och påtalar för er själva att undvika PO.

Egentligen räcker regel 1.

Bidra med dina egna tankar och "regler" om vad du anser viktigt vid val av primärnyckel.
...
..:
.... /mos
Online
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10975
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Vad välja som primärnyckel till en databastabell?

Inlägg18 apr 2017, 23:22

När man väl valt primärnyckel och lägger till en FOREIGN KEY så bör man läsa på om följande, och dess varianter, för att se om det kan vara till nytta.
ON DELETE CASCADE
ON UPDATE CASCADE
...
..:
.... /mos

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 7 gäster