Domene–nøkkel normalform

**Domene–nøkkel normalform** (**DKNF**) er en normalform som brukes i databasenormalisering som krever at databasen ikke inneholder andre begrensninger enn domenebegrensninger og nøkkelbegrensninger.

En domenebegrensning spesifiserer de tillatte verdiene for en gitt attributt, mens en nøkkelbegrensning spesifiserer attributtene som unikt identifiserer en rad i en gitt tabell.

Domene–nøkkel normalformen oppnås når enhver begrensning på relasjonen er en logisk konsekvens av definisjonen av nøkler og domener, og håndheving av nøkkelens og domenets begrensninger og betingelser fører til at alle begrensninger blir oppfylt. Dermed unngår DKNF alle ikke-temporale anomalier.

Grunnen til å bruke domene–nøkkel normalformen er å unngå å ha generelle begrensninger i databasen som ikke klart er domenebegrensninger eller nøkkelbegrensninger. De fleste databaser kan enkelt teste domene- og nøkkelbegrensninger på attributter. Imidlertid vil generelle begrensninger normalt kreve spesiell databaseprogrammering i form av lagrede prosedyrer (ofte av utløservarianten) som er dyre å vedlikeholde og dyre for databasen å kjøre. Derfor blir generelle begrensninger delt inn i domene- og nøkkelbegrensninger.

Det er mye lettere å bygge en ny database på domene–nøkkel normalform enn det er å konvertere fra databaser av lavere normaliseringsgrad som kan inneholde mange uregelmessigheter. Å lykkes med å bygge en database på domene–nøkkel normalform er fortsatt en vanskelig oppgave, selv for erfarne databaseurviklere. Dermed, mens domene-/nøkkel normalformen eliminerer problemene som finnes i de fleste databaser pleier det å være den mest kostbare normalformen å oppnå. Hvis man ikke oppnår domene–nøkkel normalformen kan det imidlertid medføre langsiktige, skjulte kostnader på grunn av uregelmessigheter som oppstår i databaser som bare følger lavere normalformer over tid.

Tredje normalform, Boyce–Codd normalform, fjerde normalform og femte normalform er spesielle tilfeller av domene–nøkkel normalformen. Alle har enten funksjonelle, flervaluerte eller skjøte-avhengigheter som kan konverteres til supernøkler. Domenene på disse normaleformene var ubegrensede, slik at alle domenebegrensninger er oppfylt. Imidlertid vil det å transformere disse høyere normalformene til domene–nøkkel normalform ikke alltid være en avhengighetsbevarende transformasjon, og er derfor ikke alltid mulig.

## Eksempel
Et brudd på DKNF forekommer i følgende tabell:

Anta at:
* Domenet for {Velstående person} består av navnene på alle velstående personer i et forhåndsdefinert utvalg av velstående personer.
* Domenet for {Velstående persontype} består av verdiene 'Millionær' og 'Milliardær'.
* Domenet for {Nettoverdi i kroner} består av alle heltall større enn eller lik 1 000 000.)

Det er en begrensning som knytter {Rik persontype} til {Nettoverdi i kroner}, selv om vi ikke kan utlede det ene fra det andre. Begrensningen tilsier at en millionær vil ha en nettoverdi på 1 000 000 til 999 999 999 inklusiv, mens en milliardær vil ha en nettoverdi på 1 000 000 000 eller høyere. Denne begrensningen er verken en domenebegrensning eller en nøkkelbegrensning. Derfor kan vi ikke stole på domenebegrensninger og nøkkelbegrensninger for å garantere at en inkonsistent kombinasjon av {Velstående persontype} og {Nettoverdi i kroner} ikke kommer inn i databasen.

DKNF-bruddet kan elimineres ved å fjerne kolonnen {Velstående persontype}. Den velstående personens status som millionær eller milliardær bestemmes av nettoverdien i kroner, som definert i {Formuesstatus}-tabellen, altså vil ingen nyttig informasjon gå tapt.

## Fremmednøkler
Relasjoner som er umulige å uttrykke som fremmednøkler er åpenbare brudd på DKNF. 

Et eksempel på brudd på DKNF er hvis en {Foreldre-ID}-attributt peker til en av flere refererte tabeller, dersom den igjen er avhengig av en annen {Foreldretype}-attributt.

## Se også
* Referanseintegritet
* Databasenormalisering

## Referanser