Neprijetno mi je ali moram da se umesam. Relacija nije tabela niti je tabela relacija. To sto se relacije mogu vizuelno predstaviti kao tabele, ne znaci da su relacije tabele. A pogotovo en znaci daje tabela relacija. Zbunjujuce? Nije, ako ramisljamo matematicki. Ako na zidu vidimo sliku i na slici lula za duvan, da li mi u stvari vidimo lulu? U stvari ne, mi vidimo
sliku lule. Nije jasno jos uvek? Pravu lulu mozes da uzmes, napunis duvanom i uzivas. Onu na slici ne mozes. To ti je nepreciznost normalnog ljudskog govora. Kao kad u geometriji nacrtas duz i tacku. Niti je duz duz, niti je tacka tacka. Matematicki, tacka nema dimenzije, nema duzinu, sirinu, visinu, prema tome ne moze se nacrtati. Mi samo zamisljamo da je nacrtana tacka, tako sto koristio neki simbol - ubod olovke ili mali kruzic (seti se nacrtne geometrije). Duz je skup beskonacno mnogo tacaka, koje nemaju dimeziju, a ipak govorimo o duzini duzi. Kako zbir od beskonacno komada necega sto nem dimenziju moze dati duzinu (nesto sto se moze videti i cak izmeriti)? To se zove abstrakcija. U tom smislu, tabela moze biti slika relacije, ali ne svaka tabela. Jos jedan primer za abstrakciju i nepreciznost ljudskog govora: imas sliku od Katty Perry. Izgleda isto kao i ziva Katty perry (evo ti jedna ovde
http://www.speakerscorner.me/k...hot-pics-and-biography/katy35/), ali to nije Katty Perry. Zasto? Pa sa slikon ne mozes da radis iste stvari koje mozes da radis sa zivom Katty Perry, zar ne?
Relacoja je matematicki pojam i definise se otprilike ovako:
Relacija je skup n-torki koje predstavljau instance datog logickog predikata.
Jasno? Naravno da nije dok se ne objasne pojmovi koje definisija pominje. U matematici sve mora da se definise i ond se drugi pijmovi definisu na osnovu onih ranije definisanih, i tako dalje, dok se ne naidje na kontradikicju. Da krenemo:
1) Logicki Predikat = Matematicka funkcija sa parametrima, koja daje konkretan iskaz. Iskaz (propozicija) je izjavna recenica, koja moze biti tacna ili netacna (TRUE,FALSE).
Na primer P = "Ucenik [X] ide u skolu [Y] u razred Z". Ovo se matematicki moze napisati kao P = f(X,Y,Z). AKo zamneimo X,Y,Z nekim vrednostima, dobicemo konkretnu recenicu. U nasem primeru, funkcija ima 3 parametra, X,Y,Z. Ako umesto X,Y,Z uvedemo neke vrednosti, na primer X = 'Marko', Y = 'Sveti Sava', Z = 'treci', nasa funkcija f(X,Y,Z) postaje: P(x,y,z) = "Ucenik [Marko] ide u skolu [Sveti Sava] u razred [treci]". Ovo je vec konkretna recenica, koja moze biti tacna ili netacna, sto je za logiku vazno, da li je nesto tacno ili netacno (TRUE, FALSE). Mozemo da napisemo mnogo takvih recenica, za mnogo trojki (X,Y,Z), i njih zovemo instance predikata P. Na primer, evo nekoloko instanci datog predikata P(X,Y,Z):
P1 = "Ucenik [Marko] ide u skolu [Sveti Sava] u razred [reci]", P2 = ""Ucenik [Milica] ide u skolu [Beogradski Bataljon] u razred [drugi]", P3="Ucenik [Zoran] ide u skolu [Centar] u razred [treci]". To smo naravnomogli da predstaviomo i ovako:
"Ucenik [Marko] ide u skolu [Sveti Sava] u razred [treci]"
"Ucenik [Milica] ide u skolu [Beogradski Bataljon] u razred [drugi]"
"Ucenik [Zoran] ide u skolu [Centar] u razred [treci]
Ovo vec lici na nekakav tabelarni prikaz, a licice jos vise na tabelu ako sve organizujemo i predstavimo ovako:
Code:
P = "Ucenik [X] ide u skolu [Y] u razred [Z]"
[X] [Y] [Z]
--------------------------------------------
'Marko', 'Sveti Sava', 'treci'
'Milica', 'Beogradski BAtaljon', 'drugi'
'Zoran', 'Centar', 'treci'
Ovo izgleda kao bilo koja matematicka funkcija prikazana tabelarno. Sa jednom razlikom. Rezultat predikata nije skup {X,Y,Z} nego TRUE ili FALSE, pa bi trebalo da pise ovako:
Code:
P = "Ucenik [X] ide u skolu [Y] u razred [Z]"
[X] [Y] [Z] P(X,Y,Z)
--------------------------------------------------------
'Marko', 'Sveti Sava', 'treci', TRUE
'Milica', 'Beogradski BAtaljon', 'drugi', FALSE
'Zoran', 'Centar', 'prvi', TRUE
Sve smo blizi tabelarnom prikazu, iako sam na pocetku izricito reka "Relacija nije tabela niti je tabela relacija". Usput, ni jedna od prikazanih tabela ne moze predstavlja relaciju. Nije kriva tabela, vec nastavak definicije relacije. Instance predikata koje dobijemo tako sto parameter X,Y,Z zamenimo nekim vrednostima (konstantama) zovu se u matematickoj logici
propozicije ili po naski,
iskazi. Po definiciji, iskazi su izjavne recenice koje mogu biti ili tacne ili netacne. Iskazi (propozicije) nemaju parametre, one su - recenice. Predikat je generalizovana forma nekakve recenice, koja nesto izjavljuje ili opisuje. Relacija (R) je skup TRUE propozicija koje su izvedene iz datog predikata. Relacija je dakle posledica predikata, pa bi imalo smisla pisati R (P) = (ovde nekako predstavimo relaciju). Slika relacije je jasnija ako umesto X,Y,Z upotrebimo imenovane parametre, na primer [Ime],[Skola],[Razred]. Relaciju R(P([Ime],[Skola],[Razred]) ) mozemo da predstavimo ovako:
Code:
P = "Ucenik [Ime] ide u skolu [Skola] u razred [Razred]"
[Ime] [Skola] [Razred]
------------------------------------------------
'Marko', 'Sveti Sava', 'treci',
'Zoran', 'Centar', 'prvi',
U odnosu na prethodnu sliku, razlike su:
1. parametri imaju nazive bliske ljudskom govor
2. izbacili smo propoziciju koja je FALSE, zadrzali smo dve koje su TRUE
3. izbacili smo kolonu sa TRUE/FALSe, jer se podrazumeva da su sve prikazane propozicije TRUE
Poslednja tabela u stvari predstavlja relaciju R ( P([Ime],[Skola],[Razred]) ). Ono sto lici na redove u tabeli, zove se n-torka (tuple u originalu, izgovara se tapl, kao couple - kapl). Zaglavje tabeele, skup { [Ime], [Skola],[Razred]} , naziva se zaglavlje relacije (relation heading), idefinise se kao skup atributa(parametara) datog preikata.. Crta ispod zaglavja ne predstavlja nist, ona samo odvaja vizualno zaglavle of tela relacije (relation body). Telo relacije cini skup n-torki (set of tuples), gde konstante koje cine n-torku odgovaraju po smislu njihovom attributu u zaglavlju.
Znaci, relacija R(P)) je matematicka struktura koja se opisuje ovako: skup n-torki koje su TRUE za dat predikat P, a vrednosti u n-torkama odgovaraju atributima u zaglavlju relacije. U praksi, zgodno je da se n-torke predstave u tabelarnoj ili matricnoj formi. Otuda zabluda da su tabele isto sto i relacije. sledeca slika NE predstavlja relaciju:
Code:
[Ime] [Skola] [Razred]
------------------------------------------------
'Marko', 'Sveti Sava', 'treci',
'Zoran', 'Centar', 'prvi',
Zasto ovo ne predstavlja relaciju? Zato sto ne vidimo kako glasi predikat. Za ovu fizicku tabelu, predikat bi mogao da glasi
P = "Na olimpijadi u Moskvi, ucenik [Ime], koji je iz skole [Skola], rangiran je kao [Razred] u svojoj kategoriji."
Relacija R(P) bi bila prikazana ovako:
Code:
P2 = "Na olimpijadi u Moskvi, ucenik [Ime], koji je iz skole [Skola], rangiran je kao [Razred] u svojoj kategoriji."
R2(P2) :
[Ime] [Skola] [Razred]
------------------------------------------------
'Marko', 'Sveti Sava', 'treci',
'Zoran', 'Centar', 'prvi',
Tabelarni deo je manje vise svuda isti, zaglavlje tabelarnog dela je isto, ali relacije nisu iste niti predstavljau isti predikat. Nazalost, ni jedan od popularnih "SQL" baza ne trazi da se definise predikat, pa ljudi previdjaju vazan deo price. Uocite takodje 4 reda koji cine definiciju, tabelarni deo je samo jedan od njih.
Da li je neophodno da se relacije prikazuju tabelarno? Absolutno nije. Poslednja relacija se moze prikazati i ovako :
Relacija R2A:
P2 = "Na olimpijadi u Moskvi, ucenik [Ime], koji je iz skole [Skola], rangiran je kao [Razred] u svojoj kategoriji."
R2(P2) :
R2.Heading = { [Ime] , [Skola], [Razred] }
R2.Body = { {'Marko', 'Sveti Sava', 'treci'}, {'Zoran', 'Centar','prvi'} }
Posto su u pitanju skupovi, redosled elemenata u heading i Body nije bitan, tako da se ista relacija moze predstaviti kao:
Relacija R2B:
P2 = "Na olimpijadi u Moskvi, ucenik [Ime], koji je iz skole [Skola], rangiran je kao [Razred] u svojoj kategoriji."
R2(P2) :
R2.Heading = { [Razred], [Ime] , [Skola] }
R2.Body = { { 'treci', 'Marko', 'Sveti Sava'}, {'prvi', 'Zoran', 'Centar'} }
Relacije R2A i R2B su identicne, iste jednake, i ni jedna nije prikazana tabelarno. Amogle su biti prikazane tabelarno:
Code:
P2 = "Na olimpijadi u Moskvi, ucenik [Ime], koji je iz skole [Skola], rangiran je kao [Razred] u svojoj kategoriji."
R2(P2) :
[Ime] [Razred] [Skola]
-----------------------------------------------
'Zoran', 'prvi', 'Centar'
'Marko', 'treci', 'Sveti Sava'
(Redosled atributa niti n-torki, razlicit je od bilo kog prikaza iste relacije u ranijem tekstu(
Jos dve napomene:
1. posto su i zaglavlje i telo skupovi, oni su jedinstveni. ne mogu biti dva ista atributa u zaglavlju relacije, niti mogu biti dva ista tuple-a. Iz ovoga je zvedena ideja jedinstvenog kljuca, kojih moze biti vise. Ako ima vise kljuceva, moze se za jedan od njih kazati da je Primarni. Osim po imenu, PK se ni u cemu ne razlikuje od ostalih jedinstvenih kljuceva.
2. Ne dozvoljava se da vrednost u nekoj n-torci za neki atribut nedostaje. Zasto? Zato sto onda izvedeni iskaz neme smisla. Zamislite ovu situaciju:
Code:
P2 = "Na olimpijadi u Moskvi, ucenik [Ime], koji je iz skole [Skola], rangiran je kao [Razred] u svojoj kategoriji."
R2(P2) :
[Ime] [Razred] [Skola]
-----------------------------------------------
'Zoran', 'prvi', 'Centar'
'Marko', 'treci',
Pokazana "relacija" cuva dva iskaza:
"Na olimpijadi u Moskvi, ucenik [Zoran], koji je iz skole [Centar], rangiran je kao [prvi] u svojoj kategoriji."
"Na olimpijadi u Moskvi, ucenik [Marko], koji je iz skole [ ], rangiran je kao [treci] u svojoj kategoriji."
Izgovorite poslednju recenicu i recite ima li smisla? Mozda i ima, ako kazemo:
"Na olimpijadi u Moskvi, ucenik [Marko], koji je iz skole [NULL], rangiran je kao [treci] u svojoj kategoriji." ili
"Na olimpijadi u Moskvi, ucenik [Marko], koji je iz skole [nepoznato], rangiran je kao [treci] u svojoj kategoriji."
Sve i da zvuci razumno, ne mozemo utvrditi da li je iskaz tacan, jer je jedan od parametara nepoznt, nedostaje. Posto relacija podrazumeva samo tacne iskaze, ne moze se prihvatiti iskaz koji ima vrednost 'Nepoznato','Null','Prazno' i slicno. To sto danasnji sistemi dozvoljavaju NULL vrednosti samo znaci da nisu relacioni - ne postuje se relaciona teorija. Ako se ne postuje matematicka teorija u programiranju, moze doci do absurdnih rezultata, sto se u praksi cesto desava. Pogledajmo primer iz algebre:
Ocigledno vazi za svako X:
X
2-X
2 = X
2-X
2
primenimo pravila za faktorizaciju razlike kvadrata i mozemo pisati ovako, absolutno tacno:
X(X-X) = (X+X)(X-X)
Sad rdukujemo obe strane (skratimo) za zajednicki faktor i dobijemo:
X = 2X odakle sledi da je 1=2
Zamislite da su kalkulatori i kompjuteri napravljeni tako da dozvoljavaju deljenje sa nulom (prekrseno pravilo algebre). Mogli bismo da krenemo od 1=2 i odatle dokazemo da je X=Y za bilo koje vrednosti X i Y, na primer 17 = 256.
Isto vam je sa nepostovanjem pravila relacione algebre, samo se ne vidi odmah i direktno. Medjutim, kveriji pocinju da vracaju 0 redova, a znamo da zasigurno "rekrdi" postoje, ili se zbirovi ne slazu iako su kveriji ekvivalentni, i slicno.
Na kraju, kao i u geometriji, ne mozemo nacrtati tacku niti liniju, ali mozemo uz pomoc slika rezonovati geomatrijski, tako i sa relacijama. Sama tabela predstavlja relaciju ako i samo ako: znate predikat koji tabela-relacija predstavlja, svi su redovi razliciti medjusobno, nema dupliranih atributa u zaglavlju, redosled nije bitan i vrednosti u n-torkama odgovaraju logicki atributima. I sve n-torke predstvljau tacne iskaze. Ovo je nemoguce postici tehnicki, ali mozemo prici dovoljno blizu, toliko blizu da je nasa baza podataka (skup relacija) dovoljno bliska stvarnosti da moze da podrzi datu situaciju u realnom zivotu. To postizemo tako sto paljivo izbegavamo zamke koje nam SQL sistemi postavljaju, i dodajem ogranicenja (CONSTRAINTS), sto vise to bolje.
Crtanje E-R dijagrama, 1:vise, vise:vise, to je samo jedan nacin da se obezbeda ogranicenja tipa "vrednost atributa X ne moze protijati u relaciji R1 ako vec ne postoji u relaciji R2" To vam je kao crtanje paralelnih lpravih linija klizanjem trouglova. Geometrija poznaje samo komad konopca (kad se zategne predstavlja pravu liniju) i sestar. Po geometriji se paralelna linija kroz datu tacku povlaci tako sto se pomocu sestara crtaju pravi ugloviu stvari. Ipak, svi koristimo (koristili smo, danas su to ACAD komande) klizanje trouglova da crtamo paralelne linije. kad sam ja ucio Auto CAD davne 1990 godine, ucitelj nas je ubedjivao, i bio je u pravu, da za crtanje u ACAD nije potreban monitor uopste, ceo crtez mozete napraviti iz komandne linije.....