Database normalisering

Normalisering er en database design teknik, der bruges til at designe en relationsdatabase tabel op til højere normal form. Processen er progressiv, og et højere niveau af database normalisering kan ikke opnås, medmindre de tidligere niveauer er opfyldt.

Det betyder, at have data i unormaliseret form (den mindst normaliserede) og sigter mod at opnå den højeste normaliseringsniveau, ville det første trin være at sikre overholdelse af den første normale form, det andet trin ville være at sikre, at den anden normale form blev opfyldt og så videre i den ovennævnte rækkefølge, indtil dataene stemmer overens med den sjette normale form.

Det er dog værd at bemærke, at normale former ud over 4NF hovedsagelig er af akademisk interesse, da de problemer, de findes at løse, sjældent forekommer i praksis.

Bemærk, at dataene i det følgende eksempel var bevidst designet til at modsige de fleste normale former. I det virkelige liv er det meget muligt at være i stand til at springe nogle af normaliseringstrinene over, fordi tabellen ikke indeholder noget, der modsiger den givne normale form. Det forekommer ofte, at fastsættelse af en overtrædelse af en normal form også løser en overtrædelse af en højere normal form i processen. Der er også valgt en tabel til normalisering ved hvert trin, hvilket betyder, at der i slutningen af denne eksempelproces stadig kan være nogle tabeller, der ikke opfylder den højeste normale form.

Initial dataEdit

Lad en databasetabel med følgende struktur:

Titel Forfatter Forfatter Nationalitet Format Pris Emne Sider Tykkelse Udgiver Udgiverland Publikationstype Genre-id Genrenavn
Begyndende MySQL-database design og optimering Chad Russell Amerikansk Hardcover 49,99 MySQL,

Database,

Design

520 Tykt Apress USA E-bog 1 Vejledning

Vi antager i dette eksempel, at hver bog kun har en forfatter.

Tilfredsstillende 1NFEdit

For at tilfredsstille 1NF skal værdierne i hver kolonne i en tabel være atomare. I den indledende tabel indeholder emne et sæt emneværdier, hvilket betyder, at det ikke overholder.

En måde at opnå 1NF på ville være at adskille duplikaterne i flere kolonner ved hjælp af gentagne grupper Emne:

Titel Format Forfatter Forfatter Nationalitet Pris Emne 1 Emne 2 Emne 3 Sider Tykkelse Udgiver Udgiverland Genre-ID Genrenavn
Start af MySQL-databasedesign og optimering Hardcover Chad Russell Amerikansk 49,99 MySQL Database Design 520 Tykt Apress USA 1 Vejledning

Selvom tabellen nu formelt overholder 1NF (er atom), er problemet med denne løsning indlysende – hvis en bog har mere end tre emner, den kan ikke føjes til databasen uden at ændre dens struktur.

For at løse problemet på en mere elegant måde er det nødvendigt at identificere enheder repræsenteret i tabellen og adskille dem ind i deres respektive respektive tabeller. I dette tilfælde ville det resultere i bog-, emne- og udgivertabeller:

Book
Titel Format Forfatter Forfatter Nationalitet Pris Sider Tykkelse Genre-ID Genrenavn Udgiver-id
Start MySQL Databasedesign og optimering Hardcover Chad Russell Amerikansk 49.99 520 Tykt 1 Vejledning 1
Emne
Emne-id Emne navn
1 MySQL
2 Database
3 Design
Publisher
Publisher_ID Navn Land
1 Apress USA

At blot adskille de oprindelige data i flere tabeller vil bryde forbindelsen mellem dataene. Det betyder, at forholdet mellem de nyligt introducerede tabeller skal bestemmes. Bemærk, at kolonnen Publisher ID i bogens tabel er en fremmed nøgle, der realiserer mange-til-en-relation mellem en bog og en udgiver.

En bog kan passe mange emner, så godt som et emne svarer til mange bøger. Det betyder også, at der skal defineres et mange-til-mange forhold, opnået ved at oprette en linktabel:

Titel – Emne
Titel Emne-id
Begyndende MySQL-database design og optimering 1
Begyndelse af MySQL-databasedesign og optimering 2
Begyndelse af MySQL-databasedesign og optimering 3

I stedet for en tabel i unormaliseret form er der nu 4 tabeller, der svarer til 1NF.

Tilfredsstillende 2NFEdit

Bogtabellen har en kandidatnøgle (som derfor er den primære nøgle), den sammensatte nøgle {Titel, Format}. Overvej følgende tabelfragment:

Bog
Titel Format Forfatter Forfatter Nationalitet Pris Sider Tykkelse Genre-ID Genrenavn Publisher ID
Begyndelse af MySQL-databasedesign og optimering Hardcover Chad Russell Amerikansk 49,99 520 Tykt 1 Vejledning 1
Start MySQL-database design og optimering E-bog Chad Russell Amerikansk 22.34 520 Tykt 1 Vejledning 1
Relationsmodellen til databasestyring: Version 2 E-bog EFCodd Britisk 13,88 538 Tykt 2 Populærvidenskab 2
Relationsmodellen til database Ma administration: Version 2 Paperback EFCodd Britisk 39.99 538 Tykt 2 Populærvidenskab 2

Alle attributter, der ikke er en del af kandidatnøglen, afhænger af titel, men kun Pris afhænger også af format. For at overholde 2NF og fjerne duplikater skal enhver attribut, der ikke er kandidat-nøgle, afhænge af hele kandidatnøglen, ikke kun en del af den.

For at normalisere denne tabel skal du gøre {Titel} til en (enkel) kandidatnøgle (den primære nøgle), så alle attributter, der ikke er kandidatnøgle, afhænger af hele kandidatnøglen, og fjern Price i en separat tabel, så dens afhængighed af format kan bevares:

Bog
Titel Forfatter Forfatter Nationalitet Sider Tykkelse Genre-id Genrenavn Udgiver-id
Begyndende MySQL-databasedesign og optimering Chad Russell Amerikansk 520 Tykt 1 Vejledning 1
Relationsmodellen til databasestyring: Version 2 EFCodd Britisk 538 Tykt 2 Populærvidenskab 2
Format – pris
Titel Format Pris
Begyndende MySQL-databasedesign og optimering Hardcover 49.99
Start MySQL Database Design and Optimization E-book 22.34
Relationsmodellen til databasestyring: Version 2 E-bog 13.88
Relationsmodellen til databasestyring: Version 2 Paperback 39.99

Nu, Bogtabellen er i overensstemmelse med 2NF.

Tilfredsstillende 3NFEdit

Bogtabellen har stadig en midlertidig funktionel afhængighed ({Author Nationality} er afhængig af {Author}, som er afhængig af {Title) }). Der findes en lignende overtrædelse for genre ({Genre Name} er afhængig af {Genre ID}, som er afhængig af {Title}). Derfor er bogtabellen ikke i 3NF. For at gøre det i 3NF, lad os bruge følgende tabelstruktur og derved eliminere de transitive funktionelle afhængigheder ved at placere {Author Nationality} og {Genre Name} i deres egne respektive tabeller:

Bog

Titel Forfatter Sider Tykkelse Genre-ID Publisher ID
Begyndende MySQL-databasedesign og Optimering Chad Russell 520 Tykt 1 1
Relationsmodellen til databasestyring: Version 2 EFCodd 538 Tykk 2 2
Format – pris
Titel Format Pris
Begyndende MySQL-databasedesign og Optimering Hardcover 49.99
Start af MySQL-databasedesign og optimering E-bog 22.34
Relationsmodellen til databasestyring: Version 2 E-bog 13,88
Relationsmodellen til databasestyring: Version 2 Paperback 39.99
Forfatter
Forfatter Forfatter Nationalitet
Chad Russell Amerikansk
EFCodd Britisk
Genre
Gen re ID Genrenavn
1 Tutorial
2 Populærvidenskab

Tilfredsstillende EKNFEdit

Hovedartikel: Elementær nøgle normal form

Elementær nøgle normal form (EKNF) falder strengt mellem 3NF og BCNF og diskuteres ikke meget i litteraturen. Det er meningen “at indfange de fremtrædende kvaliteter af både 3NF og BCNF” og samtidig undgå begge problemer (nemlig at 3NF er “for tilgivende” og BCNF er “tilbøjelig til beregningskompleksitet”). Da det sjældent nævnes i litteraturen, det er ikke inkluderet i dette eksempel.

Tilfredsstillende 4NFEdit

Antag, at databasen ejes af en bogforhandler-franchise, der har flere franchisetagere, der ejer butikker forskellige steder.Og derfor besluttede forhandleren at tilføje en tabel, der indeholder data om tilgængeligheden af bøgerne på forskellige steder:

Franchisetageren – Bogplacering
Franchisetagers ID Titel Placering
1 Begyndelse af MySQL-databasedesign og optimering Californien
1 Start af MySQL-databasedesign og optimering Florida
1 Start MySQL-databasedesign og optimering Texas
1 Relationsmodellen til databasestyring: Version 2 Californien
1 Relationsmodellen til databasestyring: Version 2 Florida
1 Relationsmodellen til databasestyring: Version 2 Texas
2 Begyndende MySQL-databasedesign og optimering Californien
2 Start af MySQL-databasedesign og optimering Florida
2 Begyndelse af MySQL-databasedesign og optimering Texas
2 Relationsmodellen til databasestyring: Version 2 Californien
2 Relationsmodellen til databasestyring: Version 2 Florida
2 Relationsmodellen til databasestyring: Version 2 Texas
3 Start af MySQL-databasedesign og -optimering Texas

Da denne tabelstruktur består af en sammensat primærnøgle, indeholder den ikke nogen ikke-nøgleattributter, og den er allerede i BCNF (og opfylder derfor også alle de tidligere normale former). Men hvis vi antager, at alle tilgængelige bøger tilbydes i hvert område, bemærker vi muligvis, at titlen ikke entydigt er bundet til en bestemt placering, og derfor opfylder tabellen ikke 4NF.

Det betyder, at for at tilfredsstille den fjerde normale form skal denne tabel også nedbrydes:

Franchisetager – Bog
Franchisetagers ID Titel
1 Begyndende MySQL-database design og optimering
1 Relationsmodellen til databasestyring: Version 2
2 Start MySQL-databasedesign og optimering
2 Relationsmodellen til databasestyring: Version 2
3 Begyndende MySQL-databasedesign og optimering
Franchisetager – Placering
Franchisetagers ID Placering
1 Californien
1 Florida
1 Texas
2 Californien
2 Florida
2 Texas
3 Texas

Nu identificeres hver post entydigt af en supernøgle, derfor er 4NF tilfreds.

Tilfredsstillende ETNFEdit

Antag at franchisetagere også kan bestille bøger fra forskellige leverandører. Lad forholdet også være underlagt følgende begrænsning:

  • Hvis en bestemt leverandør leverer en bestemt titel
  • og titlen leveres til franchisetageren
  • og franchisetageren leveres af leverandøren,
  • så leverer leverandøren franchisetageren titlen.

Leverandør – bog – franchisetager
Leverandør-id Titel Franchisetagers ID
1 Begyndende MySQL-databasedesign og optimering 1
2 Relationsmodellen til databasestyring: Version 2 2
3 Learning SQL 3

Denne tabel er i 4NF, men leverandør-id’et er lig med sammenføjningen af dets fremskrivninger: {{leverandør-id, bog}, {bog, franchisetagers-id}, {franchisetagers-id, leverandør ID}}.Ingen komponent i denne sammenhængsafhængighed er en supernøgle (den eneste supernøgle er hele overskriften), så tabellen opfylder ikke ETNF og kan yderligere nedbrydes:

Leverandør – Bog
Leverandør-ID Titel
1 Begyndende MySQL-database design og optimering
2 Relationsmodellen til databasestyring: Version 2
3 Learning SQL
Bog – franchisetager
Titel Franchisetagers ID
Start af MySQL-databasedesign og optimering 1
Relationsmodellen til databasestyring: Version 2 2
Learning SQL 3
Franchisetager – leverandør
Leverandør-ID Franchisetagers ID
1 1
2 2
3 3

Nedbrydningen frembringer ETNF-overholdelse.

Tilfredsstillende 5NFEdit

For at få øje på en tabel, der ikke opfylder 5NF, er det er normalt nødvendigt for at undersøge dataene grundigt. Antag tabellen fra 4NF-eksemplet med en lille ændring i data, og lad os undersøge, om den opfylder 5NF:

Franchisetageren – Bogplacering
Franchisetagers ID Titel Placering
1 Start af MySQL-database design og optimering Californien
1 Learning SQL Californien
1 Relationsmodellen til databasestyring: Version 2 Texas
2 Relationsmodellen til databasestyring: Version 2 Californien

Hvis vi nedbryder denne tabel, sænker vi afskedigelser og får følgende to tabeller:

Franchisetager – Bog
Franchisetagers ID Titel
1 Start af MySQL-databasedesign og optimering
1 Learning SQL
1 Relationsmodellen til databasestyring: Version 2
2 Relationsmodellen til databasestyring: Version 2
Franchisetager – Placering
Franchisetagers ID Location
1 Californien
1 Texas
2 Californien

Hvad sker der, hvis vi forsøger at deltage i disse tabeller? Forespørgslen ville returnere følgende data:

Franchisetager – Bog – Location JOINed
Franchisetagers ID Titel Placering
1 Begyndende MySQL-databasedesign og Optimering Californien
1 Læring SQL Californien
1 Relationsmodellen til databasestyring: Version 2 Californien
1 Relationsmodellen til databasestyring: Version 2 Texas
1 Learning SQL Texas
1 Begyndende MySQL-database design og optimering Texas
2 Relationsmodellen til databasestyring: Version 2 Californien

JOIN returnerer tilsyneladende tre rækker mere end det burde – lad os prøve at tilføje ano Deres tabel for at afklare forholdet.Vi ender med tre separate tabeller:

Franchisetager – Bog
Franchisetagers ID Titel
1 Begyndelse af MySQL-databasedesign og optimering
1 Learning SQL
1 Relationsmodellen til databasestyring: Version 2
2 Relationsmodellen til databasestyring: Version 2
Franchisetager – Placering
Franchisetagers ID Location
1 Californien
1 Texas
2 Californien
Placering – Boo k
Placering Titel
Californien Start af MySQL-databasedesign og optimering
Californien Learning SQL
Californien Relationsmodellen til databasestyring: Version 2
Texas Relationsmodellen til databasestyring: Version 2

Hvad vil JOIN returnere nu? Det er faktisk ikke muligt at deltage i disse tre tabeller. Det betyder, at det ikke var muligt at nedbryde franchisetageren – bogplacering uden tab af data, derfor opfylder tabellen allerede 5NF.

CJ Date har hævdet, at kun en database i 5NF virkelig er “normaliseret”.

Tilfredsstillende DKNFEdit

Lad os se på bogtabellen fra tidligere eksempler og se om den opfylder domænenøglens normale form:

Logisk er tykkelsen bestemt af antallet af sider. Det betyder, at det afhænger af sider, som ikke er en nøgle. Lad os sætte et eksempel på en konvention, der siger, at en bog på op til 350 sider betragtes som “slank”, og en bog over 350 sider betragtes som “tyk”.

Denne konvention er teknisk set en begrænsning, men den er hverken et domæne begrænsning eller en nøglebegrænsning; derfor kan vi ikke stole på domænebegrænsninger og nøglebegrænsninger for at opretholde dataintegriteten.

Med andre ord – intet forhindrer os i at lægge f.eks. “Tykt” til en bog med 50 sider – og dette gør tabellen i strid med DKNF.

For at løse dette kan vi oprette en tabel med en optælling, der definerer tykkelsen og fjerne kolonnen fra den oprindelige tabel:

Bog
Titel Sider Tykkelse Genre-ID Publisher ID
Start MySQL Database Design and Optimization 520 Tykt 1 1
Relationsmodellen til databasestyring: Version 2 538 Tykt 2 2
Læring SQL 338 Slim 1 3
SQL-kogebog 636 Tykt 1 3
Tykkelse Enum
Tykkelse Min. Sider Maks. Sider
Slank 1 350
Tykt 351 999.999.999.999
Bog – Sider – Genre – Udgiver
Titel Sider Genre-id Udgiver-id
Begynd MySQL-databasedesign og optimering 520 1 1
Relationsmodellen til Database Management: Version 2 538 2 2
Learning SQL 338 1 3
SQL-kogebog 636 1 3

På den måde er domæneintegritetsovertrædelsen elimineret, og tabellen er i DKNF.

Tilfredsstillende 6NFEdit

En enkel og intuitiv definition af den sjette normale form er, at “en tabel er i 6NF, når rækken indeholder den primære nøgle og højst en anden attribut”.

Det betyder for eksempel Publisher-tabellen designet, mens du opretter 1NF

Publisher
Publisher_ID Name Country
1 Apress USA

skal være længere nedbrudt i to tabeller:

Udgiver
Publisher_ID Navn
1 Apress
Udgiverland
Publisher_ID Land
1 USA

Den åbenlyse ulempe ved 6NF er spredning af tabeller, der kræves for at repræsentere oplysningerne om en enkelt enhed. Hvis en tabel i 5NF har en primær nøglekolonne og N-attributter, der repræsenterer den samme information i 6NF, kræves N-tabeller; multi-felt opdateringer til en enkelt konceptuel post vil kræve opdateringer til flere tabeller; og indsatser og sletninger vil ligeledes kræve operationer på tværs af flere tabeller. Af denne grund bør 6NF ikke bruges i databaser, der er beregnet til at imødekomme behov for behandling af onlinetransaktioner.

Imidlertid i datalager, der ikke tillader interaktive opdateringer, og som er specialiseret til hurtig forespørgsel om store datamængder , bestemte DBMS’er bruger en intern 6NF-repræsentation – kendt som et Columnar-datalager. I situationer, hvor antallet af unikke værdier i en kolonne er langt mindre end antallet af rækker i tabellen, tillader kolonneorienteret lagring betydelige besparelser i plads gennem datakomprimering. Søjleopbevaring tillader også hurtig udførelse af rækkeforespørgsler (f.eks. Viser alle poster, hvor en bestemt kolonne er mellem X og Y eller mindre end X.)

I alle disse tilfælde gør databasedesigneren dog ikke skal udføre 6NF normalisering manuelt ved at oprette separate tabeller. Nogle DBMS’er, der er specialiserede til opbevaring, såsom Sybase IQ, bruger som standard kolonnelagring, men designeren ser stadig kun en enkelt tabel med flere kolonner. Andre DBMS’er, såsom Microsoft SQL Server 2012 og nyere, giver dig mulighed for at angive et “kolonnelagerindeks” for en bestemt tabel.

Write a Comment

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *