Duomenų bazių normalizavimas: sąvoka, normaliosios formos ir pavyzdžiai
Duomenų bazių normalizavimas: aiškus paaiškinimas apie normaliasias formas, taisykles ir pavyzdžius — sužinokite, kaip pagerinti duomenų vientisumą ir užklausų efektyvumą.
Duomenų bazių normalizavimas - tai duomenų bazių projektavimo metodas, kurį XX a. aštuntajame dešimtmetyje pristatė Edgaras F. Coddas. Kai kuriose duomenų bazėse, vadinamosiose reliacinėse duomenų bazėse, duomenis galima saugoti atskiromis grupėmis. Kiekviena grupė paprastai vadinama lentele. Kad būtų galima pateikti naudingos informacijos, šios grupės yra sujungtos tarpusavyje. Pavyzdžiui, mokiniai gali būti saugomi vienoje grupėje, o klasės - kitoje grupėje. Norint parodyti, kad mokinys yra įrašytas į klasę, iš vienos grupės į kitą nustatomas "ryšys". Mokinys gali turėti ryšį su daugeliu klasių, kurių kiekvienoje jis būtų įrašytas, o klasė turėtų ryšį su daugeliu mokinių.
Tradicinė alternatyva yra "plokščioji failų duomenų bazė", kurioje visi duomenys sugrupuoti kaip skaičiuoklėje. Plokščiųjų failų duomenų bazų problema yra ta, kad jose gali būti daug tuščių vietų, o kiekviename įraše reikia pakartoti daug informacijos. Tai reiškia, kad duomenų bazė yra didesnė, nei turi būti, ir dėl to yra didesnė tikimybė, kad duomenų bazėje bus klaidų. Reliacinės duomenų bazės, suskirstydamos duomenis į grupes, sumažina klaidų tikimybę ir neužima daugiau vietos nei reikia. Tačiau kad ji veiktų, turi būti gerai suprojektuota.
Kam reikalingas normalizavimas?
- Mažinti duomenų pasikartojimą — taip taupoma vieta ir sumažinamas neteisingų/nesuderintų įrašų pavojus.
- Išvengti anomalijų — įterpimo, atnaujinimo ir trinimo anomalijų, kai keitimas vienoje vietoje neatsispindi kitur.
- Palaikyti vientisumą — aiškūs pirminiai raktai, užsienio raktai ir priklausomybės padeda užtikrinti taisyklingus ryšius tarp lentelių.
- Palengvinti priežiūrą ir plėtrą — gerai suplanuota struktūra leidžia lengviau keisti schemą ar verslo taisykles.
Pagrindinės normaliosios formos
Normalizavimas apibrėžiamas per normaliasias formas (NF). Kiekviena seka prideda reikalavimų, kad būtų pašalintos tam tikros priklausomybės ar anomalijos.
- Pirmoji normalioji forma (1NF) — kiekviena lentelės ląstelė turi talpinti vieną atomarinę (ne suskaldytą) reikšmę; nėra pasikartojančių grupių.
- Antra normalioji forma (2NF) — atitinka 1NF ir neturi dalinių priklausomybių, t. y. jokie ne raktiniai atributai nepriklauso tik daliai sudėtinio pirminio rakto.
- Trečioji normalioji forma (3NF) — atitinka 2NF ir neturi tranzityvių priklausomybių (ne raktiniai atributai nepriklauso per kitą ne raktinį atributą).
- Boyce–Codd normalioji forma (BCNF) — griežtesnė 3NF forma: kiekviena netriviali funkcinių priklausomybių kairė pusė turi būti superraktas.
- Ketvirtoji normalioji forma (4NF) — neleidžia daugiareikšmių priklausomybių (multi-valued dependencies).
- Penktoji normalioji forma (5NF) — užtikrina, kad visi duomenys gali būti rekonstruojami iš elementarių lentelių be perteklinių priklausomybių (sprendžia sudėtingas sujungimo priklausomybes).
Funkcinės priklausomybės ir anomalijos
Normalizavimas grindžiamas funkcinėmis priklausomybėmis. Jei atributas B funkciškai priklauso nuo A (rašoma A → B), tai A nustato B reikšmę. Problemos kyla, kai priklausomybės prastai sutvarkytos:
- Atnaujinimo anomalija — pakeitus informaciją (pvz., mokinio klasę), reikia keisti kelis įrašus; kitaip liks neatitikimų.
- Įterpimo anomalija — negalima įterpti tam tikros informacijos, neturint kai kurių kitų duomenų (pvz., negalima sukurti klasės be priskirto mokinio jei schema to reikalauja).
- Ištrynimo anomalija — ištrynus įrašą, netyčia prarandama ir svarbi susijusi informacija (pvz., paskutinio mokinio ištrynimas ištrynė visą klasės aprašymą).
Normalizavimo žingsniai — paprastas pavyzdys
Tarkime, pradiniame (plokščiajame) faile turime įrašus:
- StudentID, StudentName, ClassID, ClassName
- Tokioje struktūroje ClassName kartojasi kiekvienam mokiniui priklausančiam klasei — tai perteklinis duomenų kartojimas.
Normalizavimo eiga:
- 1 žingsnis (1NF): užtikrinti atomines reikšmes — atskiros ląstelės, jokių sąrašų vienoje ląstelėje.
- 2 žingsnis (2NF): išskaidyti lentelę pagal priklausomybes:
- Students(StudentID, StudentName)
- Classes(ClassID, ClassName)
- Enrollments(StudentID, ClassID) — ryšys tarp mokinių ir klasių
- 3 žingsnis (3NF): patikrinti, ar nėra tranzityvių priklausomybių ir pašalinti jas (pvz., jei ClassroomLocation būtų priklausomas nuo ClassID, jis liktų Classes lentelėje, o ne Students).
Po normalizavimo:
- Nebereikia dauginti ClassName kiekvienam mokiniui.
- Atnaujinus klasės pavadinimą, pakeitimas atliekamas tik vienoje vietoje (Classes).
- Įterpimo ir ištrynimo anomalijų rizika sumažėja.
Praktiniai patarimai ir kompromisai
- Normalizuokite iki reikiamo lygio — dažniausiai iki 3NF arba BCNF, nebent yra konkretus poreikis aukštesnėms formoms.
- Performance vs. konsistencija — aukštesnė normalizacija sumažina duomenų dubliavimą, bet padidina užklausų sujungimų (JOIN) skaičių. Kai kuriais atvejais tikslinga atlikti denormalizaciją (tyčinis duomenų dubliavimas) siekiant spartesnių užklausų.
- Naudokite užtikrinimus — pirminiai raktai, užsienio raktai, unikalumo apribojimai ir transakcijos padeda išlaikyti duomenų vientisumą.
- Indeksai ir materializuotos peržiūros — padeda kompensuoti normalizacijos sukeliamą našumo nuostolį be didelio struktūros pakeitimo.
- Testuokite realiomis apkrovomis — dizaino sprendimai turėtų būti patikrinti su numatomu duomenų kiekiu ir užklausų tipu.
Trumpai apie denormalizaciją
Denormalizacija yra sąmoningas sprendimas įvesti tam tikrą duomenų pasikartojimą siekiant pagerinti skaitymo/užklausų našumą. Tai priimtina, jei:
- Užklausų kiekis ir našumo reikalavimai pateisina papildomą vietos naudojimą.
- Yra mechanizmai (trigeriai, transakcijos, programinis atnaujinimas) užtikrinti, kad dubliuoti duomenys liktų sinchronizuoti.
Išvados
Duomenų bazių normalizavimas yra pagrindinė reliacinių duomenų bazių projektavimo praktika, leidžianti:
- sumažinti duomenų dubliavimą ir klaidų tikimybę,
- užtikrinti duomenų vientisumą,
- palengvinti schemos palaikymą ir plėtrą.
Vis dėlto praktikoje būtina rasti pusiausvyrą tarp normalizacijos lygio ir sistemos našumo — kartais tikslinga denormalizuoti tam tikras sritis arba naudoti papildomas optimizavimo priemones.
Klausimai ir atsakymai
K: Kas yra duomenų bazių normalizavimas?
A: Duomenų bazių normalizavimas - tai duomenų bazių projektavimo metodas, kurį XX a. aštuntajame dešimtmetyje pristatė Edgaras F. Coddas. Jis apima duomenų suskirstymą į atskiras grupes, vadinamas lentelėmis, ir ryšių tarp jų nustatymą, kad būtų galima gauti naudingos informacijos.
K: Kas yra plokščioji duomenų bazė?
A: Plokščiosios rinkmenos duomenų bazė - tai duomenų bazė, kurioje visi duomenys sugrupuoti kaip skaičiuoklėje. Dėl to gali būti daug tuščių langelių ir pasikartojančios informacijos, todėl didesnė tikimybė, kad bus padaryta klaidų.
K: Kaip reliacinės duomenų bazės sumažina klaidų tikimybę?
A: Reliacinės duomenų bazės suskirsto duomenis į grupes, todėl sumažėja klaidų tikimybė ir neužima daugiau vietos nei reikia.
K: Kas yra normaliosios formos?
A: Normaliosios formos - tai kriterijai, kuriuos turi atitikti skirtingos duomenų bazės, kad jos būtų gerai suprojektuotos reliacinės duomenų bazės. Yra keletas "normaliųjų formų", kurių kiekviena turi savo taisyklių rinkinį, kurį duomenų bazė turėtų atitikti.
K: Kokie yra tam tikrų normaliųjų formų kriterijų rinkinių atitikimo trūkumai?
A: Tokių kriterijų rinkinio atitikimo trūkumas paprastai yra tas, kad tam tikrų duomenų užklausos iš duomenų bazės taps sudėtingesnės.
Ieškoti