Wat is Normalisatie?

Ontwerpprocedure die tabellen van een relationele database opsplitst op basis van functionele afhankelijkheden tussen kolommen, zodat hetzelfde feit niet op meerdere plekken wordt vastgelegd. Ze verwijdert dubbele gegevens en voorkomt wijzigings-, invoeg- en verwijderanomalieën. De stappen omvatten de eerste tot en met de derde normaalvorm en de Boyce-Codd-normaalvorm.

Japanse benaming: 正規化

“Normalisatie” komt voor in 3 oefenvragen uit 1 onderwerpen, bijv. Basis van databases.

Vakgebied: Basis van databases

Anomalieën die normalisatie voorkomt

In een niet-genormaliseerde tabel wordt hetzelfde feit herhaaldelijk in veel rijen vastgelegd. Als bijvoorbeeld elke rij van een tabel met medewerkers ook de naam van de afdeling bevat, moeten bij het hernoemen van een afdeling de rijen van alle medewerkers van die afdeling worden herschreven, en wordt er een overgeslagen, dan wordt de inhoud inconsistent (een wijzigingsanomalie). Een afdeling zonder medewerkers kan nog niet worden geregistreerd (een invoeganomalie), en het verwijderen van de laatste medewerker van een afdeling wist ook de informatie over de afdeling (een verwijderanomalie). Door de informatie over afdelingen naar een aparte tabel te verplaatsen, wordt elk feit op maar één plek vastgelegd en worden deze anomalieën voorkomen.

Van de eerste tot de derde normaalvorm

De eerste normaalvorm is de toestand waarin elke kolom één enkele, niet-herhalende waarde bevat. De tweede normaalvorm is de eerste normaalvorm zonder kolom die afhangt van slechts een deel van de primaire sleutel (geen partiële functionele afhankelijkheid); dit speelt bij tabellen waarvan de primaire sleutel uit meerdere kolommen bestaat. De derde normaalvorm is de tweede normaalvorm zonder kolom die wordt bepaald via een andere kolom dan de primaire sleutel (geen transitieve functionele afhankelijkheid). Is er bijvoorbeeld een afhankelijkheid zoals BestelNr → KlantNr → Klantnaam, dan worden KlantNr en Klantnaam naar een aparte tabel verplaatst. Tabellen worden zo opgesplitst dat een join op hun gemeenschappelijke kolommen de oorspronkelijke tabel zonder informatieverlies herstelt.

Afweging tegen denormalisatie

Normalisatie verwijdert duplicatie, maar het opsplitsen van tabellen betekent dat er bij elke zoekopdracht joins nodig zijn. In databases die vooral worden gebruikt om te lezen en te aggregeren, worden tabellen soms bewust samengevoegd en wordt er voor de prestaties weer duplicatie ingevoerd; dat is denormalisatie. Er is dan een mechanisme nodig om de dubbele gegevens consistent bij te werken. Databases voor transactieverwerking met veel wijzigingen worden in de regel tot de derde normaalvorm genormaliseerd.

Nu oefenen: vragen over Normalisatie

Wat is het belangrijkste doel van de normalisatie van tabellen in een relationele database?

  1. AHet aantal tabellen verminderen, zodat elke zoekopdracht snel en zonder joins kan worden uitgevoerd
  2. BGegevens versleutelen, zodat onbevoegde gebruikers ze niet kunnen lezen
  3. CDubbele gegevens wegwerken en anomalieën voorkomen, zoals inhoud die na een wijziging inconsistent wordt
Antwoord en toelichting tonen

Antwoord: C. Dubbele gegevens wegwerken en anomalieën voorkomen, zoals inhoud die na een wijziging inconsistent wordt

Normalisatie is een ontwerpprocedure die tabellen opsplitst op basis van functionele afhankelijkheden tussen kolommen (een relatie waarbij de waarde van een kolom de waarde van een andere kolom eenduidig bepaalt), zodat hetzelfde feit niet op meerdere plekken wordt vastgelegd. Als bijvoorbeeld elke rij van een tabel met medewerkers ook de naam van de afdeling bevat, moeten bij het hernoemen van een afdeling de rijen van alle medewerkers van die afdeling worden herschreven, en wordt er een overgeslagen, dan wordt de inhoud inconsistent (een wijzigingsanomalie). Er ontstaan ook andere problemen: een afdeling zonder medewerkers kan nog niet worden geregistreerd (een invoeganomalie), en het verwijderen van de laatste medewerker van een afdeling wist ook de informatie over de afdeling (een verwijderanomalie). Als de informatie over afdelingen naar een aparte tabel Afdeling wordt verplaatst, hoeft een afdelingsnaam maar op één plek te worden gecorrigeerd. Aan de andere kant betekent het opsplitsen van tabellen meer joins bij het zoeken, dus normaliseren maakt zoekopdrachten niet per se sneller.

De primaire sleutel van de tabel Bestelling (BestelNr, ArtikelNr, Aantal, KlantNr, Klantnaam) is {BestelNr, ArtikelNr}, en de functionele afhankelijkheden zijn {BestelNr, ArtikelNr} → Aantal, BestelNr → KlantNr en KlantNr → Klantnaam. Wat is het juiste resultaat van de normalisatie van deze tabel tot de derde normaalvorm?

  1. ABestelregel (BestelNr, ArtikelNr, Aantal, KlantNr), Klant (KlantNr, Klantnaam)
  2. BBestelregel (BestelNr, ArtikelNr, Aantal), Bestelling (BestelNr, KlantNr), Klant (KlantNr, Klantnaam)
  3. CBestelregel (BestelNr, ArtikelNr, Aantal), Bestelling (BestelNr, KlantNr, Klantnaam)
Antwoord en toelichting tonen

Antwoord: B. Bestelregel (BestelNr, ArtikelNr, Aantal), Bestelling (BestelNr, KlantNr), Klant (KlantNr, Klantnaam)

De tweede normaalvorm is een toestand in de eerste normaalvorm waarin geen kolom afhangt van slechts een deel van de primaire sleutel (geen partiële functionele afhankelijkheid). BestelNr → KlantNr is een partiële functionele afhankelijkheid, omdat KlantNr alleen door BestelNr wordt bepaald, dat slechts een deel van de primaire sleutel is; de oorspronkelijke tabel is dus in de eerste normaalvorm, maar niet in de tweede. Door de kolommen die door BestelNr worden bepaald af te splitsen naar Bestelling (BestelNr, KlantNr, Klantnaam), ontstaat de tweede normaalvorm. De derde normaalvorm is een toestand in de tweede normaalvorm waarin geen kolom wordt bepaald via een andere kolom dan de primaire sleutel (geen transitieve functionele afhankelijkheid). In Bestelling zit nog de transitieve functionele afhankelijkheid BestelNr → KlantNr → Klantnaam, dus wordt ook Klant (KlantNr, Klantnaam) afgesplitst. De drie tabellen Bestelregel (BestelNr, ArtikelNr, Aantal), Bestelling (BestelNr, KlantNr) en Klant (KlantNr, Klantnaam) zijn dan in de derde normaalvorm. Door ze op BestelNr en KlantNr te joinen, ontstaat de oorspronkelijke tabel weer.

Veelgestelde vragen

Wat is het verschil tussen de tweede en de derde normaalvorm?

De tweede normaalvorm heeft geen kolom die door slechts een deel van de primaire sleutel wordt bepaald (geen partiële functionele afhankelijkheid). De derde normaalvorm heeft daarnaast ook geen kolom die via een andere kolom dan de primaire sleutel wordt bepaald (geen transitieve functionele afhankelijkheid). Een tabel met een primaire sleutel van één kolom is automatisch in de tweede normaalvorm als ze in de eerste normaalvorm is.

Maakt normalisatie zoekopdrachten sneller?

Niet per se. Het doel van normalisatie is duplicatie te verwijderen en anomalieën bij wijzigingen te voorkomen; het opsplitsen van tabellen betekent meer joins bij het zoeken. Als de leesprestaties belangrijk zijn, wordt soms bewust gedenormaliseerd.

“Normalisatie” in de toelichting

Vragen met “Normalisatie” (3)

  1. Wat is het belangrijkste doel van de normalisatie van tabellen in een relationele database?
  2. De primaire sleutel van de tabel Bestelling (BestelNr, ArtikelNr, Aantal, KlantNr, Klantnaam) is {BestelNr, ArtikelNr}, en de functionele afhankelijkheden zijn {BestelNr, ArtikelNr} → Aantal, BestelNr → KlantNr en KlantNr → Klantnaam. Wat is het juiste resultaat van de normalisatie van deze tabel tot de derde normaalvorm?
  3. In een database die vooral wordt gebruikt om te lezen en te aggregeren, worden tabellen die door normalisatie zijn opgesplitst soms bewust samengevoegd tot één tabel, zodat dezelfde gegevens dubbel worden bewaard (denormalisatie). Welke combinatie van een voordeel en een nadeel van dit ontwerp is juist?

Verwante termen

Relationele database Primaire sleutel Derde normaalvorm (3NF) ACID-eigenschappen ER-diagram (entity-relationshipdiagram) Index (databaseindex) Isolatieniveau NoSQL SQL Transactie

Naar de woordenlijst