Guide: PHP- & MySQL-innføring: Kapittel 9
Databasenormalisering
Forrige gang lærte vi det mest grunnleggende om databaser. Nå skal vi sette opp databasene på best mulig måte.
Første normalform
Første normalform (1NF) krever at hver rad i en tabell innehold er såkalt atomisk verdi; dvs. en verdi som ikke kan deles opp i flere verdier. Første normalform krever også at hver rad i tabellen unikt kan identifiseres gjennom en primærnøkkel.
Om vi setter opp en rad med noen av kolonnene fra eksempelet på forrige side direkte i en tabell;
| Navn | Telefon | Fødselsdato |
|---|---|---|
| Ola Nordmann |
12345678 (h), 23456789 (j), 98765432 (m) |
12. januar 1978 |
Slik tenker nok de aller fleste når de skal lage sin første tabell, og i denne tabellen ville jeg gjerne også hatt med egne kolonner for postadresse, ektefelle, barn og venner om eksempelet skulle vært komplett.
Atomiske verdier
Første biten av første normalform sier at hver rad bør inneholde en atomisk verdi; dvs. at en verdi ikke kan representere flere verdier. Ovenfor ser du at Telefon-kolonnen har tre verdier for Olas telefonnummer, og det er ikke tillatt i 1NF, og vi er nødt til å splitte disse verdiene opp.| Navn | Telefon | Fødselsdato |
|---|---|---|
| Ola Nordmann | 12345678 (h) | 12. januar 1978 |
| Ola Nordmann | 23456789 (j) | 12. januar 1978 |
| Ola Nordmann | 98765432 (m) | 12. januar 1978 |
I stedet for å ha en enkelt rad som representerer Ola, har vi nå tre rader, bare for å representere telefonnummeret.
Unike rader
Sett at Ola jobber i lag med en navnebror som tilfeldigvis er født på samme dag, og jobbtelefonnummeret hans er det samme som Olas (selskapets sentralbord). Vi får nå problemer med å identifisere hvilke rader som hører til hvilken Ola;| Navn | Telefon | Fødselsdato |
|---|---|---|
| Ola Nordmann | 12345678 (h) | 12. januar 1978 |
| Ola Nordmann | 23456789 (j) | 12. januar 1978 |
| Ola Nordmann | 98765432 (m) | 12. januar 1978 |
| Ola Nordmann | 23456789 (j) | 12. januar 1978 |
| Ola Nordmann | 97654321 (m) | 12. januar 1978 |
For å løse dette problemet må vi lage en primærnøkkel; dvs. en nøkkel som unikt kan identifisere en rad i en tabell. Om du har et sett med verdier som du alltid vet er unike, kan du bruke dem; i Norge kunne fødselsnummeret til en person vært et godt valg når man lagrer personopplysninger. Det er derimot ikke tillatt å lagre til vanlig, og vi bruker derfor bare et unikt tall;
| Id. | Navn | Telefon | Fødselsdato |
|---|---|---|---|
| 1 | Ola Nordmann | 12345678 (h) | 12. januar 1978 |
| 2 | Ola Nordmann | 23456789 (j) | 12. januar 1978 |
| 3 | Ola Nordmann | 98765432 (m) | 12. januar 1978 |
| 4 | Ola Nordmann | 23456789 (j) | 12. januar 1978 |
| 5 | Ola Nordmann | 97654321 (m) | 12. januar 1978 |
Nå er det ikke lenger noe problem å finne frem til en enkelt rad i databasen, men du kan se at vi ikke kan se forskjell på hvilken Ola det er snakk om. Grunnen til dette ser vi når vi går videre i normalformene. I noen tilfeller kan primærnøkkelen også være en sammensetning av kolonner i tabellen, der du alltid vet at alle kombinasjoner er unike. Primærnøkkelen vi nå laget er en såkalt enkel primærnøkkel, mens en primærnøkkel som består av flere kolonner er en sammensatt primærnøkkel.