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.
Andre normalform
Den andre normalformen (2NF) krever at alle data i en tabell er avhengige av hele primærnøkkelen. Om det er data i tabellen som bare delvis er avhengig av primærnøkkelen, må de splittes ut i separate tabeller.
Kravene for å nå andre normalform er altså at tabellen må være i første normalform, og at alle kolonner som ikke er nøkler er totalt avhengig av hele nøkkelen i tabellen.
Om vi ser på vår kontaktliste igjen, kunne en representasjon av en person og hans arbeidsplass vært følgende;
| PersonID* | ArbeidsgiverID* | Navn | Arbeidsgiver | Kontor |
|---|---|---|---|---|
| 1 | 23 | Ola Nordmann | Hardware Online AS | 231 |
Vi har her oppgitt en arbeidsgiver-id, siden det gjerne er flere som jobber hos Hardware Online AS; og det er derfor naturlig at denne ID-en er en del av primærnøkkelen. En persons navn er kun avhengig av PersonID, mens navnet på arbeidsgiveren kun er avhengig ArbeidsgiverID. Kontoret er derimot avhengig av både ArbeidsgiverID og PersonID. Det gjør at det blir naturlig å dele denne opp i tre tabeller; en som angir personinformasjon, en som gir arbeidsgiverinformasjon, og en som setter opp en kobling mellom disse.
Person
| PersonID* | Navn |
|---|---|
| 1 | Ola Nordmann |
Arbeidsgiver
| ArbeidsgiverID* | Navn |
|---|---|
| 23 | Hardware Online AS |
Arbeidsforhold
| PersonID* | ArbeidsgiverID* | Kontor |
|---|---|---|
| 1 | 23 | 231 |
Som du kan se, har vi nå delt vår originale tabell i tre forskjellige tabeller som alle er i 2NF. Selve arbeidsforholdet mellom en person og en arbeidsgiver er nå i en separat tabell. Det gjør at vi faktisk har fått utvidede muligheter i forhold til hva vi originalt tenkte oss; vi kan nå la en person være ansatt i flere firmaer. Ved å sette inn en ekstra kolonne i Arbeidsforhold som vi kaller "Stilling", kan vi også oppgi hvilken stilling man har.
Derimot, siden Arbeidsforhold har en kombinert primærnøkkel på PersonID og ArbeidsgiverID, er det ikke mulig for en person å være ansatt med to forskjellige stillinger i en bedrift. Hvordan ville du fikset det?