Malo je kasno, ali je tema interesantna, svodi se na to kako proceniti koja od ponudjenih opcija je bolja.
Na prvi pogled, cini se da je zzz030 potpuno u pravu. Atribut SpisakPutnikaID nema nikakvog smisla, jer ne predstavlja nikakv podatak. Jedinstvena kombinacija atributa (AranzmanID, KlijentID) je potrebna i dovoljna da nam kaze koji klijent putuje u kom aranzmanu. Ali, muguce je i da asistent bude u pravu, ali samo delimicno, to jest nekompletno. To zavisi od toga sta predstavlja posmatrani entitet. Znamo da se iz entiteta na ER dijagramu grade tabele, iz ER dijagrama slede tabele, i to je OK. A iz cega sledi ER dijagram?
Podsetimo se da ER dijagrami nemaju nikakve veze sa relacionom teorijom, samo su jako zgodni da se prikazu neka ogranicenja i interakcije medju tabeleama. A tabele predstavljaju relacije. Ispada da kad hocemo da od relacije dobijemo tabelu, sluzimo se ER dijagramom, gde relaciju predstavljaju entiteti, a onda entitete prevodimo u tabele. Za praksu, nije lose. Problem je sto na osnovu kazanog, dizajn baze je trostepeni proces:
relacija => entitet => tabela (slika 1)
U praksi se najcesce radi samo entitet => tabela. To je pogresno i stetno. Ako prvo razmotrimo relacije, na abstraktnom nivou, mnogo ce lakse biti crtanje ER dijagrama i konstruisanje tabela.
Relacije, po relacionoj teoriji, predstavljaju skup tacnih iskaza koji su svi izvedeni iz nekog logickog predikata. Ove gruba definicija sdrzi pojmove 'skup' i 'logicki predikat'. Setite se price na pocetku svake knjige o bazma: "Relaciona teorije zasniva se na teoriji skupova i predikatskoj logici prvog reda." Onda se kaze da je to sve smislio E. Codd i tu se prica zavrsava. Onda sledi kvazi definicija normalnih formi, da bi se kazalo da je ipak ER modeliranje najbrzi put da se dodje do 'sheme' baze podataka. Tacnija verzija procesa dizajna baze je ova:
logicki predikat => relacija => tabela,
ili ako vam je lakse, onda ovako
logicki predikat => ER dijagram => fizicka tabela
U oba slucaja se pocijne od logickog predikata. Na nasem primeru, pogledajmo kako to izgleda.
Za nas slucaj, za entitet "Spisak Putnika" imamo dve opcije, sa dva ili tri atributa. Koja je bolja opcija? Da bismo odgovorili, probacemo da nadjemo logicki predikat za oba slucaja. Logicki predikat je neka vrsta funkcije, logicke funkcije, koja ima parametre i zamenom parametara dobije se konkretan logicki izkaz (propozicija).
U prvoj opciji, koju zastupa zzz030
logicki predikat glasi:
P1:
"Osoba [KlijentID] koristi aranzman [AranzmanID]". ( zzz030 resenje)
Ovo je logicka funkcija, sa dva parametra, [KlijentID] i [AranzmanID] koja kao rezultat daje
logicku propoziciju (logicki iskaz) koji je po definiciji TRUE ili FLASE. Ako kazem da "Osoba KlijentID = KL1 koristi aranzmann AranzmanID = A2", i ososba KL1 zaista postoji, i zaista koristi aranzman A2, onda tje to tacna (TRUE) prpopzicija i kao takva, moze da bude deo skupa tacnih propozicija koje predstavljamo relacijom Spisak Putnika. Relacija sdrzi skup tacnih propozicija, i to se moze predstaviti u tabelarnom obliku, ako se odbace reci iz predikata i ostanu samo vrednosti atributa.
Slika 1:
Table: SpisakPutnika:
AranzmanID KlijentID
------------------------
A1 K1
A2 K2
A1 K3
A1 K4
A2 K1
.......
Uocite da sam naziv tabele ne znaci ama bas nista, kao ni sam izgled tabele. Slika 1 moze da predstavlja razne spiskove, spisak putnika koji su rezervisali aranzman, ili spisak onih koji su platili, ili spisak onih koji su otkazali, zalili se, nisu platili. Svaki razliciti spisak moze da predstavlja razliciti logicki predikat, a da tabela izgleda potpuno isto. Nazalost, ni jedan RDBMS nam ne daje opciju da cuvamo logicki. Ima i drasticnijih primera. Sat predstavlaj ova tabela:
Slika 2:
Table: Tezine
ID Tezina
----------------
A-001 120
A-002 35
B-001 101
C-003 62
Tezina rezervnih delova? tezna djaka iz neke skole? tezina zadataka na ispitu? U kojim jedinicama se izrazava tezina?
Znaci, da bi razumeli sta radimo, neophodno je definisati logicke predikate za relacije koje definisemo. Tako cemo da pokusamo da razresimo dilemu - koji je model bolji, zzz030 ili asistentov.
Slucaj 1, resenje po zzz030, logicki predikat P1:
Klijent [KlijentID] koristi aranzman [AranzmanID]. Dva atributa su ocigledno dovoljna da pokazu ko je uplatio koji aranzman.
Asistent trazi da dodamo jos jedan atribut, SpisakID. Dodavanjem novog atributa [SpisakPutnikaID] mi menjamo logicki predikat, koji bi sad izgledao ovako:
P2:
"Osoba [KlijentID] koristi aranzman [AranzmanID], i to je zavedeno pod brojem [SpisakPutnikaID] u knjizi putnika".
Ako vec volimo da zavodimo stvari pod brojem, onda bi zbog kompletnosti trebalo zavseti i ko je i kada to uradio, pa nam trebaju jos neki atributi:
P3:
"Osoba [KlijentID] koristi aranzman [AranzmanID], i to je zavedeno pod brojem [SpisakPutnikaID] u knjizi putnika, i to je zaveo [SluzbenikID] na dan [DatumSklapanjaAranzmana] ".
Poslednji predikat P3, predstavlja slozenu recenicu. Prvi deo kazuje koji klijent koristi koji aranzman, a drugi deo kazuje kada se desila transakcija bukiranja aranzmana, ko je to uradio i pod kojim brojem je zavedeno. Predikate P1 i P3 mogu se predstaviti odgovarajucim relacijama. P2 je nekompletna verzija od P3 pa bih ga odbacio.
Pitaje je samo sta zelite da modelujete - koji predikat. Ako vas zanima samo ko je u kom aranzmanu, P1 je sasvim OK. . P3 je isto tako dobar kao i P2, ukoliko zelimo da zabelezimo i detalje transakcije rezervacije.
Znaci, zavisno od predikata za koji gradimo relaciju, P1 ili P3 ce biti dobri. P2 nije dobar jer uvodjenje novog atributa ne kazuje nam nista vise o tome ko je rezervisao koji aranzman. Mozemo da dodamo deset takvih atributa - oni svejedno ne znace nista. Medjutim, ako zelimo da pratimo kompletnu transakciju, onda je P3 bolji od P1.
Znaci, da bi presudili ko je u pravu, moramo da znamo predikat za entitet SpisakPutnika. resenje po zzz030 je dobro, ukoliko imamo jednostavan predikat. Drugo resenje je nekompletno, pa verujemo da je asistent mislio na resenje P3, sa kompletnim opisom transakcije, sto je isto tako dobro.
Po zvanicnoj relacionoj teoriji (C.J. Date, 2012, database Design and Relational Theory, Normal Forms & All That Jazz", analiza pocinje postavljanjem korektnih logickih predikata koji opisuju ucesnike, objekte i transakcije procesa koji modeliramo. ER dijagrami dolaze tek posle, a nisu ni neophodni, u stvari nisu deo relacione teorije uopste. Entitet iz ER dijagrama predstavlja relaciju, koja je skup tacnih iskaza izvedenih iz nekog logickog predikata. Na nesrecu, ER (MOV) dijagrami se cesto koriste kao jedini element logickog dizajna baze podataka, a to dovodi do propustanja mnogih vaznih stvari, sto daje sakate modele.
Model na slici "Evo njihovog skolskog MOV-a sto se tice istog zadatka." izgleda da je radjen bez postavljanja predikata i njihove analize. Iako globalno nije los dijagram, ipak je nekompletan, ili bar ostavlja nedoumice i dozvoljava svakojaka tumacenja. Da izlistamo predikate, da vidimo da li imamo sve ili nesto nedostaje. Koristicu za nijansu izmenjene nazive atributa, zbog jasnoce:
1: [Lice] ima [adresu] i moze biti tipa [TipLica], pri cemu je TipLica iz skupa ('pravno',fizicko').
2. Ako je lice 'pravno, cuvamo [Naziv] i [PIB]
3. Ako je lice 'fizicko', cuvamo [Ime], [Prezime] i [Broj LK].
4. Vodic je iskljucivo fizicko lice, i ima struku [struka] i licencu [Broj Licence]
5. [Aranzman] ima [Naziv] i datum dogadjanja [Datum], i u sebi sadrzi i druge aranzmane, a vodi nas u [Grad].
6. [Lice] koristi [aranzman]
7. [Ekskurzija] je deo [aranzmana] i prijavilo se [broj ljudi] (ili maximalan broj ljudi je [Broj Ljudi]) i vodi je [Vodic]
8. [Smestaj] zavisi od [aranzmana], i prati se [kategorija], [Opis],[Cena] smestaja u datom aranzmanu i [provizija] (Ko ubira proviziju, vlasnik smestaja ili agencija?)
9. Uz [smestaj] nudi se/ukljucena (?) je i [usluga], ne koju se daje/moze dati [Popust]
10. [Prevoznik] je pravno lice, i ima [Naziv] i naplacuje [Cena po km]
11. [Prevoznik] obezbedjuje [prevoz] za [aranzman] i cuvamo [vrstu prevoza] i [tip prevoza] (sta je sta?)
12. Na putu do ciljnog [grada] [aranzmana] pravice se [pauza] u nekom [gradu] kroz koji prolazimo. (ovo je naopako modelirano na slici. Entitet treba da bude 'Pauza', u mestu 'Grad' u voznji koja odgovara [aranzmanu] dana [dan pauze] u sati [vreme pauze] u trajanju od [trajanje pauze] minuta.
Nisam naveo predikate za entitetet kategorija smastahja i usluga, da skratimo pricu.
Iz liste se vidi da nigde ne belezimo kada je korisnik ugovorio aranzman, ko je potpisoa ugovor u ime agancije, nista o placanju, niti da li se korisnik pojavio na dan polaska, ili mozda otkazao put iz nekih razloga. A mozda je i ceo aranzman otkazan iz nekih razloga, i ljudima treba vratiti novac, ili platiti neko obestecenje.
Hocu da kazem da se izlistavanjem logickih predikata pre ER dijagrama dobije mnogo bolja slika o sistemu, nego samo crtanjem djagrama. Sam naziv entiteta ne znaci mnogo i moze nas navesti na pogresan zakljucak. Na primer, iz dijagrama izgleda da [Prevoznik] nudi [prevoz] za odredjeni [aranzman]. To nije isto sto i [prevoznik] se obavezao da ce obezbediti [Prevoz] za [Aranzman]. U oba slucaja i dijagram i tabela bi izgledali isto, iako su to dve veoma razlicite stvari. Recenice "Korisnik je rezervisao aranzman" i "Korisnik je koristio aranzman" i "Korisnik je otkazao aranzman" sve imaju iste atribute, iako im je znacenje potpuno razlicito.
