Database normalisatie

Normalisatie is een database-ontwerptechniek die wordt gebruikt om een relationele databasetabel te ontwerpen tot een hogere normale vorm. Het proces is progressief en een hoger niveau van databasenormalisatie kan niet worden bereikt tenzij aan de vorige niveaus is voldaan.

Dat betekent dat het hebben van gegevens in niet-genormaliseerde vorm (de minst genormaliseerde) en het streven naar het hoogste niveau niveau van normalisatie, de eerste stap zou zijn om naleving van de eerste normaalvorm te verzekeren, de tweede stap zou zijn om ervoor te zorgen dat aan de tweede normaalvorm wordt voldaan, enzovoort, in de hierboven genoemde volgorde, totdat de gegevens voldoen aan de zesde normaalvorm.

Het is echter vermeldenswaard dat normale vormen buiten 4NF voornamelijk van academisch belang zijn, aangezien de problemen die ze bestaan om op te lossen zelden in de praktijk verschijnen.

Houd er rekening mee dat de gegevens in het volgende voorbeeld opzettelijk ontworpen om de meeste normale vormen tegen te spreken. In het echte leven is het heel goed mogelijk om een aantal normalisatiestappen over te slaan, omdat de tabel niets bevat dat in tegenspraak is met de gegeven normale vorm. Het komt ook vaak voor dat het oplossen van een overtreding van een normale vorm ook een overtreding van een hogere normale vorm in het proces oplost. Er is ook één tabel gekozen voor normalisatie bij elke stap, wat betekent dat er aan het einde van dit voorbeeldproces nog steeds enkele tabellen zijn die niet voldoen aan de hoogste normaalvorm.

Initiële dataEdit

Laat een databasetabel met de volgende structuur:

Titel Auteur Auteur Nationaliteit Formaat Prijs Onderwerp Pages Thickness Publisher Land van uitgever Publicatietype Genre-ID Genre
Begin van MySQL Database-ontwerp en -optimalisatie Chad Russell Amerikaans Hardcover 49,99 MySQL,

Database,

Ontwerp

520 Dik Apress VS E-book 1 Tutorial

We gaan er in dit voorbeeld van uit dat elk boek maar één auteur heeft.

Voldoen aan 1NFEdit

Om aan 1NF te voldoen, moeten de waarden in elke kolom van een tabel atomair zijn. In de initiële tabel bevat Subject een set subject-waarden, wat betekent dat het niet voldoet.

Een manier om de 1NF te bereiken is door de dupliciteiten in meerdere kolommen te scheiden met behulp van herhalende groepen. Subject:

Titel Formaat Auteur Nationaliteit van auteur Prijs Onderwerp 1 Onderwerp 2 Onderwerp 3 Pagina’s Dikte Uitgever Land van uitgever Genre-ID Genre-naam
Beginnen met MySQL-databaseontwerp en -optimalisatie Hardcover Chad Russell Amerikaans 49,99 MySQL Database Ontwerp 520 Dik Apress VS 1 Handleiding

Hoewel de tabel nu formeel voldoet aan de 1NF (is atomair), ligt het probleem met deze oplossing voor de hand – als een boek heeft meer dan drie onderwerpen, het kan niet aan de database worden toegevoegd zonder de structuur ervan te wijzigen.

Om het probleem op een elegantere manier op te lossen, is het nodig om entiteiten in de tabel te identificeren en ze te scheiden in hun eigen respectievelijke tabellen. In dit geval zou het resulteren in de tabellen Boek, Onderwerp en Uitgever:

Boek
Titel Formaat Auteur Auteur Nationaliteit Prijs Pagina’s Dikte Genre-ID Genre-naam Uitgevers-ID
Begin van MySQL Databaseontwerp en -optimalisatie Hardcover Chad Russell Amerikaans 49.99 520 Dik 1 Tutorial 1
Onderwerp
Onderwerp-ID Onderwerpnaam
1 MySQL
2 Database
3 Ontwerp
Uitgever
Publisher_ID Naam Land
1 Apress VS

Het simpelweg scheiden van de initiële gegevens in meerdere tabellen zou de verbinding tussen de gegevens verbreken. Dat betekent dat de relaties tussen de nieuw geïntroduceerde tabellen moeten worden bepaald. Merk op dat de kolom met uitgevers-ID in de tabel van het boek een externe sleutel is die een veel-op-een-relatie tussen een boek en een uitgever realiseert.

Een boek kan voor veel onderwerpen passen, maar ook voor een onderwerp komen overeen met veel boeken. Dat betekent dat er ook een veel-op-veel-relatie moet worden gedefinieerd, bereikt door een koppelingstabel te maken:

Titel – Onderwerp
Titel Onderwerp-ID
Beginnen met MySQL-databaseontwerp en -optimalisatie 1
Beginnen met MySQL-databaseontwerp en -optimalisatie 2
Beginnen met MySQL-databaseontwerp en -optimalisatie 3

In plaats van één tabel in niet-genormaliseerde vorm, zijn er nu 4 tabellen die voldoen aan de 1NF.

Voldoet aan 2NFEdit

De boekentabel heeft één kandidaatsleutel (die daarom de primaire sleutel is), de samengestelde sleutel {Titel, Formaat}. Beschouw het volgende tabelfragment:

Boek
Titel Formaat Auteur Auteur Nationaliteit Prijs Pagina’s Dikte Genre-ID Genre-naam Uitgever-ID
Beginnen met MySQL-databaseontwerp en -optimalisatie Hardcover Chad Russell Amerikaans 49,99 520 Dik 1 Tutorial 1
Beginnen met MySQL-databaseontwerp en -optimalisatie E-book Chad Russell Amerikaans 22.34 520 Dik 1 Tutorial 1
Het relationele model voor databasebeheer: versie 2 E-book EFCodd Brits 13,88 538 Dik 2 Populaire wetenschap 2
Het relationele model voor database Ma beheer: versie 2 Paperback EFCodd Brits 39,99 538 Dik 2 Populaire wetenschap 2

Alle attributen die geen deel uitmaken van de kandidaatsleutel zijn afhankelijk van de titel, maar alleen de prijs is ook afhankelijk van het formaat. Om aan 2NF te voldoen en dupliciteiten te verwijderen, moet elk niet-kandidaat-sleutelattribuut afhankelijk zijn van de hele kandidaatsleutel, niet alleen een deel ervan.

Om deze tabel te normaliseren, moet u van {Titel} een (eenvoudige) kandidaatsleutel maken (de primaire sleutel) zodat elk niet-kandidaat-sleutelattribuut afhankelijk is van de hele kandidaatsleutel, en verwijder Price in een aparte tabel zodat de afhankelijkheid van het formaat behouden kan blijven:

Boek
Titel Auteur Auteur Nationaliteit Pagina’s Dikte Genre-ID Genre-naam Uitgevers-ID
Beginnen met MySQL-databaseontwerp en -optimalisatie Chad Russell Amerikaans 520 Dik 1 Tutorial 1
Het relationele model voor databasebeheer: versie 2 EFCodd Brits 538 Dik 2 Populaire wetenschap 2
Formaat – prijs
Titel Formaat Prijs
Begin van MySQL-databaseontwerp en -optimalisatie Hardcover 49,99
Beginnen met MySQL-databaseontwerp en -optimalisatie E-book 22.34
Het relationele model voor databasebeheer: versie 2 E-book 13,88
Het relationele model voor databasebeheer: versie 2 Paperback 39,99

Nu, de Boekentafel voldoet aan 2NF.

Bevredigend 3NFEdit

De Boekentafel heeft nog steeds een transitieve functionele afhankelijkheid ({Auteur Nationaliteit} is afhankelijk van {Auteur}, die afhankelijk is van {Titel }). Een vergelijkbare overtreding bestaat voor genre ({Genre Name} is afhankelijk van {Genre ID}, die afhankelijk is van {Title}). Daarom bevindt de boekentafel zich niet in 3NF. Om het in 3NF te maken, gebruiken we de volgende tabelstructuur, waarbij we de transitieve functionele afhankelijkheden elimineren door {Author Nationality} en {Genre Name} in hun eigen respectievelijke tabellen te plaatsen:

Boek

Titel Auteur Pages Dikte Genre-ID Uitgever-ID
Beginnen met MySQL-databaseontwerp en Optimalisatie Chad Russell 520 Dik 1 1
Het relationele model voor databasebeheer: versie 2 EFCodd 538 Thick 2 2
Formaat – prijs
Titel Formaat Prijs
Beginnen met MySQL-databaseontwerp en Optimalisatie Hardcover 49,99
Beginnen met MySQL-databaseontwerp en -optimalisatie E-book 22.34
Het relationele model voor databasebeheer: versie 2 E-book 13.88
Het relationele model voor databasebeheer: versie 2 Paperback 39,99

Auteur
Auteur Auteur Nationaliteit
Chad Russell Amerikaans
EFCodd Brits
Genre
Gen re ID Genre Name
1 Tutorial
2 Populaire wetenschap

Bevredigend EKNFEdit

Hoofdartikel: Elementaire sleutel normaalvorm

De elementaire sleutel normaalvorm (EKNF) valt strikt tussen 3NF en BCNF en wordt niet veel besproken in de literatuur. Het is bedoeld “om de meest opvallende kwaliteiten van zowel 3NF als BCNF vast te leggen” terwijl de problemen van beide worden vermeden (namelijk dat 3NF “te vergevingsgezind” is en BCNF “vatbaar is voor computationele complexiteit”). Aangezien het zelden wordt genoemd in de literatuur, het is niet opgenomen in dit voorbeeld.

Bevredigend 4NFEdit

Stel dat de database eigendom is van een franchise van een boekhandelaar die verschillende franchisenemers heeft die winkels op verschillende locaties bezitten.En daarom besloot de winkelier een tabel toe te voegen die gegevens bevat over de beschikbaarheid van de boeken op verschillende locaties:

Franchisenemer – Boeklocatie
Franchisenemer-ID Titel Locatie
1 Beginnen met MySQL-databaseontwerp en -optimalisatie Californië
1 Beginnen met MySQL-databaseontwerp en -optimalisatie Florida
1 Begin van MySQL-databaseontwerp en -optimalisatie Texas
1 Het relationele model voor databasebeheer: versie 2 Californië
1 Het relationele model voor databasebeheer: versie 2 Florida
1 Het relationele model voor databasebeheer: versie 2 Texas
2 Begin van MySQL-databaseontwerp en -optimalisatie Californië
2 Beginnen met MySQL-databaseontwerp en -optimalisatie Florida
2 Beginnen met MySQL-databaseontwerp en -optimalisatie Texas
2 Het relationele model voor databasebeheer: versie 2 Californië
2 Het relationele model voor databasebeheer: versie 2 Florida
2 Het relationele model voor databasebeheer: versie 2 Texas
3 Begin van MySQL-databaseontwerp en optimalisatie Texas

Aangezien deze tabelstructuur uit een samengestelde primaire sleutel bestaat, bevat deze geen niet-sleutelattributen en staat deze al in BCNF (en voldoet daarom ook aan alle voorgaande normale vormen). Als we echter aannemen dat alle beschikbare boeken in elk gebied worden aangeboden, kunnen we opmerken dat de titel niet ondubbelzinnig aan een bepaalde locatie is gebonden en daarom voldoet de tabel niet aan 4NF.

Dat betekent dat, om aan de vierde normaalvorm te voldoen, moet deze tabel ook worden ontleed:

Franchisenemer – Boek
Franchisenemer-ID Titel
1 Beginnen met MySQL-databaseontwerp en -optimalisatie
1 Het relationele model voor databasebeheer: versie 2
2 Beginnen met MySQL-databaseontwerp en -optimalisatie
2 Het relationele model voor databasebeheer: versie 2
3 Begin van MySQL-databaseontwerp en -optimalisatie
Franchisenemer – Locatie
Franchisenemer-ID Locatie
1 Californië
1 Florida
1 Texas
2 Californië
2 Florida
2 Texas
3 Texas

Nu wordt elk record ondubbelzinnig geïdentificeerd door een superkey, daarom is aan 4NF voldaan.

Voldoet aan ETNFEdit

Stel dat de franchisenemers ook boeken bij verschillende leveranciers kunnen bestellen. Laat de relatie ook onderhevig zijn aan de volgende beperking:

  • Als een bepaalde leverancier een bepaalde titel levert
  • en de titel wordt geleverd aan de franchisenemer
  • en de franchisenemer wordt beleverd door de leverancier,
  • dan levert de leverancier de titel aan de franchisenemer.
Leverancier – Boek – Franchisenemer
Leverancier-ID Titel Franchisenemer-ID
1 Beginnen met MySQL-databaseontwerp en -optimalisatie 1
2 Het relationele model voor databasebeheer: versie 2 2
3 SQL leren 3

Deze tabel is in 4NF, maar de leverancier-ID is gelijk aan de samenvoeging van de projecties: {{Supplier ID, Book}, {Book, Franchisenemer ID}, {Franchisee ID, Supplier ID KAART}}.Geen enkel onderdeel van die join-afhankelijkheid is een superkey (de enige superkey is de volledige kop), dus de tabel voldoet niet aan de ETNF en kan verder worden ontleed:

Leverancier – boek
Leverancier-ID Titel
1 Beginnen met MySQL-databaseontwerp en -optimalisatie
2 Het relationele model voor databasebeheer: versie 2
3 SQL leren
Boek – Franchisenemer
Titel Franchisenemer-ID
Beginnen met MySQL-databaseontwerp en -optimalisatie 1
Het relationele model voor databasebeheer: versie 2 2
SQL leren 3
Franchisenemer – leverancier
Leverancier-ID Franchisenemer-ID
1 1
2 2
3 3

De ontleding zorgt voor ETNF-conformiteit.

Voldoet aan 5NFEdit

Om een tafel te vinden die niet voldoet aan de 5NF, is meestal nodig om de gegevens grondig te onderzoeken. Stel dat de tabel uit het 4NF-voorbeeld met een kleine wijziging in gegevens en laten we onderzoeken of deze voldoet aan 5NF:

Franchisenemer – Boeklocatie
Franchisenemer-ID Titel Locatie
1 Beginnen met MySQL-databaseontwerp en -optimalisatie Californië
1 SQL leren Californië
1 Het relationele model voor databasebeheer: versie 2 Texas
2 Het relationele model voor databasebeheer: versie 2 Californië

Als we deze tabel ontleden, verlagen we redundanties en krijgen we de volgende twee tabellen:

Franchisenemer – Boek
Franchisenemer-ID Titel
1 Beginnen met MySQL-databaseontwerp en -optimalisatie
1 SQL leren
1 Het relationele model voor databasebeheer: versie 2
2 Het relationele model voor databasebeheer: versie 2
Franchisenemer – Locatie
Franchisenemer-ID Locatie
1 Californië
1 Texas
2 Californië

Wat gebeurt er als we proberen aan deze tafels deel te nemen? De zoekopdracht zou de volgende gegevens retourneren:

Franchisenemer – Boek – Locatie AANGEZET
Franchisenemer-ID Titel Locatie
1 Beginnen met MySQL-databaseontwerp en Optimalisatie Californië
1 SQL leren Californië
1 Het relationele model voor databasebeheer: versie 2 Californië
1 Het relationele model voor databasebeheer: versie 2 Texas
1 SQL leren Texas
1 Beginnen met MySQL-databaseontwerp en -optimalisatie Texas
2 Het relationele model voor databasebeheer: versie 2 Californië

Blijkbaar retourneert de JOIN drie rijen meer dan zou moeten – laten we proberen er een toe te voegen ther tabel om de relatie te verduidelijken.We eindigen met drie afzonderlijke tabellen:

Franchisenemer – Boek
Franchisenemer-ID Titel
1 Beginnen met MySQL-databaseontwerp en -optimalisatie
1 SQL leren
1 Het relationele model voor databasebeheer: versie 2
2 Het relationele model voor databasebeheer: versie 2
Franchisenemer – Locatie
Franchisenemer-ID Locatie
1 Californië
1 Texas
2 Californië
Locatie – Boo k
Locatie Titel
Californië Beginnen met MySQL-databaseontwerp en -optimalisatie
Californië SQL leren
Californië Het relationele model voor databasebeheer: versie 2
Texas Het relationele model voor databasebeheer: versie 2

Wat zal de JOIN nu teruggeven? Het is eigenlijk niet mogelijk om aan deze drie tafels deel te nemen. Dat betekent dat het niet mogelijk was om de Franchisenemer – Boeklocatie zonder gegevensverlies te ontbinden, daarom voldoet de tabel al aan 5NF.

CJ Date heeft betoogd dat alleen een database in 5NF echt “genormaliseerd” is.

Bevredigende DKNFEdit

Laten we eens kijken naar de boekentabel uit eerdere voorbeelden en kijken of deze voldoet aan de normale vorm van de Domain-key:

Logischerwijs wordt de dikte bepaald door het aantal pagina’s. Dat betekent dat het afhankelijk is van Pages, wat geen sleutel is. Laten we een voorbeeldconventie geven en zeggen dat een boek van maximaal 350 pagina’s als “dun” wordt beschouwd en een boek van meer dan 350 pagina’s als “dik”.

Deze conventie is technisch gezien een beperking, maar het is geen domein beperking noch een sleutelbeperking; daarom kunnen we niet vertrouwen op domeinbeperkingen en sleutelbeperkingen om de gegevensintegriteit te behouden.

Met andere woorden: niets belet ons om bijvoorbeeld ‘Dik’ te plaatsen voor een boek met alleen 50 pagina’s – en dit zorgt ervoor dat de tabel DKNF schendt.

Om dit op te lossen, kunnen we een tabel met opsomming maken die de dikte definieert en die kolom uit de originele tabel verwijderen:

Boek
Titel Pagina’s Dikte Genre-ID Uitgever-ID
Beginnen met MySQL-databaseontwerp en -optimalisatie 520 Thick 1 1
Het relationele model voor databasebeheer: versie 2 538 Dik 2 2
SQL leren 338 Slank 1 3
SQL-kookboek 636 Dik 1 3
Dikte Enum
Dikte Min pagina’s Max pagina’s
Slank 1 350
Dik 351 999.999.999.999
Boek – Pagina’s – Genre – Uitgever
Titel Pagina’s Genre-ID Uitgever-ID
Beginnen met MySQL-databaseontwerp en -optimalisatie 520 1 1
Het relationele model voor Databasebeheer: versie 2 538 2 2
SQL leren 338 1 3
SQL-kookboek 636 1 3

Op die manier is de inbreuk op de domeinintegriteit geëlimineerd en staat de tabel in DKNF.

Bevredigend 6NFEdit

Een eenvoudige en intuïtieve definitie van de zesde normaalvorm is dat “een tabel in 6NF staat als de rij de primaire sleutel bevat, en hoogstens één ander attribuut”.

Dat betekent bijvoorbeeld de Publisher-tabel die is ontworpen tijdens het maken van de 1NF

Publisher
Publisher_ID Naam Land
1 Apress VS

moet verder worden opgesplitst in twee tabellen:

Uitgever
Publisher_ID Name
1 Apress
Land van uitgever
Publisher_ID Land
1 VS

Het voor de hand liggende nadeel van 6NF is de wildgroei aan tabellen die nodig zijn om de informatie over een enkele entiteit weer te geven. Als een tabel in 5NF één primaire sleutelkolom en N-attributen heeft, zijn er N-tabellen nodig die dezelfde informatie vertegenwoordigen in 6NF; updates voor meerdere velden van één conceptueel record vereisen updates van meerdere tabellen; en inserts en deletes vereisen op dezelfde manier bewerkingen in meerdere tabellen. Om deze reden mag 6NF in databases die bedoeld zijn om te voldoen aan de behoeften van online transactieverwerking, niet worden gebruikt.

Echter, in datawarehouses, die geen interactieve updates toestaan en die gespecialiseerd zijn voor snelle query’s op grote datavolumes gebruiken bepaalde DBMS’en een interne 6NF-representatie – bekend als een Columnar-gegevensopslag. In situaties waarin het aantal unieke waarden van een kolom veel kleiner is dan het aantal rijen in de tabel, zorgt kolomgeoriënteerde opslag voor aanzienlijke ruimtebesparingen door datacompressie. Kolomopslag maakt ook een snelle uitvoering van bereikquery’s mogelijk (bijv. Toon alle records waar een bepaalde kolom tussen X en Y, of kleiner dan X is).

In al deze gevallen doet de databaseontwerper dat echter niet 6NF-normalisatie handmatig moeten uitvoeren door afzonderlijke tabellen te maken. Sommige DBMS’en die gespecialiseerd zijn voor warehousing, zoals Sybase IQ, gebruiken standaard kolomopslag, maar de ontwerper ziet nog steeds slechts één tabel met meerdere kolommen. Met andere DBMS’en, zoals Microsoft SQL Server 2012 en hoger, kunt u een “columnstore-index” voor een bepaalde tabel specificeren.

Write a Comment

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *