Andmebaaside normaliseerimine: definitsioon, normaalvormid ja Codd
Andmebaaside normaliseerimine on lähenemine andmebaaside projekteerimisele, mille võttis kasutusele Edgar F. Codd 1970. aastatel. Teatavad andmebaasid, mida nimetatakse relatsioonilisteks andmebaasideks, võimaldavad andmeid salvestada eraldi gruppidena. Iga rühma nimetatakse tavaliselt tabeliks. Kasuliku teabe saamiseks on need rühmad omavahel seotud. Näiteks võib õpilasi salvestada ühes rühmas ja klassid teises rühmas. Selleks, et näidata, et õpilane on klassis, luuakse "suhe" ühest rühmast teise. Õpilasel võib olla suhe paljude klassidega, millest igaühes ta on sisse kirjutatud, samas kui klassil on suhe paljude õpilastega.
Traditsiooniline alternatiiv on "lamefaili andmebaas", kus kõik andmed on rühmitatud kokku nagu tabelis. Probleem lamefaili andmebaaside puhul on see, et neis võib olla palju tühikuid ja iga kirje puhul tuleb palju teavet korrata. See tähendab, et andmebaas on suurem, kui ta peaks olema, ja see muudab tõenäolisemaks, et andmebaas sisaldab vigu. Relatsioonilised andmebaasid, mis jagavad andmed rühmadesse, vähendavad vigade tekkimise võimalust ja ei võta rohkem ruumi kui vaja. Kuid selleks, et see toimiks, peab see olema hästi kavandatud.
Andmebaaside normaliseerimine on meetod heade relatsiooniliste andmebaaside kujundamiseks. On olemas mitu "normaalvormi", millest igaühel on reeglid, millele andmebaas peaks vastama. Codd määratles algselt kolm kriteeriumide kogumit, millele erinevad andmebaasid peavad vastama: esimene, teine ja kolmas normaalvorm.
Kui seos (või "andmebaasi tabel") vastab teatavale normaalvormile, ei ole see haavatav teatud muudatuste suhtes, mis mõjutavad andmete terviklikkust. Sellele kriteeriumile vastavuse puuduseks on tavaliselt see, et teatud andmete päring andmebaasist muutub keerulisemaks.
Mida normaliseerimine tegelikult tähendab?
Normaliseerimine tähendab andmemudeli kavandamist nii, et iga tabel sisaldaks üht ja ainult üht tähendusrikast üksustüüpi (näiteks õpilased, klassid, kursused). Olulised sammud on:
- andmeüksuste (entiteetide) ja nende atribuutide määratlemine,
- võtmete ja funktsionaalsete sõltuvuste tuvastamine,
- tabelite jaotus nii, et eemaldada mittevajalikud kordused ja sõltuvusprobleemid (anomaliad),
- tagada, et dekompositsioon oleks kaotusteta (lossless) ja võimalusel säilitaks sõltuvused.
Peamised normaalvormid (Codd'i kolm algset)
Alljärgnevalt on lihtsustatud kokkuvõte Codd'i algsetest normaalvormidest ja miks need olulised on:
Esimene normaalvorm (1NF)
1NF nõuab, et iga tabeli lahter sisaldaks ühtset (hüper)massiivivaba väärtust — st ei tohi olla korraga mitme väärtusega lahtrit või manustatud loendit. Praktikas tähendab see, et igal rea–atribuudipaaril on üks väärtus ja kirjed on järjepideva struktuuriga.
Teine normaalvorm (2NF)
2NF lisab tingimuse, et iga mittevõti atribuut peab sõltuma täielikult tabeli põhi- ehk kandidaadvõtmest, mitte ainult selle osast. See kehtib peamiselt tabelite puhul, millel on liitvõti. Kui mõni atribuut sõltub ainult osa liitvõtmest, tuleks see atribuut viia eraldi tabelisse.
Kolmas normaalvorm (3NF)
3NF nõuab, et tabelis ei oleks transitiivseid sõltuvusi: iga mittevõti atribuut peab sõltuma vaid primaarvõtmest ning mitte teistest mittevõtmetest. Kui A → B ja B → C, siis C ei tohiks olla otse sõltuv B-st samas tabelis — tuleks decomposeerida.
Edasised normaalvormid (näited)
Pärast 3NF on praktikas sageli kasutusel ka Boyce–Codd Normal Form (BCNF), mis on rangem kui 3NF ja käsitleb erijuhtumeid, kus kandidaadvõtme asemel võib sõltuvus tekkida mõnest muust atribuudist. On ka kõrgemaid normaalvorme (4NF, 5NF), mis tegelevad multiväärtus- ja liitumissõltuvustega, kuid neid kasutatakse harvemini igapäevapraktilistes andmebaasides.
Normaalvormide mõjude ja anomaaliate näited
Normaliseerimata tabelis võivad tekkida kolm tüüpi anomaaliaid:
- Sisestusanomaalia — raske lisada uut objekti ilma mittevajalike tühjade väljadeta;
- Kustutusanomaalia — olulise info kaotamine, kui kustutatakse rida, mis sisaldas ka teiste asjade kirjeldust;
- Uuendusanomaalia — sama info tuleb mitmes kohas muuta, mis suurendab vigade tekkimise riski.
Näide: kui tabelis "ÕpilaneKlass" on rida (ÕpilasID, ÕpilaseNimi, KlassID, KlassNimi) ja KlassNimi on korduv, siis klassi nime muutmisel tuleb seda uuendada paljudes ridades — see on uuendusanomaalia. Normaliseerides liigitatakse Klass andmebaasi eraldi tabelisse ja säilitatakse viide (võti).
Kuidas normaliseerimine praktiliselt käib?
- Mõtle esmalt läbi, millised üksused (entiteedid) sinu süsteemis eksisteerivad (näiteks õpilane, klass, aine, õpetaja).
- Kirjuta igaüksikule tabelile atribuudid ja tuvastage primaarvõti.
- Mõõtke ja kirjeldage funktsionaalseid sõltuvusi (nt ÕpilasID → ÕpilaseNimi, KlassID → KlassNimi).
- Teosta dekompositsioon, kuni saavutad soovitud normaalvormi (tavaliselt 3NF või BCNF), kontrollides, et dekompositsioon on kaotusteta (lossless join) ja võimalusel sõltuvusi säilitav.
- Testi päringute ja jõudluse osas — mõnikord on mõistlik osa andmetest denormaliseerida, et vähendada keeruliste JOIN-ide arvu ja parandada lugemisjõudlust.
Eelised ja piirangud
Eelised: vähem andmekordusi, väiksem vigade tõenäosus, andmete terviklikkuse tugevdamine ja lihtsam hooldus.
Piinangud: rohkem tabeleid tähendab tihti keerukamaid päringuid ja rohkem JOIN-e, mis võib mõjutada jõudlust. Praktikas tehakse tasakaal: normaliseeritakse kuni mugava ja tõhusa tasemeni ning vajadusel denormaliseeritakse jõudluse optimeerimiseks.
Kokkuvõte ja soovitused
Normaliseerimine on võimas vahend relatsiooniliste andmebaaside kavandamisel — see vähendab vigu ja säilitab andmete terviklikkust. Algtasemel on siht 1NF → 2NF → 3NF (või BCNF), kusjuures keerukamate sõltuvuste korral võib olla vajalik kõrgem normaalvorm. Alati tasub hinnata ka rakenduse päringute ja jõudluse nõudeid: mõnikord on mõistlik teha teadlikke denormaliseerimisvalikuid.
Praktiline näpunäide: dokumenteeri funktsionaalsed sõltuvused ja võtmed selgelt enne tabelite lõplikku paigutamist — see lihtsustab nii normaliseerimist kui ka edasist hooldust.
Küsimused ja vastused
K: Mis on andmebaaside normaliseerimine?
V: Andmebaaside normaliseerimine on lähenemisviis andmebaaside projekteerimisele, mille võttis 1970. aastatel kasutusele Edgar F. Codd. See hõlmab andmete jagamist eraldi gruppidesse, mida nimetatakse tabeliteks, ja nende vaheliste seoste loomist, et anda kasulikku teavet.
K: Mis on lamefaili andmebaas?
V: Lamefaili andmebaas on andmebaas, kus kõik andmed on rühmitatud kokku nagu arvutustabelis. See võib põhjustada palju tühikuid ja korduvat teavet, mis muudab vigade tekkimise tõenäolisemaks.
K: Kuidas vähendavad relatsioonilised andmebaasid vigade tekkimise võimalust?
V: Relatsioonilised andmebaasid jagavad andmed rühmadesse, vähendades vigade tekkimise võimalust ja vältides ruumi hõivamist rohkem kui vaja.
K: Mis on normaalvormid?
V: Normaalvormid on kriteeriumid, millele erinevad andmebaasid peavad vastama, et nad oleksid hästi kavandatud relatsioonilised andmebaasid. On olemas mitu "normaalvormi", millest igaühel on oma reeglistik, millele andmebaas peaks vastama.
K: Millised on teatud kriteeriumikogumite täitmisega seotud puudused normaalvormide puhul?
V: Sellistele kriteeriumide kogumile vastavuse puuduseks on tavaliselt see, et teatud andmete päring andmebaasist muutub keerulisemaks.