Normalizarea bazei de date

Normalizarea este o tehnică de proiectare a bazei de date, care este utilizată pentru a proiecta un tabel de baze de date relaționale până la o formă normală superioară. Procesul este progresiv, iar un nivel mai ridicat de normalizare a bazei de date nu poate fi atins decât dacă nivelurile anterioare au fost îndeplinite.

Asta înseamnă că, având date în formă neormalizată (cea mai puțin normalizată) și cu scopul de a atinge cel mai înalt nivel nivel de normalizare, primul pas ar fi să se asigure conformitatea cu prima formă normală, al doilea pas ar fi să se asigure că a doua formă normală este îndeplinită și așa mai departe în ordinea menționată mai sus, până când datele sunt conforme cu a șasea formă normală.

Cu toate acestea, este demn de remarcat faptul că formele normale dincolo de 4NF sunt în principal de interes academic, deoarece problemele pe care le există pentru a le rezolva apar rar în practică.

Vă rugăm să rețineți că datele din exemplul următor au fost concepute intenționat pentru a contrazice majoritatea formelor normale. În viața reală, este foarte posibil să poți sări peste unele dintre etapele de normalizare, deoarece tabelul nu conține nimic care să contrazică forma normală dată. De asemenea, se întâmplă în mod obișnuit că remedierea unei încălcări a unei forme normale remediază și o încălcare a unei forme normale superioare în proces. De asemenea, a fost ales un tabel pentru normalizare la fiecare pas, ceea ce înseamnă că la sfârșitul acestui exemplu de proces, ar putea exista încă unele tabele care nu satisfac cea mai înaltă formă normală.

Initial dataEdit

Lăsați un tabel de baze de date cu următoarea structură:

Title Author Nationality Author Format Preț Subiect Pagini Grosime Editor Țara editorului Tip de publicație ID gen Nume gen
Începând proiectarea și optimizarea bazei de date MySQL Chad Russell American Hardcover 49.99 MySQL,

Baza de date,

Design

520 Thick Apress SUA E-book 1 Tutorial

Presupunem în acest exemplu că fiecare carte are un singur autor.

1NFEdit satisfăcător

Pentru a satisface 1NF, valorile din fiecare coloană a unui tabel trebuie să fie atomice. În tabelul inițial, Subiectul conține un set de valori ale subiectului, ceea ce înseamnă că nu respectă.

O modalitate de a obține 1NF ar fi separarea duplicităților în mai multe coloane utilizând grupuri repetate Subiect:

Titlu Format Autor Naționalitatea autorului Preț Subiect 1 Subiect 2 Subiect 3 Pagini Grosime Editor Țara editorului ID gen Nume gen
Începând proiectarea și optimizarea bazei de date MySQL Hardcover Chad Russell American 49.99 MySQL Baza de date Design 520 Gros Apress SUA 1 Tutorial

Deși acum tabelul respectă în mod formal 1NF (este atomic), problema cu această soluție este evidentă – dacă o carte are mai mult de trei subiecte, nu poate fi adăugată la baza de date fără a-i modifica structura.

Pentru a rezolva problema într-un mod mai elegant, este necesar să identificați entitățile reprezentate în tabel și să le separați în propriile tabele respective. În acest caz, ar rezulta tabele Cartea, subiectul și editorul:

Carte
Titlu Format Autor Naționalitate autor Preț Pagini Grosime ID gen Nume gen ID editor
Începutul MySQL Proiectare și optimizare baze de date Hardcover Chad Russell American 49.99 520 Gros 1 Tutorial 1
Subiect
ID subiect Numele subiectului
1 MySQL
2 Baza de date
3 Design
Editor
Publisher_ID Nume Țară
1 Apress SUA

Simpla separare a datelor inițiale în mai multe tabele ar întrerupe conexiunea dintre date. Asta înseamnă că trebuie stabilite relațiile dintre tabelele nou introduse. Observați că coloana ID editor din tabelul cărții este o cheie străină care realizează relații multiple între o carte și un editor.

O carte se potrivește multor subiecte, precum și un subiect corespund multor cărți. Asta înseamnă, de asemenea, că trebuie definită o relație de la mulți la mulți, realizată prin crearea unui tabel de legături:

Titlu – Subiect
Titlu ID subiect
Începând proiectarea și optimizarea bazei de date MySQL 1
Începând proiectarea și optimizarea bazei de date MySQL 2
Începând proiectarea și optimizarea bazei de date MySQL 3

În loc de un tabel în formă neormalizată, există acum 4 tabele conforme cu 1NF.

2NFEdit satisfăcător

Tabelul Book are o cheie candidată (care este deci cheia principală), cheia compusă {Title, Format}. Luați în considerare următorul fragment de tabel:

Carte
Titlu Format Autor Naționalitatea autorului Preț Pagini Grosime ID gen Nume gen ID editor
Începând proiectarea și optimizarea bazei de date MySQL Hardcover Chad Russell American 49.99 520 Gros 1 Tutorial 1
Începând proiectarea și optimizarea bazei de date MySQL E-book Chad Russell American 22.34 520 Gros 1 Tutorial 1
Modelul relațional pentru gestionarea bazelor de date: versiunea 2 E-book EFCodd Britanic 13.88 538 Gros 2 Științe populare 2
Modelul relațional pentru baza de date Ma nagement: Versiunea 2 Volum broșat EFCodd Britanic 39.99 538 Gros 2 Știință populară 2

Toate atributele care nu fac parte din cheia candidat depind de Titlu, dar numai Prețul depinde și de Format. Pentru a se conforma 2NF și a elimina duplicitățile, fiecare atribut care nu este candidat trebuie să depindă de întreaga cheie candidată, nu doar de o parte din ea.

Pentru a normaliza acest tabel, faceți din {Title} o cheie candidată (simplă) (cheia primară), astfel încât fiecare atribut non-cheie candidat să depindă de întreaga cheie candidat și eliminați prețul într-un tabel separat, astfel încât să se poată păstra dependența sa de format:

Carte
Title Author Nationality Author Pages Thickness ID gen Nume gen ID editor
Începând proiectarea și optimizarea bazei de date MySQL Chad Russell American 520 Gros 1 Tutorial 1
Modelul relațional pentru gestionarea bazei de date: versiunea 2 EFCodd britanică 538 Gros 2 Știință populară 2
Format – Preț
Title Format Preț
Începând proiectarea și optimizarea bazei de date MySQL Hardcover 49.99
Începând proiectarea și optimizarea bazei de date MySQL E-book 22.34
Modelul relațional pentru gestionarea bazelor de date: versiunea 2 E-book 13.88
Modelul relațional pentru gestionarea bazei de date: versiunea 2 Volum broșat 39.99

Acum, tabelul Book este conform cu 2NF.

3NFEdit satisfăcător

Tabelul Book are încă o dependență funcțională tranzitivă ({Author Nationality} este dependentă de {Author}, care este dependentă de {Title }). Există o încălcare similară pentru gen ({Genre Name} depinde de {Genre ID}, care depinde de {Title}). Prin urmare, tabelul Carte nu este în 3NF. Pentru a face acest lucru în 3NF, să folosim următoarea structură a tabelului, eliminând astfel dependențele funcționale tranzitive plasând {Author Nationality} și {Genre Name} în propriile tabele respective:

Carte

Titlu Autor Pagini Grosime ID gen ID editor
Începând proiectarea bazei de date MySQL și Optimizare Chad Russell 520 Gros 1 1
Modelul relațional pentru gestionarea bazei de date: versiunea 2 EFCodd 538 Gros 2 2
Format – Preț
Title Format Preț
Începând proiectarea bazei de date MySQL și Optimizare Hardcover 49.99
Începând proiectarea și optimizarea bazei de date MySQL E-book 22.34
Modelul relațional pentru gestionarea bazelor de date: versiunea 2 E-book 13.88
Modelul relațional pentru gestionarea bazei de date: versiunea 2 Volum broșat 39.99

Autor
Author Author Nationality
Chad Russell American
EFCodd Britanic
Gen
Gen re ID Nume gen
1 Tutorial
2 Știință populară

EKNFEdit satisfăcător

Articol principal: Forma normală cheie elementară

Forma normală cheie elementară (EKNF) se încadrează strict între 3NF și BCNF și nu este mult discutat în literatură. Se intenționează „să surprindă calitățile evidente atât ale 3NF, cât și ale BCNF” evitând în același timp problemele ambelor (și anume, faptul că 3NF este „prea iertător” și BCNF este „predispus la complexitatea calculațională”). nu este inclus în acest exemplu.

4NFEdit satisfăcător

Să presupunem că baza de date este deținută de o franciză de retailer de cărți care are mai mulți francizați care dețin magazine în locații diferite.Prin urmare, retailerul a decis să adauge un tabel care conține date despre disponibilitatea cărților în diferite locații:

Francizat – Locație carte
ID francizat Titlu Locație
1 Începând proiectarea și optimizarea bazei de date MySQL California
1 Începând proiectarea și optimizarea bazei de date MySQL Florida
1 Începând proiectarea și optimizarea bazei de date MySQL Texas
1 Modelul relațional pentru gestionarea bazelor de date: versiunea 2 California
1 Modelul relațional pentru gestionarea bazelor de date: versiunea 2 Florida
1 Modelul relațional pentru gestionarea bazelor de date: versiunea 2 Texas
2 Începând proiectarea și optimizarea bazei de date MySQL California
2 Începând proiectarea și optimizarea bazei de date MySQL Florida
2 Începutul proiectării și optimizării bazei de date MySQL Texas
2 Modelul relațional pentru gestionarea bazei de date: versiunea 2 California
2 Modelul relațional pentru gestionarea bazelor de date: versiunea 2 Florida
2 Modelul relațional pentru gestionarea bazei de date: versiunea 2 Texas
3 Începând proiectarea și optimizarea bazei de date MySQL Texas

Deoarece această structură a tabelului constă dintr-o cheie primară compusă, nu conține atribute care nu sunt cheie și este deja în BCNF (și, prin urmare, satisface și toate formele normale anterioare). Cu toate acestea, dacă presupunem că toate cărțile disponibile sunt oferite în fiecare zonă, am putea observa că titlul nu este legat fără echivoc de o anumită locație și, prin urmare, tabelul nu satisface 4NF.

Asta înseamnă că, pentru a satisface a patra formă normală, acest tabel trebuie descompus și:

Francizat – Carte
ID francizat Titlu
1 Începând proiectarea și optimizarea bazei de date MySQL
1 Modelul relațional pentru gestionarea bazei de date: versiunea 2
2 Începând proiectarea și optimizarea bazei de date MySQL
2 Modelul relațional pentru gestionarea bazelor de date: versiunea 2
3 Începând proiectarea și optimizarea bazei de date MySQL
Francizat – Locație
ID francizat Locație
1 California
1 Florida
1 Texas
2 California
2 Florida
2 Texas
3 Texas

Acum, fiecare înregistrare este identificată fără ambiguități printr-o supercheie, de aceea 4NF este satisfăcut.

ETNFEdit satisfăcător

Să presupunem că francizații pot comanda și cărți de la diferiți furnizori. Relația să fie, de asemenea, supusă următoarei constrângeri:

  • Dacă un anumit furnizor furnizează un anumit titlu
  • și titlul este furnizat francizatului
  • iar francizatul este furnizat de furnizor,
  • apoi furnizorul furnizează titlul francizatului.
Furnizor – Carte – francizat
ID furnizor Titlu ID francizat
1 Începând proiectarea și optimizarea bazei de date MySQL 1
2 Modelul relațional pentru gestionarea bazei de date: versiunea 2 2
3 Learning SQL 3

Acest tabel este în 4NF, dar codul furnizorului este egal cu îmbinarea proiecțiilor sale: {{ID furnizor, carte}, {carte, ID francizat}, {ID francizat, furnizor ID}}.Nicio componentă a dependenței de asociere nu este o supercheie (singura supercheie fiind întreaga antet), deci tabelul nu satisface ETNF și poate fi descompus în continuare:

Furnizor – Carte
ID furnizor Titlu
1 Începând proiectarea și optimizarea bazei de date MySQL
2 Modelul relațional pentru gestionarea bazei de date: versiunea 2
3 SQL de învățare
Carte – Francizat
Titlu ID francizat
Începutul proiectării și optimizării bazei de date MySQL 1
Modelul relațional pentru gestionarea bazei de date: versiunea 2 2
Learning SQL 3
Francizat – Furnizor
ID furnizor ID francizat
1 1
2 2
3 3

Descompunerea produce conformitatea ETNF.

5NFEdit satisfăcător

Pentru a localiza un tabel care nu satisface 5NF, acesta este de obicei necesar pentru a examina detaliat datele. Să presupunem că tabelul din exemplul 4NF cu o mică modificare a datelor și să examinăm dacă îndeplinește 5NF:

Francizat – Locație carte
ID francizat Titlu Locație
1 Începând proiectarea și optimizarea bazei de date MySQL California
1 Învățarea SQL California
1 Modelul relațional pentru gestionarea bazelor de date: versiunea 2 Texas
2 Modelul relațional pentru gestionarea bazei de date: versiunea 2 California

Dacă descompunem acest tabel, reducem redundanțele și obținem următoarele două tabele:

Francizat – Carte
ID-ul francizatului Titlu
1 Începând proiectarea și optimizarea bazei de date MySQL
1 Învățarea SQL
1 Modelul relațional pentru gestionarea bazei de date: versiunea 2
2 Modelul relațional pentru gestionarea bazei de date: versiunea 2
Francizat – Locație
ID francizat Locație
1 California
1 Texas
2 California

Ce se întâmplă dacă încercăm să ne alăturăm acestor tabele? Interogarea va returna următoarele date:

Francizat – Carte – Locație ÎNSCRIS
ID francizat Titlu Locație
1 Începând proiectarea bazei de date MySQL și Optimizare California
1 Învățare SQL California
1 Modelul relațional pentru gestionarea bazelor de date: versiunea 2 California
1 Modelul relațional pentru gestionarea bazelor de date: versiunea 2 Texas
1 SQL de învățare Texas
1 Începând proiectarea și optimizarea bazei de date MySQL Texas
2 Modelul relațional pentru gestionarea bazei de date: versiunea 2 California

Aparent, JOIN returnează încă trei rânduri decât ar trebui – să încercăm să adăugăm un an tabelul pentru a clarifica relația.Încheiem cu trei tabele separate:

Francizat – Carte
ID francizat Titlu
1 Începând proiectarea și optimizarea bazei de date MySQL
1 SQL de învățare
1 Modelul relațional pentru gestionarea bazei de date: versiunea 2
2 Modelul relațional pentru gestionarea bazei de date: versiunea 2
Francizat – Locație
ID francizat Locație
1 California
1 Texas
2 California
Locație – Boo k
Locație Titlu
California Începutul proiectării și optimizării bazei de date MySQL
California Învățarea SQL
California Modelul relațional pentru gestionarea bazelor de date: versiunea 2
Texas Modelul relațional pentru gestionarea bazelor de date: versiunea 2

Ce va returna JOIN acum? De fapt, nu este posibil să vă alăturați acestor trei tabele. Asta înseamnă că nu a fost posibil să se descompună francizatul – Locația cărții fără pierderi de date, prin urmare tabelul satisface deja 5NF.

CJ Date a susținut că doar o bază de date din 5NF este cu adevărat „normalizată”.

DKNFEdit satisfăcător

Să vedem tabelul Book din exemplele anterioare și să vedem dacă îndeplinește forma normală a cheii de domeniu:

În mod logic, grosimea este determinată de numărul de pagini. Asta înseamnă că depinde de Pages, care nu este o cheie. Să setăm un exemplu de convenție care spune că o carte de până la 350 de pagini este considerată „subțire” și o carte de peste 350 de pagini este considerată „groasă”.

Această convenție este o constrângere tehnică, dar nu este nici un domeniu constrângere și nici o constrângere cheie; prin urmare, nu ne putem baza pe constrângeri de domeniu și constrângeri cheie pentru a păstra integritatea datelor.

Cu alte cuvinte – nimic nu ne împiedică să punem, de exemplu, „gros” pentru o carte cu 50 de pagini – iar acest lucru face ca tabelul să încalce DKNF.

Pentru a rezolva acest lucru, putem crea un tabel care conține enumerarea care definește Grosimea și să eliminăm acea coloană din tabelul original:

Carte
Titlu Pagini Grosime ID gen ID editor
Începând proiectarea și optimizarea bazei de date MySQL 520 Gros 1 1
Modelul relațional pentru gestionarea bazei de date: versiunea 2 538 Thick 2 2
Learning SQL 338 Slim 1 3
SQL Cookbook 636 Gros 1 3
Grosime Enum
Grosime Min pagini Max pagini
Slim 1 350
Gros 351 999.999.999.999
Carte – Pagini – Gen – Editor
Titlu Pagini ID gen ID editor
Începutul proiectării și optimizării bazei de date MySQL 520 1 1
Modelul relațional pentru Gestionarea bazei de date: versiunea 2 538 2 2
Learning SQL 338 1 3
SQL Cookbook 636 1 3

În acest fel, încălcarea integrității domeniului a fost eliminată, iar tabelul este în DKNF.

Satisfăcător 6NFEdit

O definiție simplă și intuitivă a celei de-a șasea forme normale este aceea că „un tabel este în 6NF când rândul conține cheia primară și cel mult un alt atribut”.

Asta înseamnă, de exemplu, tabelul Publisher conceput în timpul creării 1NF

Publisher
Publisher_ID Nume Țară
1 Apress SUA

trebuie să fie mai departe descompus în două tabele:

Editor
Publisher_ID Name
1 Apress
Țara editorului
Publisher_ID Țară
1 SUA

Dezavantajul evident al 6NF este proliferarea tabelelor necesare pentru a reprezenta informațiile despre o singură entitate. Dacă un tabel din 5NF are o coloană cheie principală și N atribute, reprezentând aceleași informații în 6NF va necesita N tabele; actualizările pe mai multe câmpuri pentru o singură înregistrare conceptuală vor necesita actualizări pentru mai multe tabele; iar inserțiile și ștergerile vor necesita în mod similar operații pe mai multe tabele. Din acest motiv, în bazele de date destinate să răspundă nevoilor de procesare a tranzacțiilor online, 6NF nu ar trebui să fie utilizat.

Cu toate acestea, în depozitele de date, care nu permit actualizări interactive și care sunt specializate pentru interogări rapide pe volume mari de date , anumite SGBD utilizează o reprezentare internă 6NF – cunoscută sub numele de depozit de date coloane. În situațiile în care numărul valorilor unice ale unei coloane este cu mult mai mic decât numărul de rânduri din tabel, stocarea orientată pe coloane permite economii semnificative de spațiu prin comprimarea datelor. Stocarea pe coloane permite, de asemenea, executarea rapidă a interogărilor de gamă (de exemplu, afișează toate înregistrările în care o anumită coloană este între X și Y sau mai puțin decât X.)

În toate aceste cazuri, totuși, proiectantul bazei de date nu trebuie să efectueze manual normalizarea 6NF prin crearea de tabele separate. Unele SGBD specializate pentru depozitare, cum ar fi Sybase IQ, utilizează în mod implicit stocarea pe coloane, dar proiectantul vede în continuare doar un singur tabel cu mai multe coloane. Alte SGBD, cum ar fi Microsoft SQL Server 2012 și versiunile ulterioare, vă permit să specificați un „index de depozit de coloane” pentru un anumit tabel.

Write a Comment

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *