2011 m. rugpjūčio 2 d., antradienis

Duomenų bazės modelio optimizavimas: normalizavimas, de-normalizavimas

Kuriant duomenų bazes iškyla klausimas, kaip galėtume sukurti greitą ir patogią duomenų bazę kurioje nesidubliuotų duomenys. Norint suprasti kas rašoma šitam pranešime turėtumėte būti susipažinę su duomenų bazių reliaciniu modeliu ir modeliavimu. Nors esu tik pradedantis "modeliuotojas" ir apskritai tik pradedu domėtis ir gilinti savo žinias it srityje, iš paskaitų ir literatūros šaltinių radau/gavau daug informacijos, kuria pasidalinsiu su jumis.

Automatinė optimizacija

Optimizuoti duomenų bazę galima naudojant phpAdmin reikia pasirinkti duomenų bazę ir pažymėti lenteles kurias norime optimizuoti ir paspausti mygtuką Optimize table jūsų duomenų bazė optimizuota automatiškai.  Tai gali būt naudinga arba žalinga:
  •  Gali prarasti dalį informacijos, reikia optimizuoti atsargiai
  • Naudinga nes mažiau dubliuotų įrašų lentelėse, greičiau veikia paieška

Ši optimizacija naudojama kai dažnai keičiamos lentelės lentelės arba didelis kiekis duomenų, dažnai keičiami lentelių duomenys. Ši optimizacija nepadeda sukurti geresnio modelio ir sukūrus modelį netinkamai galima prarasti didelę dalį informacijos, arba duomenų paieškos laikas labai paiilgėja.

Norint patobulinti jūsų sukurtą duomenų bazės modelį, kad duomenų bazė jums būtų patogesnė ir greitesnė arba užimtų mažiau vietos (t.y. būtų mažiau pasikartojančių duomenų), galima pasirinkti kelis būdus kaip tai padaryti:
  • Modelio normalizavimas (padeda sumažinti duomenų dubliavimasi)
  • Modelio de-normalizavimas (padeda sistemai greičiau veikti, kartais patogiau naudoti)

Normalios formos ir normalizavimas

Normalizuotos duomenų bazės turėtų būti vientisos, t.y. jų duomenys nesikartojantys ir pilnai aprašantys subjektą (pvz.: Užsakymas). Normalizacija kitais žodžiais tai yra lentelių išskaidymas, kad kiekviena lentelė atskirai apibūdintų tik vieną subjektą pagal jai priskirtą raktą, o jei subjekto savybės kartojasi jam sukuriama atskira lentelė su raktais. Taip išvengiama duomenų kartojimosi , lengviau tvarkyti duomenis esančius lentelėse.
Normalizacija dažniausiai padeda sumažinti duomenų bazėje esančių duomenų dydį,
Paprastesnės užklausos, nereikia sudėtingų užklausų, bet kartais gali būt ir sudėtingesnės,
Paprastesni atnaujinimai (updates), bet kartais gali būti sudėtingesni.

Normalizacija turi tris normalias formas:
  1. Subjektas yra pirmoje normalioje formoje, kai neturi lentelėje pasikartojančių duomenų grupių
  2. Subjektas yra antroje normalioje formoje kai ne raktinės savybės priklauso tik nuo jį apibūdinančio rakto
  3. Trečioje normalioje formoje, tai subjekto 2 normali forma tik visos savybės turi būti priklausančios tik nuo vieno rakto
Paimkime pavyzdį, kad viskas būtų aiškiau. Aš kūriau duomenų bazę kurioje pagrindinis subjektas buvo pirkiniai, duomenų bazės tikslas atvaizduoti, kiek kainuoja prekės skirtingose parduotuvėse.

Tarkime kad mano duomenų bazę sudaro tik viena lentelė su visom savybėm (0 normali forma):
----------------
Pirkiniai(0NF)
----------------
PirkinioID
PirkinioData
PirkinioIšlaidųTipas
PirkinioKaina
PirkinioNuolaidosData (jei yra nuolaida kada baigiasi jos galiojimas)
PrekėsTipas
PrekėsPavadinimas
PrekėsKiekis
PrekėsMaistingumas
PrekėsKokybė
ParduotuvėsPavadinimas
ParduotuvėsAdresas
PirkėjoNustatytaKokybė
-----------------
Kaip matome, kad su kiekvienu pirkiniu lentelėje gali kartotis parduotuvių pavadinimai pvz: prekė Batonas "pamarių" gali būti IKI ir Maxima ir Rimi parduotuvėse, taip pat tą pačią prekę galima pirkti ir kitą dieną pirkau vakar ir tarkim šiandien, todėl pirkinį taip pat reikia išskirti. Taigi perkant tas pačias prekes skirtingom dienom labai dažnai kartojasi ta pati informacija, taip pat su parduotuvėmis, pagrindinių prekybos centrų pavadinimų yra nedaug, tad kam juos kartoti, todėl tokias lenteles reikia normalizuoti.


  • Modeliuodamas išskyriau keturis subjektus: Pirkiniai, Prekės, Parduotuvės, Pirkėjai.
Duomenų bazės 1 normali forma, lentelėse duomenų grupės nesikartoja
Pastaba: kaip matyti iš paveikslo pirkinio kaina įvesta prie pirkinių, o ne prie prekių todėl, kad prekė čia yra apibendrintas subjektas, kiekvienoje parduotuvėje prekė gali turėti skirtingą kainą. Įpatingą dėmesį pirmojoje normalizuotoje formoje reiktų skirti Raktams ir Išoriniams Raktams nes raktai apibūdina ryšį kad prekės gali turėti daug pirkinių 1..* - 1 bet pirkinys apibūdins tik vieną prekę kurią pirko vienas vartotojas iš tam tikros parduotuvės.

  • Antros normalios formos apibrėžimas teigia, kad kiekvienas subjektas turi grynai priklausyti nuo jo apibūdinančio rakto. Mano atveju visi raktai priklauso antrai normaliai formai, tačiau įsivaizduokime jei prekės lentelė turėtų daugiau duomenų susijusių su jos maistingumu ar kokybė: galiojimo data, angliavandenių kiekis, riebalų kiekis, baltymų kiekis, rekomenduojamos paros normos ir pan, tada tokią lentelę reiktų išskaidyti į dvi:

Tai būtų antroji normali forma. Ateityje pabandysiu sukurti geresnių pavyzdžių ir pridėsiu nuorodas į šį žiniatinklį,

  • Trečia normali forma tai beveik tas pats kas antra normali forma, tačiau reikalauja, kad subjektas būtų kiek galima labiau paaiškintas savybėmis, t.y. tarkime Vartotojo Prekės Įvertinimą galima būtų reitinguoti, išskirti pagal populiarumą, ir pridėti papildomą informaciją.

Denormalizacija

Kartais daug paprasčiau viską turėti vienoje lentelėje, jeigu viskas išdėstyta eilės tvarka prie tokios lentelės patogiau prieiti ir ištraukti duomenis. Ir užklausos tam tikriems objektams ištraukti, tampa lengvesnės. Tokios pavienės lentelės užimtų labai daug vietos ir turėtų daug pasikartojančių duomenų. 

Manau, kad duomenų bazių modeliavimas yra daugiau kūrybinis procesas ir nuo jūsų pačių priklausys jos efektyvumas.  Sėkmės.


Naudota literatūra:


P.S.: Šis įrašas bus taisomas siekiant geriau išmokti aprašytą subjektą, ir pateikiant tikslesnę informaciją. Jeigu žinote paprastesnį normalizacijos paaiškinimą palikite komentarą.