vikson | 06 Februar, 2012 21:29
Običnim riječima jedna kupovina se može opisati ovako: Jutros sam bio/la u onom PKB ispod moje zgrade. Kupio/la sam 1 veknu hljeba, malo salame, 1 paklicu cigareta i 10 jaja. Sve me je koštalo oko 500 dinara, pa sam platio/la kešom. Radi neka nova prodavačica.
Podaci o kupovini su u bazi upisani precizno i bez ličnih utisaka. Šta to znači? Namjesto jutros upisan je tačan datum i vrijeme kupovine, namjesto malo salame, upisana je tačna količina, namjesto oko 500 dinara omogućen je izračun iznosa kupovine,..
Vratimo se na primjere iz predhodnog bloga. Podatke o kupovini smo opisali pomoću sledećih tabela:
Zaposlena osoba
Artikal/Usluga
Organizacijska jedinica
Način plaćanja
Račun
Element računa
Normalan čovjek će sada reći, e opet ti "programeri", samo nešto komplikuju. Zar to ne može sve da se čuva u tamo nekoj tabeli, a ne da moram da gledam u njih 7 da bi došao do informacije o nekoj kupovini. Baš zato da bi ti podaci bili tačni i jednoznačni je najbolje da su čuvani u tabele, koje opisuju prirodne objekte, a ne na jednu gomilu bez glave i repa.
Sledeći redovi će opisati kako iz te gomile neuredjenih podataka dolazimo do uredjenih tabela koje su medjusobno povezane.
Postupak uredjivanja podataka se zove normalizacija.
Normalizacija ima za cilj eliminisanje nepotrbnog ponavljanja podataka (redudantnost) i osiguravanje da su zavisnosti izmedju podataka logične. U praksi se koristi 6 normalnih formi, od čega su prve tri najčešće zastupljene:
Prva normalna forma
Druga normalna forma
Treća normalna forma
Boyce-Codova normalna forma
Četvrta normalna forma
Peta normalna forma
U ovom gradivu ćemo se ograničiti na postupke normalizacije od prve do treće normalne forme.
1NF - prva normalna formaPodaci v nenormalizovanoj formi.
| Šif.Rač | Šif.Org.Jed | Org.Jed | Šif.Prod | Prod | Šif.NP | NP | RB | Šif.art/usl | Art/Usl | JM | Kol | OS.Cjena | Proc.Poreza |
| 1 | 2A | Trgovina - Stari Beograd | 1 | Petar | K | Keš | 1 | D001 | Salama | kg | 0,15 | 123,8 | 8,5 |
| 2 | P002 | Mlijeko - PKB | l | 2 | 80 | 8,5 | |||||||
| 3 | P123 | Rakija - CGK | l | 1 | 1002 | 20 | |||||||
| 2 | 2A | Trgovina - Stari Beograd | 1 | Petar | G | Gotovina | 1 | H023 | Sapun - Palmolive - ruža | kom | 1 | 55 | 20 |
| 2 | H045 | Omekšivač - Luna | kom | 2 | 332 | 20 | |||||||
| 3 | P002 | Mlijeko - PKB | l | 3 | 80 | 8,5 | |||||||
| 4 | S346 | Sir za mazanje - ABC | kom | 1 | 458 | 8,5 | |||||||
| 3 | 1B | Trgovina - Zemun | 2 | Marija | G | Gotovina | 1 | L037 | Crijevo r.4 | m | 3,2 | 552 | 20 |
| 4 | 1A | Trgovina - Novi Beograd | 1 | Petar | K | Keš | 1 | P002 | Mlijeko - PKB | l | 1 | 80 | 8,5 |
| 2 | D038 | Zavjesa | m2 | 1,2 | 567 | 20 |
Intuitivno bi kreirali tabelu koja bi imala kolone: Račun, rb1, rb2, rb3, rb4, art1, art2,art3,art4, .... Odmah se postavlja pitanje, šta ako kupimo više od 4 artikla na jednom računu. Znači nešto nije u redu.
Probajmo ponovo. U drugoj iteraciji bi kreirali tabelu koja bi mogla čuvati podatke o kupovini neograničenog broja artikala: Račun, rb, art. Podaci bi izgledali kao u donjoj tabeli.
| Šif.Rač | Šif.Org.Jed | Org.Jed | Šif.Prod | Prod | Šif.NP | NP | RB | Šif.art/usl | Art/Usl | JM | Kol | OS.Cjena | Proc.Poreza |
| 1 | 2A | Trgovina - Stari Beograd | 1 | Petar | K | Keš | 1 | D001 | Salama | kg | 0,15 | 123,8 | 8,5 |
| 1 | 2A | Trgovina - Stari Beograd | 1 | Petar | K | Keš | 2 | P002 | Mlijeko - PKB | l | 2 | 80 | 8,5 |
| 1 | 2A | Trgovina - Stari Beograd | 1 | Petar | K | Keš | 3 | P123 | Rakija - CGK | l | 1 | 1002 | 20 |
| 2 | 2A | Trgovina - Stari Beograd | 1 | Petar | G | Gotovina | 1 | H023 | Sapun - Palmolive - ruža | kom | 1 | 55 | 20 |
| 2 | 2A | Trgovina - Stari Beograd | 1 | Petar | G | Gotovina | 2 | H045 | Omekšivač - Luna | kom | 2 | 332 | 20 |
| 2 | 2A | Trgovina - Stari Beograd | 1 | Petar | G | Gotovina | 3 | P002 | Mlijeko - PKB | l | 3 | 80 | 8,5 |
| 2 | 2A | Trgovina - Stari Beograd | 1 | Petar | G | Gotovina | 4 | S346 | Sir za mazanje - ABC | kom | 1 | 458 | 8,5 |
| 3 | 1B | Trgovina - Zemun | 2 | Marija | G | Gotovina | 1 | L037 | Crijevo r.4 | m | 3,2 | 552 | 20 |
| 4 | 1A | Trgovina - Novi Beograd | 1 | Petar | K | Keš | 1 | P002 | Mlijeko - PKB | l | 1 | 80 | 8,5 |
| 4 | 1A | Trgovina - Novi Beograd | 1 | Petar | K | Keš | 2 | D038 | Zavjesa | m2 | 1,2 | 567 | 20 |
Pravilo 1NF definiše atomarnost tabele. To znači da u jednom redu tabele ne možemo imati duple podatke. Tabela mora imati primarni ključ (Šif.Rač, RB). Pored toga ne možemo imati duple kolone za isti atribut (rb,Šif.art/usl, Art/Usl, JM, Kol., Os.Cjena, Proc.Poreza).
2 NF - druga normalna forma
Dobili smo uredjenu tabelu podataka. Ali, šta kažete na toliko ponavljanje podataka? Mislite o tome da te podatke neko unosi u tabelu.
U gornjem primjeru je podatke uredjivala "programerka". Šta bi bilo ako bi Prodavac u svakom redu podatke koji se ponavljaju napisao malo drugačije (npr: način plaćanja može se napisati: Keš, kš, novac, dinari...).
I šta sad? Opet gledamo kako eliminisati ponavljanje podataka. To znači da bi trebali identificirati podatke koji se ponavljaju i odrediti za njih podključe (identifikatore). Potom te podatke izdvojiti u novu tabelu. U našem primjeru ih imamo više:
Organizacijske jedinice: Šif.Org.Jed, Org.Jed
Zaposlena osoba: ŠifProd, Prod
Način plaćanja: Šif.NP, NP
Artikal/Usluga: Šif.Art/Usl, Art/Usl
I tako je nastala tabela, koja nema opise za podatke koji se ponavljaju. U "glavnoj tabeli" su nam ostale samo šifre (šif.rač, šif.org.jed, šif.prod, šif.np, šif.art/usl, jm) i podaci o kupovini (količina, os.cijena, proc.poreza).
| Šif.Rač | Šif.Org.Jed | Šif.Prod | Šif.NP | RB | Šif.art/usl | JM | Kol | OS.Cjena | Proc.Poreza |
| 1 | 2A | 1 | K | 1 | D001 | kg | 0,15 | 123,8 | 8,5 |
| 1 | 2A | 1 | K | 2 | P002 | l | 2 | 80 | 8,5 |
| 1 | 2A | 1 | K | 3 | P123 | l | 1 | 1002 | 20 |
| 2 | 2A | 1 | G | 1 | H023 | kom | 1 | 55 | 20 |
| 2 | 2A | 1 | G | 2 | H045 | kom | 2 | 332 | 20 |
| 2 | 2A | 1 | G | 3 | P002 | l | 3 | 80 | 8,5 |
| 2 | 2A | 1 | G | 4 | S346 | kom | 1 | 458 | 8,5 |
| 3 | 1B | 2 | G | 1 | L037 | m | 3,2 | 552 | 20 |
| 4 | 1A | 1 | K | 1 | P002 | l | 1 | 80 | 8,5 |
| 4 | 1A | 1 | K | 2 | D038 | m2 | 1,2 | 567 | 20 |
3 NF - treća normalna forma
Sad će se normalni ljudi pitati, i šta bi ti "programeri" još htjeli, kad nam/vam već sada podaci izgledaju nerazumljivi. Ne čini li se da imamo još uvijek nepotrebnog ponavljanja podataka. Sada nam se podaci Šif.Rač, Šif.Org.Jed, Šif.Prod, Šif.NP ponavljaju.
Šta bi bilo ako bi Prodava za svaki račun napisao malo drugačije šifre (npr: za račun br. 1 podaci o načinu plaćanja se mogu unijeti i tako: 1-K, 2-G,3-K) . Ne bi znali da li je račun plaćen kešom ili karticom.
Žašto ne bi i njih izdvojili u posebnu tabelu. I eto nama tabela skoro bez nepotrebno ponavljajućih podataka:
Račun: Šif.Rač, Šif.Org.Jed, Šif.Prod, Šif.NP
Element računa: Šif.Rač., RB, Šif.art/usl, JM, Kol, OS.Cjena, Proc.Poreza
Tako smo dobili naše tabele relacijsko povezane preko svojih Primarnih ključeva i Podključeva.

Cilj 3NF je da izdvoji kolone koje ne zavise u potpunosti od primernog ključa u drugu tabelu. S tim dobijamo tabele u kojima se podaci skoro ne ponavljaju.
NAPOMENA
Iz gornjih redova ćete zaključiti da nismo skroz do kraja eliminisali ponavljanje podataka (ali skoro da jesmo). Dalja eliminacija bi se mogla uraditi u dijelu koji se odnosi na artikle/usluge u elementu računa. Naime, mogli bi još eliminisati kolone JM i Os.Cijena. Ta vrsta liminacije bi se mogla odraditi pomoću viših nivoa normalizacije tabela, mada se u praksi rijetko srećemo.
| « | Februar 2012 | » | ||||
|---|---|---|---|---|---|---|
| Po | Ut | Sr | Če | Pe | Su | Ne |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | ||||