Inhoud
Derde normale vorm (3NF) is een databaseprincipe die de integriteit van gegevens ondersteunt door voort te bouwen op de database normalisatieprincipes die worden geboden door de eerste normale vorm (1NF) en de tweede normale vorm (2NF).
Het doel van 3NF is om de databaseverwerking te verbeteren en tegelijkertijd de opslagkosten te minimaliseren.
Derde normale vormvereisten
Er zijn twee basisvereisten voor een database in 3NF:
- De database moet al voldoen aan de eisen van zowel 1NF als 2NF.
- Alle databasekolommen moeten afhangen van de primaire sleutel, wat betekent dat de waarde van elke kolom alleen kan worden afgeleid van de primaire sleutel.
Primaire sleutelafhankelijkheid
Laten we verder onderzoeken wat we bedoelen met het feit dat alle kolommen afhankelijk moeten zijn van de primaire sleutel. Als de waarde van een kolom kan worden afgeleid van zowel de primaire sleutel als een andere kolom in de tabel, is deze in strijd met 3NF. Overweeg een tabel met werknemers met deze kolommen:
- EmployeeID
- Voornaam
- Achternaam
Zijn zowel Achternaam als Voornaam alleen afhankelijk van de waarde van EmployeeID? Kan LastName afhangen van FirstName? Nee, omdat niets inherent aan LastName de waarde van FirstName zou suggereren.
Kan FirstName afhangen van LastName? Nee, nogmaals, want hetzelfde is waar: wat een achternaam ook mag zijn, het kon geen hint geven over de waarde van voornaam. Daarom voldoet deze tabel aan 3NF.
Maar overweeg dit Voertuigen tafel:
- VehicleID
- Fabrikant
- Model
De fabrikant en het model kunnen afkomstig zijn van de voertuig-ID, maar het model kan ook afkomstig zijn van de fabrikant omdat slechts één bepaalde fabrikant een voertuigmodel maakt. Dit tabelontwerp voldoet niet aan 3NF en kan daarom resulteren in gegevensafwijkingen. U kunt bijvoorbeeld de fabrikant bijwerken zonder het model bij te werken, waardoor onnauwkeurigheden ontstaan.
Als u de extra afhankelijke kolom naar een andere tabel verplaatst en ernaar verwijst met een externe sleutel, is deze compatibel. Dit zou resulteren in twee tabellen:
In de Voertuigen tafel hieronder is de ModelID een refererende sleutel in de Modeltabel:
- VehicleID
- Fabrikant
- ModelID
Deze nieuwe Modellen tafel brengt modellen in kaart aan fabrikanten. Als u voertuiggegevens specifiek voor een model wilt bijwerken, doet u dit in deze tabel en niet in de Voertuigtabel.
- ModelID
- Fabrikant
- Model
Afgeleide velden in het 3NF-model
Een tabel kan een afgeleid veld bevatten, een veld dat wordt berekend op basis van andere kolommen in de tabel. Bekijk bijvoorbeeld deze tabel met widgetorders:
- Bestelnummer
- Klantnummer
- Eenheid prijs
- Aantal stuks
- Totaal
Het totaal breekt 3NF-conformiteit omdat het kan worden afgeleid door de eenheidsprijs te vermenigvuldigen met de hoeveelheid, in plaats van volledig afhankelijk te zijn van de primaire sleutel. U moet Total van de tafel verwijderen om aan het derde normale formulier te voldoen.
Omdat het is afgeleid, is het zelfs beter om het helemaal niet in de database op te slaan, maar het gewoon on-the-fly te berekenen bij het uitvoeren van databasequery's. We hebben deze vraag bijvoorbeeld eerder gebruikt om bestelnummers en totalen op te halen:
SELECT bestelnummer, totaal
VAN WidgetOrders
Gebruik nu de volgende query om dezelfde resultaten te bereiken zonder de normalisatieregels te schenden:
SELECT OrderNumber, UnitPrice * Aantal AS Totaal
VAN WidgetOrders