Normalizácia relačnej databázy podľa prvej normálovej formy (NF1)
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.
pouzivatelID | meno | priezvisko | vek | povolanie | IBAM |
1 | Ján | Mrkvička | 34 | herec | SK3400000034500456854432 |
2 | Peter | Novák | 55 | uč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:
pouzivatelID | meno | priezvisko | vek | povolanie | IBAM |
1 | Ján | Mrkvička | 34 | herec | SK3400000034500456854432 |
2 | Peter | Novák | 55 | uč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:
pouzivatelID | meno | priezvisko | vek | povolanie | IBAM |
1 | Ján | Mrkvička | 34 | herec | SK3400000034500456854432 |
2 | Peter | Novák | 55 | učiteľ | SK2200000014530454123435 |
2 | Peter | Novák | 55 | učiteľ | SK2234000014530454123434 |
2 | Peter | Novák | 55 | uč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.:
pouzivatelID | meno | priezvisko | vek | povolanie | IBAM1 | IBAM2 | IBAM3 |
1 | Ján | Mrkvička | 34 | herec | SK3400000034500456854432 | ||
2 | Peter | Novák | 55 | učiteľ | SK2200000014530454123435 | ||
2 | Peter | Novák | 55 | učiteľ | SK2234000014530454123434 | ||
2 | Peter | Novák | 55 | uč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
pouzivatelID | meno | priezvisko | vek | povolanie |
1 | Ján | Mrkvička | 34 | herec |
2 | Peter | Novák | 55 | učiteľ |
tab.: ibam
pouzivatelID | IBAM |
1 | SK3400000034500456854432 |
2 | SK2200000014530454123435 |
2 | SK2234000014530454123434 |
2 | SK2810450014530454123432 |