evo iskopao sam neki svoj stari text na ovu temu ..
Modeliranje baze podataka - Normalizacija
Normalizacija modela baze podataka je proces definisanja strukture baze podataka (entiteti, atributi i relacije) u optimalni format. Standardne normalne forme su aditivne, dakle ako je neki model sveden na trecu normalnu formu, automatski je u drugoj i prvoj normalnoj formi. Osnovne forme DB modela su:
1NF: Prva normalna forma
2NF: Druga normalna forma
3NF: Treca normalna forma
BCNF: Boyce/Codd normalna forma
4NF: Cetvrta normalna forma (aka izolacija nezavisnih relacija)
5NF: Peta normalna forma (aka izolacija semanticki povezanih relacija)
DKNF: Domen/Kljuc normalna forma (aka savrsen model)
Svodjenje modela na prvu normalnu formu
Krenucemo od jednostavne strukture, imamo spisak clanova foruma koji imaju nekakvo znanje o raznim materijama. Neki clanovi znaju o muzici, neki o hardware-u dok se neki bolje snalaze sa linux-om; naravno, postoje i oni koji vrlo dobro poznaju i hardware i muziku etc. Primer jednostavne tabele bi izgledao ovako:
Code:
ID: 1
KORISNIK: pera peric
ZIVI: Srbija
ZNANJE: Audio
ID: 2
KORISNIK: mika mikic
ZIVI: Srbija
ZNANJE: Video
ID: 3
KORISNIK: zikica zikic
ZIVI: Srbija
ZNANJE: Audio, Video, Hardware, Windows
ID: 4
KORISNIK: mali perica
ZIVI: Srbija
ZNANJE: Audio, Video, Baze, Hardware, Windows, Linux, Programiranje
ID: 5
KORISNIK: mali zikica
ZIVI: BIH
ZNANJE: Programiranje, Hardware
Ako zelimo da saznamo koji korisnik zna "video" moramo proci kroz sve korisnike, proveriti sadrzaj polja "znanje" i pregledati prilicno nepregledno polje "znanje" te otkriti da li doticni korisnik zna "video" ili ne ... Mane ovakve organizacije su ocigledne (brzina, preglednost...) te je ovo vrlo nepraktican nacin za cuvanje informacija.
Klasificiranje podataka u zasebne tabele ce "prisrediti" podatke i omoguciti laksu pretragu. Razdvajanje repetitivnih podataka u zasebne tabele nasu strukturu dovodi u
prvu normalnu formu.
Iz naseg primera (gde je sve bilo nagurano u istu tabelu), dobijamo 2 odvojene tabele:
TABELA: KORISNIK
Code:
KORISNIK_ID: 1
KORISNIK_IME: pera peric
KORISNIK_ZIVI: Srbija
KORISNIK_ID: 2
KORISNIK_IME: mika mikic
KORISNIK_ZIVI: Srbija
KORISNIK_ID: 3
KORISNIK_IME: zikica zikic
KORISNIK_ZIVI: Srbija
KORISNIK_ID: 4
KORISNIK_IME: mali perica
KORISNIK_ZIVI: Srbija
KORISNIK_ID: 5
KORISNIK_IME: mali zikica
KORISNIK_ZIVI: BIH
TABELA: ZNANJE
Code:
ZNANJE_ID: 1
KORISNIK_ID: 1
ZNANJE_IME: Audio
ZNANJE_ID: 2
KORISNIK_ID: 2
ZNANJE_IME: VIDEO
ZNANJE_ID: 3
KORISNIK_ID: 3
ZNANJE_IME: Audio
ZNANJE_ID: 4
KORISNIK_ID: 3
ZNANJE_IME: Video
ZNANJE_ID: 5
KORISNIK_ID: 3
ZNANJE_IME: Hardware
ZNANJE_ID: 6
KORISNIK_ID: 3
ZNANJE_IME: Windows
ZNANJE_ID: 7
KORISNIK_ID: 4
ZNANJE_IME: Audio
ZNANJE_ID: 8
KORISNIK_ID: 4
ZNANJE_IME: Video
ZNANJE_ID: 9
KORISNIK_ID: 4
ZNANJE_IME: Baze
ZNANJE_ID: 10
KORISNIK_ID: 4
ZNANJE_IME: Hardware
ZNANJE_ID: 11
KORISNIK_ID: 4
ZNANJE_IME: Windows
ZNANJE_ID: 12
KORISNIK_ID: 4
ZNANJE_IME: Linux
ZNANJE_ID: 13
KORISNIK_ID: 4
ZNANJE_IME: Programiranje
ZNANJE_ID: 14
KORISNIK_ID: 5
ZNANJE_IME: Hardware
ZNANJE_ID: 15
KORISNIK_ID: 5
ZNANJE_IME: Programiranje
Sada je pitanje "koji korisnik zna video?" mnogo lakse odgovoriti.