Normalizavimas

Duomenų normalizavimas iš esmės yra duomenų pasikartojimo mažinimas. Štai pavyzdys, kaip atrodo denormalizuoti duomenys:

šalis miestas
Lietuva Vilnius
Lietuva Kaunas
Lietuva Klaipėda

Kaip matote, stulpelyje šalis daug kartų pakartota reikšmė Lietuva. Toks duomenų pasikartojimas kelia daug problemų, jei duomenys keičiasi arba tas pats objektas gali būti pavadintas keliais skirtingais pavadinimais. Tarkime, turime duomenis iš kito tiekėjo, kurie atrodo taip:

šalis miestas
Lietuvos respublika Šiauliai
Lietuvos respublika Panevėžys

Matome, kad šioje vietoje ta pati šalis pavadinta skirtingai.

Tokias besikeičiančių ir pasikartojančių duomenų problemas padeda spręsti unikalūs identifikatoriai arba pirminiai raktai.

Norint normalizuoti duomenis, mūsų lentelę reikia išskaidyti į dvi atskiras lenteles:

Šalys

id šalis
1 Lietuva

Miestai

id šalis miestas
1 1 Vilnius
2 1 Kaunas
3 1 Klaipėda
4 1 Šiauliai
5 1 Panevėžys

Turinti tokią normalizuotą duomenų bazę, galima nesunkiai keisti šalies pavadinimą, galima į šalies lentelę įtraukti daugiau atributų ir visa tai užtenka padaryti vienoje vietoje, kadangi šalies pirminis raktas niekada nesikeičia.

Pirminius duomenis visada rekomenduojama saugoti normalizuotoje formoje, o denormalizuotos duomenų bazės kuriamos normalizuotos duomenų bazės pagrindu, jei norima atlikti duomenų analizę išvengiant skirtingų lentelių jungimo kainos.

Manifestas

Manifesto duomenų struktūrų aprašai turėtų būti kiek įmanoma normalizuoti. Jei pirminis duomenų šaltinis yra denormalizuotas, duomenų aprašuose nesunkiai galima atlikti normalizavimą, su sąlyga, jei įmanoma unikaliai identifikuoti objektus. Kaip pavyzdį imkime tą pačią denormalizuotą miestų lentelę:

šalis miestas
Lietuva Vilnius
Lietuva Kaunas
Lietuva Klaipėda

Tarkime ši lentelė yra pateikta CSV formatu adresu https://example.com/miestai.csv.

Šiuo lentelės duomenų aprašas turėtų atrodyti taip:

name: pavyzdziai/normalizavimas
type: dataset
resources:
  miestai:
    type: csv
    objects:
      geografija/salis:
        source: https://example.com/miestai.csv
        properties:
          id:
            type: pk
            source: šalis
          pavadinimas:
            type: string
            source: šalis
      geografija/miestas:
        source: https://example.com/miestai.csv
        properties:
          id:
            type: pk
            source: šalis
          salis:
            type: ref
            object: geografija/salis
            source: šalis
          pavadinimas:
            type: string
            source: miestas

Iš šio pavyzdžio matome, kad miestų duomenys skaitomi du kartus ir paskirstomi dviejose lentelėse. Pirmą kartą skaitome tik šalys, generuojant pirminį raktą iš šalies pavadinimo, antrą kartą skaitome tik miestus ir prijungiame šalį panaudojant šalies pirminį raktą. Galutiniame rezultate gauname tokias lenteles:

geografija/salis

id pavadinimas
098b634e Lietuva

geografija/miestas

id salis pavadinimas
8e65fec0 098b634e Vilnius
4fe80490 098b634e Kaunas
cad19c34 098b634e Klaipėda

Sinonimai

Klausimas, ką daryti, jei duomenų šaltinis tą patį objektą vadina skirtingais pavadinimais, jei ta pati šalis turi du sinonimus Lietuva arba Lietuvos respublika?

Deja, tokiais atvejais automatinių priemonių nėra ir duomenys turi būti tvarkomi pirminiame šaltinyje, arba transformuojant rankiniu būdu pasitelkiant sinonimų lenteles ar kitas priemones. Duomenų normalizavimas veikia tik turint unikaliai objektą identifikuojančias reikšmes.