Normalizácia relačnej databázy podľa prvej normálovej formy (NF1)

Od Peter Tokoš

       Ak navrhujeme relačnú databázu, musíme návrh realizovať v súlade so štyrmi normálovými formami. Normalizáciou rozumieme odstraňovanie duplicitných údajov v databáze, tiež eliminovanie nekonzistentných dát.

V tomto článku si ukážeme návrh databázovej tabuľky v súlade s prvou normálovou formou NF1, ktorá požaduje aby:

  • každý atribút obsahoval len také hodnoty, ktoré sú atomické (ďalej nedeliteľné), napr. atribút „meno a priezvisko“ nie je atomický. Je potrebné ho rozdeliť osobitne na „meno“ a „priezvisko“,
  • každú riadok záznamu musel obsahovať jednoznačný identifikátor,
  • databázová tabuľka nesmela obsahovať rovnaké, či podobné atribúty.

Príklad: vytvoríme tabuľku s názvom  „používatelia“. Tá bude obsahovať atribúty meno, priezvisko, vek, povolanie a číslo bankového účtu.

pouzivatelIDmenopriezviskovekpovolanieIBAM
1JánMrkvička34herecSK3400000034500456854432
2PeterNovák55učiteľSK2200000014530454123435

Ak sa pozrieme na tabuľku, ktorú sme vytvorili, musíme konštatovať, že je v súlade s prvou normálovou formou. Nie sú tam rovnaké alebo podobné atribúty, obidve záznamy obsahujú jednoznačný identifikátor v podobe pouzivatelID, hodnoty atribútov sú atomické.

V súčasnosti má mnoho ľudí viacej bankových kont. Peter Novák, ktorého evidujeme v databázovej tabuľke má tri bankové účty. Ak by sme chceli Petrovi Novákovi zaevidovať všetky tri nastal by problém.  Mohli by sme to vyriešiť napr. takto:

pouzivatelIDmenopriezviskovekpovolanieIBAM
1JánMrkvička34herecSK3400000034500456854432
2PeterNovák55učiteľSK2200000014530454123435, SK2234000014530454123434, SK2810450014530454123432

Takéto riešenie nie je najšťastnejšie. Atribút IBAM má pri druhom zázname tri hodnoty. Vyhľadávanie by mohlo byť v tomto prípade sťažené.  Mohli by sme to vyriešiť tiež takto:

pouzivatelIDmenopriezviskovekpovolanieIBAM
1JánMrkvička34herecSK3400000034500456854432
2PeterNovák55učiteľSK2200000014530454123435
2PeterNovák55učiteľSK2234000014530454123434
2PeterNovák55učiteľSK2810450014530454123432

Pridali sme ďalšie riadky. Toto riešenie však nie je správne, pretože máme veľa duplicitných hodnôt. Jednoznačný identifikátor id_pouzivatela tiež už nie je jednoznačný, lebo obsahuje rovnaké hodnoty. Mohli by sme ponúknuť ďalšie riešenie, napr.:

pouzivatelIDmenopriezviskovekpovolanieIBAM1IBAM2IBAM3
1JánMrkvička34herecSK3400000034500456854432  
2PeterNovák55učiteľSK2200000014530454123435  
2PeterNovák55učiteľ SK2234000014530454123434 
2PeterNovák55učiteľ  SK2810450014530454123432

V tomto prípade máme opakujúce, prípadne podobné atribúty, čo je neprípustne. Čo ak bude mať používateľ viacej ako tri bankové účty? Budeme pridávať ďalšie atribúty do tabuľky?

Správnym riešením je vytvorenie ďalšej tabuľky, v ktorej budeme evidovať len bankovú účty. Prvá normálová forma  NF1 bude dodržaná.  Vykonáme dekompozíciu na dve tabuľky:

tab.: pouzivatelia

pouzivatelIDmenopriezviskovekpovolanie
1JánMrkvička34herec
2PeterNovák55učiteľ

tab.: ibam

pouzivatelIDIBAM
1SK3400000034500456854432
2SK2200000014530454123435
2SK2234000014530454123434
2SK2810450014530454123432