Imagini/viziuni
ale utilizatorilor
Relaţii
nenormalizate
Extragerea grupurilor
care se repetă
Relaţii normalizate
în prima formă (1NF)
Extragerea dependenţelor
parţiale
A doua formă normalizată
a relaţiilor (2NF)
Extragerea dependenţelor
tranzitive
A treia formă normalizată
a relaţiilor (3NF)
...
Fig. 3.3 Paşii normalizării
În figura de mai sus sunt prezentate numai primele trei forme de normalizare, întrucât se consideră
că, în majoritatea cazurilor, aducerea unei baze de date relaţionale în forma a treia de normalizare este
suficientă. Cazurile care să necesite trecerea dincolo de cea de-a treia formă sunt rar întâlnite în practică.
În cele ce urmează, ne vom opri doar asupra primelor trei forme de normalizare
Pentru a exemplifica procedura normalizării, vom porni de la relaţia generală iniţială VANZARE
(nenormalizată) din figura 3.2, reluată în figura 3.4. Analistul afişează datele fiecărei viziuni/imagini a
utilizatorilor într-o formă tabelară.
1
. Vezi şi McFadden, F.R., Hoffer, J.A. – Data Base Management, Second Edition, The Benjamin/Cummings Publishing
Company, Inc., Menlo Park, 1988; McFadden, F.R., Hoffer, J.A. – Modern Database Management, The
Benjamin/Cummings Publishing Company, Inc., Redwood City, 1994.
VANZARE
NrFactura DataFactura CodClient NumeClient Adresa Sold CodProdus DenProdus UM Stoc Cantitate PretVanzare
81001 25/01/06 1001 Mota SRL Florilor, 21, Iasi 0 100026 Pal furniruit mp 112,00 40,00 12,50
81002 25/01/06 1001 Mota SRL Florilor, 21, Iasi 0 100001 Canapea Mircea buc 7,00 4,00 250,00
81002 25/01/06 1001 Mota SRL Florilor, 21, Iasi 0 100018 Comoda Mia buc 12,00 8,00 140,00
81003 26/01/06 1002 Mobins SA Copou, 11, Vaslui 1500 100018 Comoda Mia buc 12,00 1,00 140,00
81004 26/01/06 1002 Mobins SA Copou, 11, Vaslui 1500 100026 Pal furniruit mp 112,00 28,00 12,50
81004 26/01/06 1002 Mobins SA Copou, 11, Vaslui 1500 100018 Canapea Mircea buc 7,00 4,00 250,00
81005 27/01/06 1003 Lux SRL Viilor, 45, Husi 2900 100034 Biblioteca Livia buc 4,00 1,00 980,00
2
. O prezentare amplă a diverselor opinii exprimate în literatura de specialitate poate fi găsită în Fotache, M. – Proiectarea
bazelor de date. Normalizare şi postnormalizare, Editura Polirom Iaşi, 2005.
3
. Date, C.J. – Baze de date, Editura Plus, Bucureşti, 2005, traducere a lucrării Date, C.J. – An Introduction to Database Systems,
Eighth Edition, Pearson Education, Inc., Boston, 2004, p. 152.
numărul blocului? Dacă nu, atunci Adresa poate rămâne nedescompus, iar dacă da, este imperios necesară
descompunerea sa.
În exemplul nostru, considerăm că cerinţele informaţionale şi de prelucrare solicită tratarea
atributului Adresa ca un tot, deci el este atomic. Cu totul altfel ar fi stat lucrurile dacă prin baza de date s-
ar fi gestionat clienţii unei firme de televiziune prin cablu sau ai unei firme de distribuire a produselor
alimentare. În cazul primei firme, conducerea ar putea fi interesată la un moment dat de numărul
clienţilor-abonaţi de pe o anumită stradă. Această cerinţă informaţională sugerează descompunerea
atributului Adresa. Chiar şi în astfel de situaţii, necesitatea descompunerii este uşor pusă în discuţie, din
cauza numeroaselor funcţii dedicate şirurilor de caractere disponibile în mediile actuale de programare,
sau de operatorul LIKE din SQL.
În concluzie, atomicitatea atributelor este o noţiune „relativă”, în sensul că ea trebuie interpretată din
perspectiva cerinţelor informaţionale care stau la baza proiectării bazei de date, dar şi a mecanismelor de
gestiune a diferitelor tipuri de date existente în mediile de dezvoltare a aplicaţiilor (în special sisteme de
gestiune bazelor de date).
În ceea ce priveşte relaţia VANZARE, aşa cum este ea prezentată în figura 3.4, o considerăm în 1FN.
Înainte de a trece la următorul pas al normalizării, să clarificăm semnificaţia noţiunii de grup
repetitiv, aceeaşi cu cea a atomicităţii. Mai corectă considerăm formularea grup repetitiv de valori, pentru
a o delimita net de grup de atribute repetitive. Dacă revenim la atributul Adresa, valorile aferente numelui
străzii ar putea constitui un grup repetitiv de valori atât timp cât pot exista mai mulţi clienţi care îşi au
sediul pe aceeaşi stradă şi, în plus, am dori să prelucrăm datele care privesc numai pe aceşti clienţi. Deci,
se constată prezenţa unui grup repetitiv de valori în cadrul atributului Adresa care prezintă interes din
perspectiva prelucrărilor informaţionale. Altfel spus, există un nivel nedorit de redundanţă a datelor, care
generează efectele negative cunoscute. Cum vom actualiza baza de date dacă se modifică numele unei
străzi pe care îşi au sediul mai mulţi clienţi? Ne permitem să răspundem evaziv, tot printr-o întrebare: Cât
de frecvent se schimbă numele străzilor într-o localitate?
Pentru a rezolva problema, grupul respectiv trebuie extras şi se va introduce un nou atribut. De fapt,
ajungem la rezultatul anterior, când analizam atomicitatea atributului Adresa.
Totuşi, trebuie să spunem că noţiunea de grup repetitiv poate avea mai multe semnificaţii, în funcţie
de care se poate aplica un tratament sau altul. O situaţie aparte în care putem avea grupuri repetitive este
evidenţiată de exemplul din figura 3.54.
Deşi nu este o eroare gravă, multe aplicaţii funcţionând cu succes cu astfel de implementări în baza
de date, o asemenea structurare poate crea unele probleme. De exemplu, determinarea valorii totale a
vânzărilor pentru primul trimestru este mai dificil de obţinut, prin prisma prelucrărilor ce trebuie
efectuate. Totuşi, o asemenea structurare poate fi extrem de neplăcută, mai ales atunci când numărul
elementelor care se regăsesc pe coloane variază în limite largi.
O prezentare detaliată a acestui subiect poate fi găsită la Marin Fotache, care foloseşte pentru astfel
de situaţii noţiunea de grup repetitiv pe orizontală5.
4
. Riordan, R.M. – Designing Relational Database Systems, Microsoft Press, Redmond, Washington, 1999, p. 34.
5
. Fotache, M. – op.cit., pp. 55-61.
3.4.3 A doua formă normalizată (2FN)
Deşi relaţia VANZARE este în prima formă normalizată, este lesne de observat că anomaliile la
actualizare, enunţate în paragraful 3.4.1, nu au fost îndepărate. Cu toate că aducerea ei în 1FN a rezolvat o
parte dintre problemele de gestiune a datelor, relaţia VANZARE nu este şi în 2FN, cu atât mai puţin în
forma 3FN, deci ea se află în continuare într-o formă indezirabilă (nestructurată). Pentru a elimina cel
puţin o parte din problemele de actualizare a datelor, este necesar să trecem la pasul următor al procedurii
de normalizare.
După cum reiese şi din schema generală a normalizării (figura 3.3), obiectivul celei de-a doua forme
de normalizare constă în extragerea dependenţelor funcţionale parţiale. O relaţie este în forma a doua
normalizată dacă şi numai dacă ea se află deja în prima formă şi nu conţine dependenţe funcţionale
parţiale. Ultima parte a definiţiei poate fi reformulată astfel: fiecare atribut non-cheie este dependent total
de cheia primară.
Înainte de a explica modul în care poate fi adusă o relaţie în 2FN, trebuie să clarificăm noţiunile
dependenţă funcţională, dependenţă funcţională parţială şi dependenţă funcţională totală.
Fiind date X şi Y, două atribute sau grupuri de atribute dintr-o relaţie (tabelă) oarecare, spunem că X
se află în relaţie de dependenţă funcţională cu Y atunci când cunoaşterea unei valori pentru X permite
cunoaşterea a maximum o valoare pentru Y. X se numeşte sursa sau determinantul relaţiei de dependenţă
funcţională, iar Y este referit ca destinaţia sau determinatul relaţiei. Relaţia de dependenţă funcţională se
poate scrie:
X Y
şi poate fi citită în ambele sensuri: X determină funcţional pe Y, sau Y este determinat funcţional de X.
Un prim exemplu de dependenţă funcţională în relaţia VANZARE este cel dintre atributele NrFactura
şi NumeClient. Cunoaşterea numărului facturii permite cunoaşterea cu certitudine a numelui clientului,
deoarece o factură este emisă pentru un singur client. Alte exemple sunt prezentate în figura 3.6.
NrFactura DataFactura
CodProdus Stoc
CodProdus DenProdus
CodClient Sold
CodClient NumeClient
Fig. 3.6 Exemple de dependenţe funcţionale în relaţia VANZARI
În orice tabelă există relaţii de dependenţă funcţională. Mai exact, cheia unei tabele determină
funcţional toate atributele non-cheie din acea relaţie. Astfel, combinaţia de atribute (NrFactura,
CodProdus), care formează cheia relaţiei VANZARE, determină funcţional toate celelalte atribute. Din
faptul că atributele se află în relaţie (de dependenţă funcţională) provine şi denumirea de relaţie şi,
implicit, cea de model relaţional..
Să mai spunem că o relaţie de dependenţă funcţională este denumită canonică dacă destinaţia este
reprezentată de un singur atribut (sursa poate fi simplă sau compusă). Toate relaţiile dintre cheia compusă
a relaţiei VANZARE şi fiecare dintre atributele sale non-cheie sunt în forma canonică.
Pentru o mai bună clarificare a conţinutului dependenţelor funcţionale, vom prezenta câteva contra-
exemple. Două atribute sau grupuri de atribute nu sunt în relaţie de dependenţă funcţională atunci când
cunoaşterea valorii lui X:
nu permite cunoaşterea nici uneia dintre valorile lui Y, caz în care nu există nici un fel de
relaţie de dependenţă între X şi Y, sau
permite cunoaşterea mai multor valori posibile pentru Y.
Un exemplu, pentru primul caz, îl reprezintă atributele DataFactura şi DenProdus: între cele două
atribute nu există o dependenţă funcţională, deoarece data întocmirii facturii nu spune absolut nimic
despre denumirea produsului facturat. Pentru al doilea caz, relevant este exemplul dintre NrFactura şi
CodProdus: într-o factură poate fi înregistrată vânzarea mai multor produse, iar unei valori pentru
NrFactura îi vor putea corespunde mai multe valori pentru atributul CodProdus. Modalitatea de scriere a
celor două contra-exemple, precum şi altele sunt prezentate în figura 3.7.
DataFactura DenProdus
DataFactura NrFactura
NrFactura CodProdus
NrFactura Cantitate
CodProdus Cantitate
CodProdus NrFactura
(NrFactura, CodClient) DenProdus
(NrFactura, CodClient) Cantitate
Fig. 3.7 Contra-exemple de dependenţe funcţionale în relaţia VANZARE
Între DataFactura şi NrFactura nu există o relaţie de dependenţă funcţională, întrucât într-o aceeaşi
zi pot fi emise mai multe facturi, iar, dacă vom cunoaşte valoarea pentru DataFactura, nu vom cunoaşte
cu certitudine care este valoarea pentru NrFactura. În mod similar, pentru un acelaşi produs, pot fi
înregistrate mai multe facturi ce consemnează operaţiuni de vânzare, deci valoarea atributului CodProdus
nu determină funcţional NrFactura.
Obiectul analizei, pentru forma a doua de normalizare, îl reprezintă un tip aparte de dependenţă
funcţională, respectiv :ependenţa funcţională parţială. Dependenţele funcţionale parţiale se manifestă
atunci când atributele non-cheie dintr-o relaţie (tabelă) depind funcţional numai de o parte a cheii
compuse. Fiind dată relaţia de dependenţă funcţională X Y , în care X reprezintă cheia
compusă a unei relaţii şi Y un atribut non-cheie, dacă există un subansamblu Z al lui X, pentru care
dependenţa funcţională Z Y este adevărată, atunci spunem că avem o relaţie de dependenţă
funcţională parţială. În caz contrar, spunem că atributul non-cheie Y este dependent total de cheia relaţiei.
Dependenţele totale mai sunt referite şi ca dependenţe elementare. Într-o relaţie în care cheia este simplă,
toate atributele non-cheie depind total de cheia relaţiei. Prin urmare, dependenţe funcţionale parţiale pot
exista numai în relaţiile care au cheie primară compusă.
Relaţia VANZARE are cheie primară compusă din două atribute, deci ar putea exista două grupuri de
dependenţe funcţionale parţiale. Fiecare grup va fi format din atributele non-cheie care depind funcţional
numai de NrFactura, respectiv CodProdus. Cele două grupuri sunt prezentate în figura 3.8.
NrFactura DataFactura CodProdus DenProdus
NrFactura CodClient CodProdus UM
NrFactura NumeClient CodProdus Stoc
NrFactura Adresa CodProdus PretVanzare
NrFactura Sold
Doar atributul Cantitate depinde total de cheia primară, deoarece el nu depinde funcţional numai de
NrFactura sau CodProdus. Relaţia de dependenţă funcţională totală poate fi reprezentată astfel:
(NrFactura, CodProdus) Cantitate
Transformarea unei relaţii în 2FN presupune descompunerea acesteia, prin constituirea a câte o
relaţie pentru fiecare grup de dependenţe funcţionale parţiale, şi a unei relaţii care va conţine numai
dependenţele totale. Relaţiile din prima categorie vor avea drept cheie primară sursa dependenţelor
parţiale pentru fiecare grup în parte, iar ultima relaţie rezultată va prelua cheia primară a relaţiei înainte de
descompunere. Chiar dacă nu există nici o dependenţă totală, ultima relaţie tot va fi constituită, ea urmând
a avea ca atribute doar pe cele care formează cheia primară.
Descompunerea relaţiei VANZARE este prezentată în figura 3.9. S-au constituit trei noi relaţii:
1. VANZARE_2FN, care are drept cheie primară NrFactura şi care mai conţine atributele non-cheie
dependente parţial de NrFactura în relaţia VANZARE;
2. PRODUS, care conţine CodProdus, cu rol de cheie primară, şi toate atributele non-cheie care în
relaţia VANZARE erau în relaţie de dependenţă parţială faţă de acesta;
3. ARTICOLFACTURA, în care se regăsesc atributele non-cheie din VANZARE aflate în relaţie de
dependenţă funcţională totală faţă de cheia compusă, împreună cu atributele cheii. Această tabelă
păstrează cheia primară compusă (NrFactura+ CodProdus), ea ar fi fost constituită şi dacă nu ar
fi existat atributul Cantitate.
VANZARE
NrFactura DataFactura CodClient NumeClient Adresa Sold CodProdus DenProdus UM Stoc Cantitate PretVanzare
81001 25/01/06 1001 M ota SRL Florilor, 21, Iasi 0 100026 Pal furniruit mp 112,00 40,00 12,50
81002 25/01/06 1001 M ota SRL Florilor, 21, Iasi 0 100001 Canapea M ircea buc 7,00 4,00 250,00
81002 25/01/06 1001 M ota SRL Florilor, 21, Iasi 0 100018 Comoda M ia buc 12,00 8,00 140,00
81003 26/01/06 1002 M obins SA Copou, 11, Vaslui 1500 100018 Comoda M ia buc 12,00 1,00 140,00
81004 26/01/06 1002 M obins SA Copou, 11, Vaslui 1500 100026 Pal furniruit mp 112,00 28,00 12,50
81004 26/01/06 1002 M obins SA Copou, 11, Vaslui 1500 100018 Canapea M ircea buc 7,00 4,00 250,00
81005 27/01/06 1003 Lux SRL Viilor, 45, Husi 2900 100034 Biblioteca Livia buc 4,00 1,00 980,00
ARTICOLFACTURA
NrFactura CodProdus Cantitate
81001 100026 40,00
81002 100001 4,00
81002 100018 8,00
81003 100018 1,00
81004 100026 28,00
81004 100018 45,00
81005 100034 1,00
PRODUS
CodProdus DenProdus UM Stoc PretVanzare
100001 Canapea Mircea buc 7,00 250,00
100018 Comoda Mia buc 12,00 140,00
100026 Pal furniruit mp 112,00 12,50
100034 Biblioteca Livia buc 4,00 980,00
VANZARE_2FN
NrFacturaDataFactura CodClient NumeClient Adresa Sold
81001 25/01/06 1001 Mota SRL Florilor, 21, Iasi 0
81002 25/01/06 1001 Mota SRL Florilor, 21, Iasi 0
81003 26/01/06 1002 Mobins SA Copou, 11, Vaslui 1500
81004 26/01/06 1002 Mobins SA Copou, 11, Vaslui 1500
81005 27/01/06 1003 Lux SRL Viilor, 45, Husi 2900
Fig. 3.9 Transformarea relaţiei VANZARE în forma a doua normalizată, prin extragerea celor două grupuri de
dependenţe funcţionale parţiale
În urma trecerii bazei de date în 2FN, relaţia VANZARE a fost înlocuită prin cele trei noi relaţii.
După cum se poate observa, operaţia de descompunere s-a realizat fără pierderea de informaţii, iar, pe
baza legăturilor dintre cele trei relaţii, relaţia iniţială VANZARE poate fi oricând reconstituită prin
operaţiunea de joncţiune. Legătura dintre VANZARE_2FN şi ARTICOLFACTURA se realizează pe baza
atributului comun NrFactura (acest atribut joacă rolul de cheie primară în prima relaţie şi pe cel de cheie
străină în cea de-a doua), iar legătura dintre PRODUS şi ARTICOLFACTURA, prin atributul CodProdus
(care este cheie străină în ARTICOLFACTURA).
Este evident că noua structură a bazei de date, care este în forma a doua normalizată, determină o
reducere a redundanţei datelor şi elimină o parte din anomaliile manifestate la actualizarea datelor în
relaţia VANZARE, prezentate în paragraful 3.4.1.
Anomalii la adăugare. Poate fi adăugat un nou produs, chiar dacă acesta nu este implicat încă în
nici o operaţiune de vânzare, prin simpla adăugare a unui tuplu (linie) în relaţia PRODUS.
Anomalii la modificare. Datele care privesc un anumit produs apar o singură dată, deoarece în
relaţia PRODUS există câte un tuplu pentru fiecare produs. Astfel, actualizarea atributului Stoc, pentru a
reflecta o operaţiune de vânzare, implică modificarea acestui atribut doar într-un singur tuplu, respectiv
cel din relaţia PRODUS, care conţine datele privitoare la produsul respectiv.
Anomalii la ştergere. Putem şterge datele despre vânzarea consemnată prin factura 81005, din
relaţia VANZARE_2FN, fără a pierde datele relative la produsul „Bibliotecă Livia”, care rămân neşterse în
tabela PRODUS.
X Y Z
Dependenţă funcţională
tranzitivă
În relaţia VANZARE_2FN există un grup de dependenţe funcţionale tranzitive, care au drept sursă
CodClient. Toate aceste dependenţe sunt prezentate în figura 3.11.
NrFactura CodClient NumeClient
NrFactura CodClient Adresa
NrFactura CodClient Sold
Fig. 3.11 Dependenţele funcţionale tranzitive din relaţia VANZARE_2FN
Se poate deduce deja că aducerea unei relaţii în forma a treia normalizată implică eliminarea
dependenţelor funcţionale tranzitive. Cu alte cuvinte, într-o relaţie toate atributele non-cheie trebuie să
depindă direct de cheia primară a relaţiei. O altă modalitate de formulare – într-o relaţie nu este permis ca
un atribut non-cheie să fie sursa unor dependenţe funcţionale.
Prin urmare, definiţia pentru cea de-a treia formă normalizată poate fi formulată în mai multe
moduri. Să reţinem una dintre ele: o relaţie se află în a treia formă normalizată dacă şi numai dacă ea se
află în cea de-a doua formă normalizată şi nu conţine dependenţe funcţionale tranzitive. De menţionat că
această definiţie presupune existenţa unei singure chei candidat, şi care va fi considerată cheia primară.
Transformarea unei relaţii din 2FN în 3FN se poate realiza în următoarea manieră:
1. identificarea grupurilor de dependenţe tranzitive în relaţia analizată. Un grup de dependenţe
tranzitive va conţine atributul non-cheie care este sursa dependenţelor funcţionale şi atributele
non-cheie care depind de el. În tabela VANZARE_2FN există un singur grup de dependenţe
tranzitive, format din CodClient, ca sursă, NumeClient, Adresa şi Sold, ca destinaţii ale
dependenţelor tranzitive.
2. extragerea grupurilor de dependenţe tranzitive şi constituirea a câte o relaţie nouă pentru fiecare
grup în parte. Sursa dependenţelor tranzitive din grupul respectiv va reprezenta cheia primară a
relaţiilor nou constituite. În exemplul nostru, s-a constituit relaţia CLIENT, iar cheia sa primară
este CodClient.
3. atributele rămase în relaţia iniţială (respectiv cele care depindeau în mod direct de cheie) vor
forma o nouă relaţie, care va avea aceeaşi cheie, şi în care vor fi reţinute şi atributele care
reprezentau sursele dependenţelor tranzitive pentru fiecare grup. Ele vor juca rolul de chei străine
şi vor permite stabilirea legăturilor între tabelele rezultate în urma procesului de descompunere.
În exemplul nostru se va forma relaţia FACTURA, în care NrFactura este cheie primară, iar
CodClient este cheie străină şi permite stabilirea legăturii cu tabela CLIENT, obţinută în pasul
anterior.
Rezultatul descompunerii relaţiei VANZARE_2FN este prezentat în figura 3.12.
Să observăm acum că anomaliile manifestate la actualizarea datelor din relaţia VANZARE_2NF,
prezentate la începutul paragrafului, au fost eliminate.
Anomalii la adăugare. Adăugarea unui client nou poate fi efectuată chiar dacă nu s-a emis încă o
factură pentru acel client, prin inserarea unei linii în tabela CLIENT.
Anomalii la modificare. Datele privitoare la un client anume vor apărea o singură dată, în tabela
CLIENT, iar modificarea unei anumite informaţii despre acesta, de exemplu adresa, va presupune
actualizarea unei singure linii.
Anomalii la ştergere. În cazul ştergerii unei facturi nu mai există posibilitatea pierderii informaţiilor
despre clientul respectiv, deoarece această operaţiune implică ştergerea unei linii din tabela FACTURA, nu
şi a liniei corespunzătoare clientului respectiv din tabela CLIENT.
VANZARE_2FN
NrFacturaDataFactura CodClient NumeClient Adresa Sold
81001 25/01/06 1001 Mota SRL Florilor, 21, Iasi 0
81002 25/01/06 1001 Mota SRL Florilor, 21, Iasi 0
81003 26/01/06 1002 Mobins SA Copou, 11, Vaslui 1500
81004 26/01/06 1002 Mobins SA Copou, 11, Vaslui 1500
81005 27/01/06 1003 Lux SRL Viilor, 45, Husi 2900
FACTURA
NrFactura DataFactura CodClient
81001 25.mai.04 1001
81002 25.mai.04 1001
81003 26.mai.04 1002
81004 26.mai.04 1002
81005 27.mai.04 1003
CLIENT
CodClient NumeClient Adresa Sold
1001 Mota SRL Florilor, 21, Iasi 0
1002 Mobins SA Copou, 11, Vaslui 15000000
1003 Lux SRL Viilor, 45, Husi 29000000
Fig. 3.12 Trecerea relaţiei VANZARE_2FN în cea de-a treia formă normalizată, prin extragerea dependenţelor
tranzitive
După toate operaţiunile efectuate până în acest moment, normalizarea este terminată. Din relaţia
nenormalizată VANZARE s-au desprins patru relaţii în 3FN: CLIENT, PRODUS, FACTURA şi
ARTICOLFACTURA. Baza de date rezultată în urma procesului de normalizare este imaginea fidelă a celei
prezentate în figura 3.1. Anomaliile descrise în paragraful 3.2.2 nu-şi mai pot face simţită prezenţa. De
reţinut este faptul că VANZARE, în forma nenormalizată, poate fi reconstruită din relaţiile 3FN, folosind
algebra relaţională.
6
. Vezi Fotache, M. – op.cit.,
NrFactura CodProdus