BP VEST Skripta

79
SADRŽAJ PREDGOVOR......................................................................................................................... 1 1. ARHITEKTURA SUSTAVA ZA UPRAVLJANJE BAZAMA PODATAKA..................... 2 2. OSNOVE BAZE PODATAKA – ENTITETI......................................................................... 4 3. RELACIJE............................................................................................................................... 8 4. RELACIJSKI MODEL PODATAKA.................................................................................... 12 5. INTEGRITET PODATAKA................................................................................................... 17 6. RELACIJSKA ALGEBRA..................................................................................................... 19 7. INDEKSIRANJE BAZE PODATAKA.................................................................................. 27 8. NORMALIZACIJA BAZE PODATAKA.............................................................................. 31 9. SQL – JEZIK BAZA PODATAKA........................................................................................ 37 9.1. TIPOVI PODATAKA................................................................................................ 38 9.2. FORMIRANJE TABLICE......................................................................................... 40 9.3. PROMJENE STRUKTURE TABLICE..................................................................... 42 9.4. INDEKSI.................................................................................................................... 45 9.5. UNOS PODATAKA.................................................................................................. 46 9.6. SELEKCIJA PODATAKA........................................................................................ 47 9.6.1 . UVJETNI IZRAZI......................................................................................... 48 9.6.2 . OBLIKOVANJE IZLAZNIH REZULTATA............................................... 50 9.6.3 . SORTIRANJE IZLAZNIH REZULTATA................................................... 52 9.6.4 . OGRANIČAVANJE ISPISA REZULTATA................................................ 53 9.7. SELECT INTO (Make table upiti) ............................................................................ 53 9.8. APPEND UPITI......................................................................................................... 54 9.9. AŽURIRANJE PODATAKA U TABLICI................................................................ 54 9.10 BRISANJE PODATAKA IZ TABLICE.................................................................... 54 9.11 ALIASI....................................................................................................................... 56 9.12 AGREGATNE FUNKCIJE........................................................................................ 56 9.13 GRUPNI UPITI.......................................................................................................... 57 9.14 UGNJEŽðENI UPITI – PODUPITI.......................................................................... 60 9.15 UNIJA......................................................................................................................... 62 9.16 POGLEDI................................................................................................................... 63 9.17 OSNOVE VIŠEKORISNIČKOG RADA.................................................................. 65 9.18 OBRADA SQL UPITA.............................................................................................. 67 9.19 METODE POVEZIVANJA TABLICA..................................................................... 69 10. TRANSAKCIJE...................................................................................................................... 71 11. HIJERARHIJSKI MODEL PODATAKA.............................................................................. 75

Transcript of BP VEST Skripta

Page 1: BP VEST Skripta

SADRŽAJ PREDGOVOR......................................................................................................................... 1

1. ARHITEKTURA SUSTAVA ZA UPRAVLJANJE BAZAMA PODATAKA..................... 2

2. OSNOVE BAZE PODATAKA – ENTITETI......................................................................... 4

3. RELACIJE............................................................................................................................... 8

4. RELACIJSKI MODEL PODATAKA.................................................................................... 12

5. INTEGRITET PODATAKA................................................................................................... 17

6. RELACIJSKA ALGEBRA..................................................................................................... 19

7. INDEKSIRANJE BAZE PODATAKA.................................................................................. 27

8. NORMALIZACIJA BAZE PODATAKA.............................................................................. 31

9. SQL – JEZIK BAZA PODATAKA........................................................................................ 37

9.1. TIPOVI PODATAKA................................................................................................ 38

9.2. FORMIRANJE TABLICE......................................................................................... 40

9.3. PROMJENE STRUKTURE TABLICE..................................................................... 42

9.4. INDEKSI.................................................................................................................... 45

9.5. UNOS PODATAKA.................................................................................................. 46

9.6. SELEKCIJA PODATAKA........................................................................................ 47

9.6.1.

UVJETNI IZRAZI......................................................................................... 48

9.6.2.

OBLIKOVANJE IZLAZNIH REZULTATA............................................... 50

9.6.3.

SORTIRANJE IZLAZNIH REZULTATA................................................... 52

9.6.4.

OGRANIČAVANJE ISPISA REZULTATA................................................ 53

9.7. SELECT INTO (Make table upiti) ............................................................................ 53

9.8. APPEND UPITI......................................................................................................... 54

9.9. AŽURIRANJE PODATAKA U TABLICI................................................................ 54

9.10 BRISANJE PODATAKA IZ TABLICE.................................................................... 54

9.11 ALIASI....................................................................................................................... 56

9.12 AGREGATNE FUNKCIJE........................................................................................ 56

9.13 GRUPNI UPITI.......................................................................................................... 57

9.14 UGNJEŽðENI UPITI – PODUPITI.......................................................................... 60

9.15 UNIJA......................................................................................................................... 62

9.16 POGLEDI................................................................................................................... 63

9.17 OSNOVE VIŠEKORISNIČKOG RADA.................................................................. 65

9.18 OBRADA SQL UPITA.............................................................................................. 67

9.19 METODE POVEZIVANJA TABLICA..................................................................... 69

10. TRANSAKCIJE...................................................................................................................... 71

11. HIJERARHIJSKI MODEL PODATAKA.............................................................................. 75

Page 2: BP VEST Skripta

1

PREDGOVOR

Od samog početka razvoja računala i informatike, obrada podataka bila je jedan od

najzanimljivijih i najznačajnijih segmenata tog razvoja. Potrebe za što sveobuhvatnijom obradom podataka, jednostavnom manipulacijom, te što bržim i sigurnijim pristupom podacima, dovele su do razvoja nekoliko modela podataka i čitavog niza programskih paketa za upravljanje podacima. Namjera ovog radnog materijala – skripte je da korisniku pruži uvid u teoretske postavke danas najdominantnijeg, relacijskog modela podataka, te da ga upozna s bitnim pojmovima s kojima se susreću svi korisnici suvremenih sustava za upravljanje bazama podataka. Osim toga skripta opisuje i osnovne značajke SQL upitnog jezika, te navoñenjem sintakse naredbi i primjera upoznaje korisnika s jezikom koji čini osnovu svih relacijskih sustava za upravljanje bazama podataka. Skripta je namijenjena prvenstveno studentima Veleučilišta, budući prati tijek i sadržaj programa kolegija “Baze podataka”. Ona meñutim može poslužiti kao uvod u područje baza podataka i obrade podataka za sve one koji žele steći saznanje iz ovih područja, ili kao priručnik i podsjetnik za profesionalce. Zasigurno, ova skripta neće odgovoriti na sva pitanja iz ovog zanimljivog područja. Njezina svrha je da terminologiju i principe rada suvremenih sustava za upravljanje bazama podataka, osnove relacijskog modela podataka i upitnog jezika SQL približi čitateljima. Ona predstavlja tek uvod u jedan vrlo zanimljivi segment informatike. Na kraju, zahvaljujem svima koji su mi savjetima i literaturom pomogli pri sastavljanju ove skripte.

Autor

Page 3: BP VEST Skripta

2

1. ARHITEKTURA SUSTAVA ZA UPRAVLJANJE BAZAMA PODATA KA Pri realizaciji cjelokupnog sustava realizacije baze podataka mogu se razlučiti tri nivoa: 1. Interni nivo

Nivo koji vodi računa o načinima fizičkog spremanja podataka i njihovom manipuliranju. Orjentiran je prema računalu. Na internom nivou baza se opisuje internom shemom (internal schema) kojom se definira način spremanja podataka, tipovi podataka, definicija indeksa, veličina pohranjenih podataka itd.

2. Koncepcijski nivo Predstavlja opći pogled na bazu, na temelju sagledavanja problema. Podrazumijeva koncept realizacije baze podataka, na temelju saznanja o projektiranju baze podataka.

3. Eksterni nivo

Orjentiran prema korisniku, bavi se realizacijom programskog sučelja, koje krajnjem korisniku omogućava pristup i obradu podacima. Podrazumijeva izradu front-end korisničke aplikacije za rad sa bazom. Izbor programskog jezika zavisi o mogućnostima pojedinih alata kao i potrebama krajnje aplikacije.

SUSTAV ZA UPRAVLJANJE BAZOM PODATAKA Sustav za upravljanje bazom podataka (DBMS – Database Management System ) je programski sustav koji osigurava osnovne funkcije odabranog modela podataka u radu sa bazom podataka. Osnovni zahtjevi koji se postavljaju na suvremeni DBMS: - Opis i manipulacija podacima pomoću posebnog jezika (SQL). - Zaštita integriteta podataka - Visok nivo sučelja prema korisniku, bez obzira na strukturu podataka - Skup programskih pomagala za jednostavno razumijevanje i korištenje podataka spremljenih u bazi. DBMS može se podijeliti na dva dijela a) Backend

Omogućava funkcije definiranja podataka, integritet i zaštitu podataka, manipulaciju itd. b) Frontend

Aplikacije, bilo da ih je napisao korisnik ili su sastavni dio DBMS-a (database tools). Osnovne funkcije koje moraju biti ugrañene u svaki sustav za upravljanje bazom podataka su: a) definicija podataka

DBMS mora biti u stanju definicije podataka izrečene u nekoj jeziku za definiciju podataka pretvoriti u oblik interne pohrane podataka.

b) manipulacija podacima DBMS mora imati mogućnost obrade (manipuliranja) podataka prema zahtjevima korisnika. Ti zahtjevi mogu biti dodavanje novih podataka, brisanje ili promjena vrijednosti postojećih itd.

c) Integritet i zaštita podataka DBMS mora čuvati suvislost podataka i njihovo ponašanje prema točno definiranim pravilima. Zahtjeve korisnika koji narušavaju integritet podataka, DBMS mora prepoznati i odbaciti ih.

d) Oporavak u slučaju pogreške U slučaju pogrešnog manipuliranja podacima, sustav mora imati mogućnost uspostave konzistentnosti podataka.

e) efikasnost Sve nabrojane funkcije DBMS mora osigurati uz što bolje performanse.

Administrator baze podataka Administrator baze podataka (DBA – Database Administrator) je osoba zadužena za izvedbu i održavanje baze podataka. Prilikom izrade baze podataka, osoba koja stvara bazu postaje automatski njezin DBA. Administrator ima najveću razinu korisničkih prava, što se tiče pristupa bazi i manipuliranja podacima.

Page 4: BP VEST Skripta

3

DBA dodaje ostale korisnike, u njegovoj je nadležnosti da odreñenim korisnicima dozvoli ili zabrani pristup pojedinim podacima itd. Isto tako DBA je zadužen za održavanje baze (backup). TIPOVI I STRUKTURE BAZE PODATAKA

Centralizirana baza podataka – terminalski pristup Podrazumijeva smještaj podataka na jednom mjestu ( središnjem računalu) i terminalski pristup od strane korisnika. Ovakav pristup znači da se svi zahtjevi i obrade podataka vrše na središnjem računalu, na kojem su smješteni i podaci. Korisnik preko terminala, jedino unosi svoje zahtjeve, te dobija prikaz rezultata željenih operacija. Ovakav način organizacije baze postavlja velike zahtjeve na središnje računalo, koje osim smještaja svih podataka, vrši i sve operacije obrade podataka, njihovog formatiranja i prikaza. Stoga središnje računalo mora imati vrlo veliku procesorsku snagu i visoke performanse. Client- server pristup Client – server struktura podrazumijeva, smještaj podataka na središnjem računalu (server), koje vrši glavninu zahtjeva za manipuliranje i obradu podataka. Korisnici koji pristupaju bazi, taj pristup ostvaruju preko svojih PC računala, koja su mrežom povezana sa serverom. Za razliku od terminalskog pristupa, kod kojeg terminalske stanice nemaju nikakve mogućnosti sudjelovanja u obradi podataka, PC računala na strani klijenta djelomično sudjeluju u obradi podataka. Korisnik preko programskog sučelja formira zahtjev za odreñenim podacima, koji se proslijeñuje serveru. Serversko računalo prihvaća zahtjev, te ga obrañuje, a rezultate te obrade vraća klijentu. Klijentsko računalo prihvaća tako obrañene podatke, te ih formira u obliku kojeg definira korisničko sučelje. Paralelna struktura baze podataka Paralelna struktura podrazumijeva formiranje baze u okružju računala meñusobno povezanih u lokalnu mrežu. Izmeñu računala postoji brza veza, ostvarena preko mrežnih kartica 10/100MBs. Podaci su najčešće smješteni na samo jednom računalu, ali se pri obradi podataka može koristiti procesorska snaga svih računala u mreži. Ovakvim konceptom baze dobija se mogućnost istovremenog korištenja resursa više računala, pa pojedina računala mogu imati i nešto slabije karakteristike. Distribuirana baza podataka Podrazumijeva strukturu baze podataka u kojoj su podaci rašireni na više računala, koja su mrežno povezana. Jednostavno rečeno, distribuirana baza podrazumijeva više lokalnih, meñusobno povezanih baza. Pred samim korisnikom je ta “raspršenost” podataka skrivena, te on ima osjećaj da pristupa jednoj središnjoj bazi.U današnjim uvjetima postoji sve veće potreba za realizacijom distribuiranih baza podataka. Razlozi za to su brojni: a) Mnogi korisnici za koje se rade baze podataka po svojoj prirodi su distribuirani na više lokacija.

Uzmimo primjer mnogih multinacionalnih kompanija, koje imaju podružnice diljem svijeta. Svaka podružnica u mjestu u kojem se nalazi formira svoju lokalnu bazu podataka, a sve te baze zatim se povezuju u distribuiranu bazu podataka, koja objedinjava sve lokalne baze. Rukovodstvo kompanije ima mogućnost pristupa u sve baze i nadzora podataka koji se nalaze u bilo kojoj lokalnoj bazi.

b) Distribucijom baze podataka povećava se raspoloživost i pouzdanost sustava. U slučaju ispada bilo kojeg računala u mreži, podaci na tom mjestu postaju nedostupni korisnicima, ali su podaci na svim ostalim mjestima sačuvani i dostupni.

c) U distribuiranim sustavima se koristi tehnika repliciranja istih podataka na više lokacija u mreži. Zbog obrade manjih baza podataka, brzina obrade na pojedinim mjestima je veća u odnosu na brzinu koju bi imao sustav koji obrañuje veliku centraliziranu bazu.

Da bi se u potpunosti iskoristile prednosti koje pružaju distribuirani sustavi, osim zadataka koji su zajednički sa zadacima centraliziranih sustava , distribuirani sustavi moraju omogućiti: - pristup udaljenim računalima u mreži te prijenos upita i podataka izmeñu računala - postojanje sistemskog kataloga s podacima o distribuciji podataka u mreži - održavanje konzistentnosti podataka koji se repliciraju - izradu strategije za izvoñenje pretraživanja i obrada koje dohvaćaju podatke iz više lokalnih baza. - oporavak sustava u slučaju ispada pojedinog računala iz mreže.

Page 5: BP VEST Skripta

4

2. OSNOVE BAZE PODATAKA - ENTITETI

Baza podataka uvijek predstavlja opis- sliku stvarnog procesa iz okoline. Pri tome se baza podataka sastoji od podataka koji su meñusobno povezani na različite načine i njihove vrijednosti predstavljaju dio realnog svijeta. Definicija: Entitet (Entity) je skup objekata iz realnog svijeta koji imaju neka zajednička svojstva. Svojstva entiteta se nazivaju atributima.

Slika 1. Entitet kao skup Entitet je dakle definiran kao skup ( Slika 1.) E={e1 , e2 , e3 , e4 ... en}, gdje su e1 ...en elementi entiteta (entity instance, entity occurence). Ovi elementi prema definiciji imaju neka zajednička svojstva koja ih opisuju tj. definiraju. Primjer: Za opis procesa studiranja osnovni entitet je STUDENT, tj. skup svih studenata sa nekim zajedničkim svojstvima. Svaki student - pojedinac predstavlja jedan element skupa – entiteta STUDENT . Mogući zajednički atributi (svojstva) studenata: ime, prezime, adresa, JMBG, matični broj, datum roñenja itd. Za prikaz entiteta, kao skupa objekata potrebno je utvrditi: - Selekciju atributa - utvrditi koji atributi (svojstva) su potrebni za opisivanje entiteta.

Prilikom opisivanja entiteta potrebno je u skladu sa potrebama posla zbog kojeg se radi baza podataka izvršiti selekciju atributa.

- Integritet atributa – tip podataka, ograničenja i pravila vezana za pojedini atribut. Definiranjem tipa podataka i ograničenja osigurava se suvislost podataka pojedinog atributa. Ako uzmemo za primjer entitet STUDENT i atribut DATUM ROðENJA to znači da je potrebno osigurati da podatak o datumu roñenja bude u standardnom formatu datuma dan.mjesec. godina. , te da po svojoj vrijednosti bude logičan.

- Kardinalitet atributa – podatak o zastupljenosti pojedinih atributa. Definicija: Kardinalitet atributa je broj koji kazu je koliko vrijednosti pojedini atribut daje za opis jednog elementa entiteta. Primjer: Promatra se entitet STUDENT i njegov atribut Ime. Kardinalitet atributa Ime u entitetu STUDENT kazuje koliko imena može imati student-pojedinac. Pri utvrñivanju kardinaliteta odreñuje se donja i gornja granica – minimalni i maksimalni kardinalitet, te se kardinalitet atributa A u entitetu E opisuje ureñenim parom card(A,E)=(min card(A,E), max card(A,E)) gdje je A- atribut, E-entitet, min card(A,E) – minimalni kardinalitet atributa A u entitetu E, max card(A,E) – maksimalni kardinalitet atributa A u entitetu E. U gornjem primjeru za entitet STUDENT i atribut IME vrijedi: min card(IME, STUDENT)=1, jer svaki student ima najmanje i obavezno 1 ime. max card(IME, STUDENT)=1, jer svaki student ima samo jedno ime Iz ovoga slijedi card(IME,STUDENT)=(1,1) Pogledajmo primjer atributa ZAVRŠENA ŠKOLA u entitetu STUDENT . Ovim atributom prikazujemo naziv srednje škole koju su završili studenti prije upisa na fakultet. Vrijedi: min card(ZAVRŠENA ŠKOLA, STUDENT)=0, max card(ZAVRŠENA ŠKOLA, STUDENT)=1

E

Page 6: BP VEST Skripta

5

Iz ovoga slijedi card(ZAVRŠENA ŠKOLA,STUDENT)=(0,1) min card(ZAVRŠENA ŠKOLA, STUDENT)=0 kazuje da kod prikaza pojedinog studenta ne moramo obavezno imati podatak o njegovoj završenoj srednjoj školi. max card(ZAVRŠENA ŠKOLA, STUDENT)=1 znači da je pojedini student završio jednu srednju školu. Iz ovoga je moguće zaključiti da atributi sa minimalnim kardinalitetom jednakim 0 nisu obvezni. Prikaz jednog elementa entiteta moguće je usporediti sa ispunjavanjem obrasca, kod kojeg su neka polja obvezna, tj. moraju se popuniti, a druga nisu. Viševrijednosni atributi (multi-valued attributes) Viševrijednosni atributi su atributi (svojstva), koja mogu imati više vrijednosti za pojedini element entiteta. Primjer: Neka je pri opisu studenata potrebno znati kojim se sportom bave studenti. Promatrano za studenta-pojedinca, ovaj atribut može imati više različitih vrijednosti, jer se pojedini student može baviti sa više sportova, a neki drugi student se možda uopće ne bavi sportom. Vrijedi min card(SPORT,STUDENT)=0, jer je moguće da se pojedini student ne bavi sportom max card(SPORT, STUDENT)=n, jer se student može baviti sa više sportova Iz ovoga slijedi da je card(SPORT,STUDENT)=(0,n). Atributi koji imaju ovako definirani kardinalitet nazivaju se viševrijednosni atributi (multi-valued attributes) . Opisni atributi i identifikatori Nakon selekcije atributa koji se koriste za opisivanje svojstava entiteta, moguće je razlučiti dvije vrste atributa: opisne i identifikacijske. Primjer: Promatrajmo ponovno entitet STUDENT i atribute Ime, Prezime, Mjesto roñenja, Datum roñenja, JMBG, Završena škola, Sport. Definicija: Identikator (Identifikacijski atribut) je atribut k oji jedinstveno odreñuje pojedine elemente entiteta. Drugim rječima u entitetu(skupu) ne mogu postojati dva elementa sa istom vrijednošću identifikatora. U našem primjeru atribut Ime ne može biti identifikator, jer je realna mogućnost da dva studenta imaju isto ime. Isto vrijedi i za sve ostale atribute, osim atributa JMBG. Ovaj atribut je jedinstven za svaki element entiteta, tj. ne postoje dva studenta sa istim JMBG brojem. Stoga je atribut JMBG identifikator, za razliku od ostalih atributa, koji se smatraju opisnim atributima tj. oni samo opisuju pojedina svojstva entiteta. Za svaki identifikator vrijedi da je njegov maksimalni kardinalitet jednak 1. Uobičajeni prikaz entiteta kakav u praksi često nalazimo je u tabličnom obliku, gdje redovi odgovaraju elementima entiteta, a stupci pojedinim atributima. Dakle svaki redak predstavlja jednog studenta. Npr.

STUDENT Ime Prezime Dat.roñenja Mjesto roñ. JMBG Zavr. škola Ante Rožić 11.10. 1980 Osijek 1110980370071 - Stipe Anić 03.07. 1980 Split 0307980380025 Sr. teh. šk. .... .... .... ....

Svaki element skupa, tj. svaki student pojedinac predstavlja jedinstvenu jedinku, koja mora biti jednoznačno definirana. U tu svrhu u entitetu mora postojati identifikator koji jednoznačno definira elemente entiteta. Taj identifikator mora imati kardinalitet (1,1), tj. mora imati vrijednost za svaki element entiteta, ali ne mogu postojati dva elementa sa istom vrijednošću tog identifikatora. Takav jedinstveni identifikator za svaki element entiteta naziva se Primarni klju č (Primary key).

Page 7: BP VEST Skripta

6

Pretpostavimo da su kardinaliteti atributa u entitetu STUDENT: card(Ime, STUDENT)=(1,1) card(Prezime, STUDENT)=(1,1) card(Datum roñenja, STUDENT)=(1,1) card(Mjesto roñenja, STUDENT)=(1,1) card(JMBG, STUDENT)=(0,1) card(Završena škola, STUDENT)=(0,1) Prethodno smo ustanovili da samo jedan od ovih atributa može biti identifikator, a to je atribut JMBG, jer ne postoje dva studenta sa istim JMBG, dakle ovaj atribut može jednoznačno definirati svakog studenta. Meñutim ovaj atribut ima definiran kardinalitet (0,1), što znači da se student može evidentirati i bez tog podatka (nije obvezan). Iz toga proizlazi da JMBG ne može biti primarni ključ ovog entiteta. Ovaj problem može se riješiti na način da se uvede novi atribut - jedinstveni redni broj studenta. Svaki student dobija svoj redni broj, koji ga jednoznačno odreñuje u skupu studenata. Uz entitet STUDENT vezuje se brojač, koji automatski svakom novom studentu dodijeljuje jedinstveni redni broj, pri čemu ne mogu postojati dva studenta sa istim rednim brojem. STUDENT Student id Ime Prezime Dat.roñenja Mjesto roñ. JMBG Zavr. škola

1 Ante Rožić 11.10. 1980 Osijek 1110980370071 - 2 Stipe Anić 03.07. 1980 Split 0307980380025 Sr. teh. šk. 3 .... .... .... ....

Dijagram entiteta predstavlja grafički prikaz entiteta i njegovih atributa Osnovna pravila grafičkog prikaza entiteta: - Entitet se prikazuje pravokutnim znakom u koji se upisuje naziv entiteta - Pojedini atributi se prikazuju ovalnim znakovima i povezani su s entitetom. Unutar oznake atributa

upisuje se naziv atributa. - Viševrijednosni atributi imaju dvostruku poveznicu sa entitetom, koja podrazumijeva kardinalitet (0,n). - Naziv atributa koji predstavlja primarni ključ se potcrtava. - Kardinalitet atributa upisuje se na njegovu poveznicu sa entitetom Slika 2. Prikazuje dijagram entiteta za entitet STUDENT.

Slika 2. Dijagram entiteta

(1,1) (0,n)

IME

PREZIME DAT. ROðENJA

JMBG (1,1) (1,1) (1,1)

(0,1) MJ. ROðENJA STUDENT

ZAVR. ŠKOLA (0,1)

SPORT

STUDENT ID

(1,1)

Page 8: BP VEST Skripta

7

Složeni atributi

Prilikom opisa entiteta, kao skupa objekata, atribute koji opisuju odreñena logički povezana svojstva entiteta, može se povezati u tzv. složene atribute (composite attributes). Složeni atributi sastavljeni su od atributa koji u procesu ljudskog razmišljanja i modeliranju podataka čine logičku cjelinu. Primjer: Proširimo entitet STUDENT, kao skup svih studenata, atributom ADRESA, koji opisuje adresu stanovanja studenata. Uobičajeni način razmišljanja, podrazumijeva da se pod adresom smatraju podaci o ulici (uključujući i broj) i mjestu stanovanja. Dakle za opis adrese stanovanja, kao složenog atributa, potrebna su dva atributa (svojstva) : ULICA i MJESTO. Svakom od ovih atributa potrebno je definirati odgovarajući kardinalitet u skladu sa definicijom kardinaliteta. Npr. min card(ULICA, STUDENT)=0, jer ne smatramo nužnim da se zna ulica u kojoj student živi max card(ULICA, STUDENT)=1, jer student pojedinac može stanovati samo u jednoj ulici min card(MJESTO, STUDENT)=1, jer podatak o mjestu stanovanja smatramo obveznim max card(MJESTO, STUDENT)=1, jer student može živjeti samo u jednom mjestu dakle vrijedi card(ULICA, STUDENT)=(0,1) i card(MJESTO, STUDENT)=(1,1) U grafičkom prikazu entiteta tj. dijagramu entiteta, složeni atributi se prikazuju na način da se postave izmeñu entiteta i atributa koje oni obuhvaćaju (Slika 3.).

Slika 3. Dijagram entiteta sa prikazom složenog atributa Kardinalitet složenog atributa odreñuje se na temelju kardinaliteta atributa koji su obuhvaćeni složenim atributom, principom maksimuma. Uz definirani složeni atribut A, koji obuhvaća atribute A1, A2,... An, vrijedi min card (A,E)=max( min card(A1,E), min card(A2,E),..., min card (An,E)) max card (A,E)=max(max card(A1,E), max card(A2,E),..., max card (An,E)) U našem primjeru složeni atribut ADRESA obuhvaća atribute ULICA i MJESTO, pa je njegov kardinalitet min card (ADRESA,STUDENT)=max(0, 1)=1 max card (ADRESA,STUDENT)=max(1, 1)=1 card (ADRESA,STUDENT)=(1, 1) Složeni atributi bitni su kod razrade modela baze podataka, budući su oni uobičajeni meñukorak za definiranje svih potrebnih atributa pojedinog entiteta. Složeni atributi takoñer mogu biti identifikatori, pod uvjetom da svi atributi koji čine složeni atribut imaju definiran kardinalitet (1,1), te da je složeni atribut jedinstven za svaki element entiteta. U gornjem primjeru složeni atribut ADRESA ne može biti identifikator u entitetu STUDENT, budući on obuhvaća atribut ULICA za koji vrijedi card(ULICA, STUDENT)=(0,1)

(1,1)

(0,1) (1,1)

(1,1) (0,n)

IME

PREZIME DAT. ROðENJA

JMBG (1,1) (1,1) (1,1)

(0,1) MJ. ROðENJA STUDENT

ZAVR. ŠKOLA (0,1)

SPORT

STUDENT ID

(1,1)

ADRESA

ULICA MJESTO

Page 9: BP VEST Skripta

8

STUDENT

3. RELACIJE U sustavu baze podataka skupovi – entiteti su meñusobno povezani logičkim vezama relacijama. Objasnimo ovu povezanost na primjeru dva entiteta: STUDENT i UPISNI LIST, koji opisuju proces studiranja svakog studenta. Prilikom upisa u pojedini semestar svaki student predaje upisni list, dokument o upisu semestra, koji sadržava sve potrebne podatke. Dakle uz već spomenuti entitet STUDENT, koji predstavlja skup studenata, uvedimo novi entitet UPISNI LIST. Kao i svaki entitet i UPISNI LIST je predstavljen svojim atributima, svojstvima, npr. SEMESTAR, ŠK.GODINA, OBRAZOVNI PROGRAM. Ali ovaj entitet povezan je sa prethodnim entitetom STUDENT, budući svaki upisni list pripada nekom studentu. Dakle izmeñu ova dva entiteta postoji logička veza – relacija. Veza izmeñu skupova-entiteta ostvaruje se vezom izmeñu pojedinih elemenata tih skupova. Prikažimo relaciju izmeñu ova dva entiteta grafički (Slika 4).

Slika 4. Prikaz relacije jedan prema više Definicija: Kardinalitet entiteta u relaciji definiran je brojem veza pojedinog elementa tog entiteta sa elementima entiteta s kojim je relacijski povezan. Primjer: Relacijska veza entiteta STUDENT i UPISNI LIST. Jedan student-pojedinac može imati više upisnih listova (za svaki semestar po jedan), ali ne mora nužno imati upisni list. Sa druge strane, svaki upisni list mora pripadati nekom studentu, i to samo jednom odreñenom. Vrijedi min card (STUDENT, PREDAJE)=0 min card (UPISNI LIST,PREDAJE)=1 max card (STUDENT,PREDAJE)=n max card (UPISNI LIST,PREDAJE)=1 odnosno card (STUDENT, PREDAJE)=(0,n) card (UPISNI LIST, PREDAJE)=(1,1) Ovakav tip relacije je relacija 1××××n odnosno jedan prema više (one-to-many). Definicija: Ako dva entiteta E i F ostvaruju relaciju R, pri čemu vrijedi min card (E,R)=0 min card (F,R)=1 max card (E,R)=n max card (F,R)=1 card(E,R)=(0,n) card(F,R)=(1,1) takva relacija je tipa 1××××n (jedan prema više). Napomena: Pri odreñivanju tipa relacije, ključan je maksimalni kardinalitet entiteta u relaciji. To znači da su entiteti E i F povezani relacijom R sa definiranim kardinalitetima, card(E,R)=(0,n) i card(F,R)=(0,1) takoñer u vezi jedan prema više.

PREDAJE UPISNI LIST

STUDENT UPISNI LIST

Page 10: BP VEST Skripta

9

Relacija 1×××× 1 jedan-na-jedan (one- to-one) Definicija Za dva entiteta E i F koji sudjeluju u relaciji R j edan-na-jedan vrijedi min card (E,R)=0 min card (F,R)=0 max card (E,R)=1 max card (F,R)=1 Svaki element skupa E može biti povezan samo sa jednim elementom skupa F, ali i ne mora. Isto vrijedi za elemente skupa F. Primjer: Studenti imaju mogućnost prijavljivanja ispita elektronskim putem. Za pristup sustavu za prijavljivanje ispita svaki student mora dobiti PIN (osobni identifikator sa šifrom). Pri tome svaki student može dobiti samo jedan PIN, ali je realna mogućnost da student ne dobije PIN odmah po upisu na fakultet. To znači da trenutno mogu postojati studenti kojima nije dodijeljen PIN. U isto vrijeme, svaki PIN može biti dodijeljen samo jednom studentu, ali mogu postojati i već pripremljeni PIN-ovi koji još nisu rasporeñeni studentima (Slika 5). Za relaciju PRIJAVA koja povezuje entitete STUDENT i PIN vrijedi card(STUDENT,PRIJAVA)=(0,1) i card(PIN,PRIJAVA)=(0,1), dakle radi se o relaciji 1×1.

Slika 5. Prikaz relacije jedan na jedan Relacija n××××n više-na-više (many - to-many) Definicija Za dva entiteta E i F koji sudjeluju u relaciji R više-na-više vrijedi min card (E,R)=0 min card (F,R)=0 max card (E,R)=n max card (F,R)=n Svaki element skupa E može biti povezan sa više elemenata skupa F, ali i ne mora. Isto vrijedi za elemente skupa F. Primjer: U tijeku procesa studiranja svaki student predaje UPISNI LIST kojim potvrñuje upis pojedinog semestra, a koji je vezan za studenta. Eniteti STUDENT i UPISNI LIST povezani su relacijom jedan prema više, kako je prethodno opisano. Meñutim upisni list uz opće atribute, sadržava i podatke o predmetima koje student upisuje u tom semestru. Da bi se definirao proces upisivanja predmeta potrebno je definirati novi entitet PREDMET, kao skup svih predmeta koji se predaju. Entitet predmet definiran je atributima: PREDMET_ID, NAZIV PREDMETA, SATI PREDAVANJA, SATI VJEŽBE itd.

PREDMET Predmet_id Ime predmeta Sati pred Sati AV Sati LAB 100 Matematika 3 2 0 101 Fizika 3 1 0 .... .... .... ....

STUDENT PIN

Page 11: BP VEST Skripta

10

UPISNI LIST

Pogledajmo sada odnos izmeñu ova dva entiteta UPISNI LIST i PREDMET. Svaki student na jednom upisnom listu ( u jednom semestru) upisuje više predmeta, ali u nekim slučajevima ne mora upisati niti jedan (npr. ponavljanje godine). Sa druge strane svaki predmet može upisati više studenata, ali se može dogoditi da neki od ponuñenih predmeta(izbornih) ne upiše niti jedan student. Ovakvi odnosi mogu se prikazati grafički (Slika 6.)

Slika 6. Prikaz relacije više-na- više (n×n) Za relaciju UPISUJE koja definira odnos izmeñu entiteta UPISNI LIST i PREDMET, vrijedi min card (UPISNI LIST,UPISUJE)=0 min card (PREDMET,UPISUJE)=0 max card (UPISNI LIST,UPISUJE)=n max card (PREDMET,UPISUJE)=n pa se radi o relaciji više-na- više (n×n). Za relacije više-na-više svojstveno je da ovakav tip relacije, osim povezivanja entiteta, sa sobom može donijeti odreñene atribute koji su posljedica relacijske veze. U našem primjeru, kao posljedica činjenice da pojedini student u danom semestru upiše neki predmet, mogu se javiti atributi OCJENA i DATUM (datum polaganja). Ovi atributi nisu dio niti jednog od entiteta koji sudjeluju u relaciji, već su posljedica relacijske veze, u ovom slučaju entiteta UPISNI LIST i PREDMET, što se dijagramski prikazuje (Slika 7.)

Slika 7. Dijagram relacije više-na- više (n×n). Proširenjem grafičkog prikaza entiteta, na način da se grafički prikaz entiteta i pripadajućih atributa (dijagram entiteta) proširi sa prikazom relacija, tj. meñusobne veze meñu entitetima, dobija se E-R dijagram ( dijagram ENTITET-RELACIJA). Osnovni princip prikaza relacija u dijagramu vidljiv je već iz gornjih primjera. - Relacija se simbolički ucrtava deltoidnim znakom (◊) izmeñu entiteta koji sudjeluju u relaciji, te se

povezuje s njima. - Na poveznicu entiteta i relacije upisuje se kardinalitet entiteta u relaciji u obliku ureñenog para. - Atributi koji su posljedica relacije ucrtavaju se ovalnim simbolom kao i atributi entiteta, te se povezuju

sa relacijom iz koje proizlaze. Detaljni E-R dijagram prikazan je na slici 8.

UPISNI LIST PREDMET

UPISUJE PREDMET

(0,n) (0,n)

OCJENA DATUM

Page 12: BP VEST Skripta

11

PREDMET

Slika 8. E-R dijagram

(1,1)

(0,n)

(1,1) (1,1)

(1,1)

(0,n)

(1,1)

PREDAJE

(1,1)

(1,1)

(1,1)

(1,1)

(1,1) (0,n)

IME

PREZIME DAT. ROðENJA

JMBG (1,1) (1,1) (1,1)

(0,1) MJ. ROðENJA STUDENT

ZAVR. ŠKOLA (0,1)

SPORT

UPISNI LIST

SEMESTAR

ŠK.GODINA

OBR.PROGRAM

STUDENT ID

ULIST ID

(1,1)

UPISUJE

(0,n)

OCJENA

DATUM

PREDMET_IDT ID

IME PREDMETA

SATI _PRED

SATI_AV SATI_LAB

(1,1)

Page 13: BP VEST Skripta

12

4. RELACIJSKI MODEL PODATAKA

E-R dijagram je osnova i uvod za prikaz podataka u relacijskom modelu. Iz izvedbe E-R dijagrama vrši se rekonstrukcija relacijskog modela baze podataka. Taj model podataka je vremenom usavršavan i danas je de facto najrašireniji, općeprihvaćeni model podataka. Najveća prednost relacijskog modela podataka jest u tome da on počiva na matematičkoj teoriji relacijske algebre. TRANSFORMACIJSKA PRAVILA Transformacijska pravila omogućavaju razvoj relacijskog modela baze podataka temeljem E-R dijagrama 1. Entitet kao skup objekata prikazuje se tablicom. Svaki redak u tablici odgovara jednom elementu entiteta, a svaki stupac je odgovarajući atribut. Ime tablice jednako je nazivu entiteta

STUDENT Student id Ime Prezime Dat.roñenja Mj. ro ñenja JMBG Zavr. škola 1 Ante Rožić 11.10. 1980 Osijek 1110980370071 - 2 Stipe Anić 03.07. 1980 Split 0307980380025 Sr. teh. šk. 3 .... .... .... ....

Simbolički prikaz tablice tj. njezina definicija izražava se u obliku head(IME TABLICE)={atribut1,atribut2,...}, a primarni ključ PK(IME TABLICE)=naziv kolone U gornjem primjeru tablice STUDENT vrijedi head(STUDENT)={Student_id, Ime,Prezime, Dat.roñenja, Mj.roñenja,JMBG,Zavr.škola} PK(STUDENT)=Student_id 2. Viševrijednosni atributi ne prikazuju se preko jedne kolone, kao obični atributi, jer unos više vrijednosti u jedno polje nije dozvoljen. Umjesto toga viševrijednosni atribut prikazuje se posebnom tablicom. Nova tablica sastoji se od dva stupca: primarnog ključa entiteta i viševrijednosnog atributa. Primarni ključ nove tablice, složen je od obje vrijednosti tj. za viševrijednosni atribut S u entitetu E, vrijedi prikaz preko nove tablice S uz head(S)={E_id, S} i PK(S)={E_id,S}, gdje jd E_id=PK(E). Primjer: Prethodno je opisan entitet student i viševrijednosni atribut sport, kojim se opisuje bavljenje studenata sportom. Prema tranformacijskom pravilu ovaj atribut prikazuje se posebnom tablicom, koja sadržava primarni ključ entiteta STUDENT (Student_id) i viševrijednosni atribut (Sport). Složeni primarni ključ nove tablice čine oba atributa tj. PK(SPORT)={Student_id, Sport}.

SPORT Student_id Sport 1 odbojka 2 nogomet 2 košarka

3. Prikaz relacije jedan-na–više (one-to-many) Ako su entiteti E i F u relaciji R tipa jedan-na-više i card(E,R)=(0,n) , card(F,R)=(1,1) , relacija se ostvaruje preko stranog ključa, tj. pripadajuća tablica entiteta F proširuje se kolonom E_id, gdje je E_id =PK(E), a ta kolona u tablici F naziva se strani klju č (foreign key – FK). Promotrimo ovo na primjeru već opisanih entiteta STUDENT i UPISNI LIST. Ova dva entiteta povezani su relacijom PREDAJE i vrijedi

Page 14: BP VEST Skripta

13

UPISNI LIST

card (STUDENT, PREDAJE)=(0,n) card (UPISNI LIST, PREDAJE)=(1,1) Relacija jedan-na više ostvaruje se na način da se, prema transformacijskom pravilu, tablici UPISNI LIST dodaje nova kolona (atribut), kojom se označava povezanost (pripadnost) pojedinog upisnog lista studentu. Budući da je svaki student jednoznačno odreñen svojim primarnim ključem, nova kolona sadržava podatke o primarnom ključu studenta, te predstavlja strani ključ u tablici UPISNI LIST. STUDENT Student id Ime Prezime Dat.roñenja Mj. ro ñenja JMBG Zavr. škola

1 Ante Rožić 11.10. 1980 Osijek 1110980370071 - 2 Stipe Anić 03.07. 1980 Split 0307980380025 Sr. teh. šk. 3 .... .... .... ....

UPISNI LIST Ulist id Šk.godina Semestar Obr.program Student_id

1 1999/00 2 Elektronika 2 2 1999/00 4 Strojarstvo 1 3 .... .... ....

4. Prikaz relacije više-na-više (many-to-many) Ako su entiteti E i F u relaciji R tipa više-na-više i card(E,R)=(0,n) card(F,R)=(0,n) relacija se ostvaruje formiranjem nove tzv. relacijske tablice R, te vrijedi E_id=PK(E)=FK(R) F_id=PK(F)=FK(R) PK(R)=(E_id,F_id) Nova relacijska tablica, uz strane ključeve entiteta koji sudjeluju u relaciji (a koji zajedno čine primarni ključ nove tablice), proširuje se atributima koji su posljedica relacije meñu entitetima.

Primjer: U modelu baze podataka koja opisuje studiranje, entiteti UPISNI LIST i PREDMET nalaze se u relacijskoj vezi više-na-više (Slika 9.)

Slika 9. Entiteti UPISNI LIST i PREDMET u relaciji više-na-više UPISNI LIST Ulist id Šk.godina Semestar Obr.program Student_id

1 1999/00 2 Elektronika 2 2 1999/00 4 Strojarstvo 1 3 .... .... ....

PREDMET Predmet_id Ime predmeta Sati pred Sati AV Sati LAB 100 Matematika 3 2 0 101 Fizika 3 1 0 .... .... .... ....

Vrijedi min card (UPISNI LIST,UPISUJE)=0 min card (PREDMET,UPISUJE)=0

max card (UPISNI LIST,UPISUJE)=n max card (PREDMET,UPISUJE)=n card (UPISNI LIST,UPISUJE)=(0,n) card (PREDMET,UPISUJE)=(0,n)

UPISUJE PREDMET

(0,n) (0,n)

OCJENA DATUM

Page 15: BP VEST Skripta

14

U skladu sa pravilom prikaza relacije više-na-više, ovakva relacija bit će prikazana novom relacijskom tablicom UPISUJE, za koju vrijedi PK(UPISNI LIST)=FK(UPISUJE)=Ulist_id PK(PREDMET)=FK(UPISUJE)=Predmet_id PK(UPISUJE)=(Ulist_id,Predmet_id) Tablica UPISUJE uz strane ključeve tablica koje sudjeluju u relaciji, a koji čine primarni ključ nove tablice,(Ulist_id,Predmet_id), sadržava i atribute koji su posljedica relacijske veze (Ocjena,Datum).

UPISUJE Ulist id Predmet_id Ocjena Datum

1 100 4 11.10.2000 2 101 - - 3 .... ....

5. Prikaz relacije jedan-na-jedan (one-to-one) Ako su entiteti E i F u relaciji R tipa jedan-na-jedan i card(E,R)=(0,1) card(F,R)=(0,1) , E_id=PK(E), F_id=PK(F) relacija se može ostvariti na tri načina: a) E_id=PK(E)=FK(F), stranim ključem u tablici F b) F_id=PK(F)=FK(E), stranim ključem u tablici E c) proširenjem tablice(entiteta) E sa kolonama (svojstvima) tablice F RELACIJSKA PRAVILA Definiraju način prikaza i pristupa podacima 1. Pravilo normalnog oblika: zabranjuje prikaz viševrijednosnih atributa u jednoj tablici-identično transformacijskom pravilu broj 2. 2. Pravilo pristupa podacima- definira da se podacima u tablici može pristupati isključivo preko vrijednosti atributa(kolona). 3. Pravilo jedinstvenosti reda u tablici (elementa u entitetu): u tablici ne postoje dva potpuno ista reda, sa jednakim vrijednostima svih atributa. PRIMARNI KLJU Č Primarni ključ je atribut ili skup atributa koji jedinstveno identificiraju svaki element entiteta (redak u tablici). Primarni ključ mora zadovoljavati tri osnovna uvjeta: 1. Jedinstvenost

U tablici ne mogu postojati dva redka s istom vrijednošću primarnog ključa 2. Minimalnost

Ako je primarni ključ složen tj. sastoji se od više atributa, tada se niti jedna njegova komponenta ne može ukloniti a da se ne naruši pravilo jedinstvenosti.

3. Pravilo integriteta primarnog klju ča Niti jedna komponenta primarnog ključa ne smije imati null vrijednost tj. atribut koji je sastavni dio primarnog ključa mora imati definiran kardinalitet (1,1). Pravilo integriteta posljedica je pravila minimalnosti. Kada bi bilo dopušteno da neki atribut kao dio primarnog ključa poprimi null vrijednost, to bi značilo da se elementi entiteta mogu identificirati i bez poznavanja vrijednosti tog atributa. Iz toga proizlazi da takav atribut uopće ne treba biti dio primarnog ključa, tj. narušilo bi se pravilo minimalnosti.

Page 16: BP VEST Skripta

15

DEKOMPOZICIJA ATRIBUTA Pogledajmo primjer već opisanog entiteta STUDENT (Slika 10.), koji je definiran sa pripadajućim atributima. Svi atributi opisuju neko od svojstava zajedničko svim elementima skupa studenata. Atribut MJESTO ROðENJA za svakog studenta daje podatak gdje je roñen. Uz ovakvu definiciju entiteta, pod tim atributom podrazumijeva se naziv mjesta u kojem je student roñen. Meñutim realna je mogućnost da postoji više različitih mjesta, koja imaju isti naziv. Stoga bi se, za studente koji su roñeni u dva potpuno različita mjesta pojavila ista vrijednost atributa MJESTO ROðENJA. Očito je da opis ovog atributa nije ispravno postavljen, tj. za opis jednog mjesta nije dovoljan samo naziv (ime) mjesta.

Slika 10. Dijagram entiteta STUDENT Rješenje ovog problema je u redefiniciji atributa MJESTO kao posebnog entiteta. Taj entitet, kao i svaki drugi predstavlja skup elemenata (mjesta) sa zajedničkim svojstvima (Slika 11.).

Slika 11. Dijagram entiteta MJESTO Pri definiciji novog entiteta, za njegov opis uzimamo sve bitne atribute koji pobliže definiraju svojstva pojedinog mjesta. U skladu sa transformacijskim pravilom novi entitet bi se u relacijskom modelu baze prikazao tablicom MJESTO MJESTO_ID IME MJESTA POŠT. BROJ OPĆINA DRŽAVA 1. Split 21000 Split Hrvatska 2. Smokvica 23249 Pag Hrvatska 3. Smokvica 20272 Smokvica Hrvatska 4. Bonn - - Njemačka

Novi entitet nalazi se u relacijskoj vezi sa entitetom STUDENT. Promotrimo ovu vezu na nivou algebre skupova (Slika 12).

(1,1)

(0,n)

IME

PREZIME DAT. ROðENJA

JMBG (1,1) (1,1) (1,1)

(0,1) MJ. ROðENJA STUDENT

ZAVR. ŠKOLA (0,1)

SPORT

STUDENT ID

(1,1)

IME MJESTA POŠT. BROJ

OPĆINA (1,1) (0,1)

MJESTO

DRŽAVA (1,1)

MJESTO ID

(0,1)

(1,1)

Page 17: BP VEST Skripta

16

Slika 12. Skupovni prikaz veze meñu entitetima Nazovimo relacijsku vezu izmeñu entiteta MJESTO i STUDENT - ROðENJE. Svako mjesto može biti mjesto roñenja više studenata, ali ne mora značiti da je u svakom mjestu roñen neki od studenata. Sa druge strane svaki student je roñen u nekom mjestu, i to samo jednom koje predstavlja njegovo mjesto roñenja. Vrijedi da je card(MJESTO, ROðENJE)=(0,n) i card(STUDENT, ROðENJE)=(1,1), dakle radi se o relaciji jedan-na-više (one-to-many). U skladu sa već spomenutim pravilom ovakav oblik relacije ostvaruje se preko stranog ključa, tj. tablica(entitet) MJESTO daje svoj primarni ključ u tablicu STUDENT kao strani ključ. MJESTO MJESTO_ID IME MJESTA POŠT. BROJ OPĆINA DRŽAVA 1. Split 21000 Split Hrvatska 2. Smokvica 23249 Pag Hrvatska 3. Smokvica 20272 Smokvica Hrvatska 4 Osijek 31000 Osijek Hrvatska 5. Bonn - - Njemačka

STUDENT Student id Ime Prezime Dat.roñenja Mjesto_id JMBG Zavr. škola 1 Ante Rožić 11.10. 1980 4 1110980370071 - 2 Stipe Anić 03.07. 1980 1 0307980380025 Sr. teh. šk. 3 .... .... .... ....

gdje vrijedi da je Mjesto_id strani ključ iz tablice MJESTO u tablici STUDENT. U opisu mjesta posebno mjesto zauzima atribut općina, kojim se opisuje pripadnost mjesta pojedinoj općini. U praksi je općina opisana mjestom koje predstavlja općinsko središte, tj. pojam općine moguće je povezati sa pojmom mjesta. Ovdje dolazimo do logičke veze gdje je jedan entitet povezan sa samim sobom.

Slika 13.Ring struktura (veza entiteta sa samim sobom) Ovakva struktura u odnosu entiteta naziva se ring struktura (prsten), gdje je jedan entitet povezan sa samim sobom (Slika 13.). Prema pravilima transformacije, budući se radi o obliku relacije jedan-prema-više, ona se ostvaruje preko stranog ključa. MJESTO

MJESTO_ID IME MJESTA POŠT. BROJ OPĆINA_ID DRŽAVA 1. Split 21000 1 Hrvatska 2. Pag 23250 2 Hrvatska 3. Smokvica 23249 2 Hrvatska 4. ... ... ... ...

MJESTO

(0,n)

STUDENT

U OPĆINI MJESTO

(1,1)

strani ključ

Page 18: BP VEST Skripta

17

5. INTEGRITET PODATAKA

Integritetom podataka osigurava se njihova suvislost i postiže se da podaci odgovaraju točno zadanim pravilima i formatima u okviru baze podataka. Svaka je baza podataka više ili manje vjerna slika svijeta koji nas okružuje, tj. onog njegovog dijela o kojem želimo obrañivati podatke. Pri tome se baza podataka sastoji od podataka koji su meñusobno povezani na različite načine i njihove vrijednosti predstavljaju dio realnog okružja. Potrebno je definirati odreñena pravila kojima je zadatak postavljanje ograničenja koja postoje kako na pojavljivanje vrijednosti pojedinih atributa, tako i na njihovo meñusobno povezivanje. Ta se pravila nazivaju pravila integriteta (integrity rules) i od ogromnog su značenja za ispravno funkcioniranje sustava i zaštitu informacija. INTEGRITET ENTITETA – DOMENA PODATAKA Domena podataka predstavlja skup vrijednosti koje odreñeni atribut može poprimiti. Pojedinačna vrijednost atributa se smatra najmanjom nedjeljivom semantičkom jedinicom podataka. Domena se definira za svaki atribut i predstavlja podatke koji pripadaju istom tipu podataka. Miješanje više tipova podataka unutar jedne domene nije dopušteno. Primjer: Promatrajmo entitet STUDENT i njegov atribut DATUM ROðENJA. Ovaj atribut daje podatak o tome kada je roñen student. Radi se o podatku koji mora udovoljavati standardnom tipu podataka koji prikazuje datum u uobičajenom formatu dan.mjesec.godina. Logično je da se za ovaj atribut veže tip podataka datuma, koji osigurava prikaz podataka u željenom formatu. Meñutim definiranje tipa podataka za pojedini atribut najčešće nije dovoljno da bi se osigurala suvislost podataka. Pretpostavimo da se nalazimo u godini 2001, te da u tablicu STUDENT želimo unijeti podatak o novom studentu, za kojeg upisujemo datum roñenja 11.05.2006. Ovaj podatak je sa stajališta formata podataka potpuno ispravan, ali nije logičan, budući je student svakako morao biti roñen prije. Stoga je uz svaki atribut osim tipa podataka potrebno definirati i ograničenja, koja osiguravaju realnost podataka. REFERENCIJALNI INTEGRITET Osigurava logičnu vezu i pravila odnosa meñu podacima u tablicama koje su relacijski povezane. U tablici ne može postojati vrijednost stranog ključa za koju ne postoji ista vrijednost primarnog klju ča u osnovnoj tablici. STUDENT Student id Ime Prezime Dat.roñenja Mjesto roñ. JMBG Zavr. škola 1 Ante Rožić 11.10. 1980 Osijek 1110980370071 - 2 Stipe Anić 03.07. 1980 Split 0307980380025 Sr. teh. šk. 3 .... .... .... ....

UPISNI LIST Ulist id Student_id Sem Školska god. Obr.prog 1 2 1 1999/00 elektronika 2 2 2 1999/00 elektronika 3 .... .... .... ....

Izmeñu tablica STUDENT i UPISNI LIST postoji relacija one-to-many koja je ostvarena stranim ključem u tablici UPISNI LIST (Student_id). Referencijalni integritet definira pravila unosa, brisanja i promjene(ažuriranja) podataka, kako bi se osigurala konzistentnost podataka u bazi. Na dizajneru baze podataka je da definira ponašanje baze prilikom pojedinih promjena. Pri tome postoje dvije mogućnosti ponašanja sustava. a) Tražena akcija se odbija i u bazi se na dogañaju nikakve promjene. b) Akcija se dopušta, ali se uz nju pokreću još neke akcije koje imaju svrhu uspostaviti konzistentnost

baze podataka

FK

Page 19: BP VEST Skripta

18

Unos podataka Zabranjen je unos podatka u tablicu, sa nekom vrijednost stranog ključa, ako u osnovnoj tablici ne postoji ista vrijednost primarnog ključa. (Restricted). Brisanje podataka 1. Ograničeno (Restricted) - Brisanje reda sa odreñenom vrijednošću primarnog ključa dozvoljeno je

samo ako se ta vrijednost ne pojavljuje u drugoj tablici kao strani ključ. Primjer: Ne može se ukloniti pojedinog studenta iz tablice STUDENT, ako u tablici upisni list postoje njegovi upisni listovi.

2. Stupnjevano – Kaskadno (Cascade) brisanje. Brisanje podatka sa odreñenom vrijednosti primarnog

ključa izaziva brisanje svih podataka u drugoj tablici gdje se ta vrijednost primarnog ključa pojavljuje kao strani ključ. Primjer: Brisanjem pojedinog studenta iz tablice STUDENT, automatski se brišu svi njegovi upisni listovi iz tablice UPISNI LIST.

3. Nuliranje (Nullifies) – brisanjem odreñene vrijednosti primarnog ključa, najprije se sve iste

vrijednosti stranog ključa postavljaju na null vrijednost, a onda se iz osnovne tablice briše ta vrijednost primarnog ključa. Primjer: Brisanjem pojedinog studenta iz tablice STUDENT, najprije se za sve upisne listove koji pripadaju tome studentu, atribut student_id, koji je u tablici UPISNI LIST strani ključ postavlja na null vrijednost, a potom se uklanja željeni podatak iz tablice STUDENT.

Ažuriranje podataka 1. Ograničeno (Restricted) : Ažuriranje vrijednosti primarnog ključa dozvoljeno je samo ako se ta

vrijednost ne pojavljuje u drugoj tablici kao strani ključ. 2. Stupnjevano – Kaskadno (Cascade) ažuriranje. Ažuriranje vrijednosti primarnog ključa izaziva

ažuriranje svih podataka u drugoj tablici gdje se ta vrijednost primarnog ključa pojavljuje kao strani ključ.

3. Nuliranje (Nullifies) – ažuriranjem odreñene vrijednosti primarnog ključa, najprije se sve iste

vrijednosti stranog ključa postavljaju na null vrijednost, a onda se u osnovnoj tablici mijenja ta vrijednost primarnog ključa.

Prilikom definiranja tipa akcije vezane za pravila referencijalnog integriteta, dizajner baze podataka mora rješiti dilemu: može li strani ključ poprimiti null vrijednost? Iako je odgovor na prvi pogled NE, što je najčešći slučaj u praksi, postoje slučajevi kad je to moguće. U promatranom primjeru relacijske veze meñu entitetima STUDENT i UPISNI LIST, null vrijednost stranog ključa (student_id u tablici UPISNI LIST) nema nikakvog smisla. To bi značilo da je moguće evidentirati upisni list koji nije povezan sa niti jednim studentom, što nije realno. Postoje meñutim situacije kada je realna mogućnost da strani ključ poprimi null vrijednost. Ukoliko je relacijska veza R izmeñu entiteta E i F definirana sa:

card(E, R)=(0,n) i card(F,R)=(0,1) radi se o relaciji jedan-na-više (1×n), koja se ostvaruje stranim ključem u tablici F, pri čemu taj strani ključ može poprimiti null vrijednost. Ako je pri tome primarni ključ entiteta E složen (sastoji se od više atributa-kolona), to podrazumijeva da će i strani ključ u tablici F takoñer biti složen. Ako je strani ključ složen, tada vrijednosti njegovih atributa za pojedine elemente entiteta moraju biti ili sve poznate ili sve null vrijednosti. To znači da nije dopušteno da neke vrijednosti atributa koje čine strani ključ budu null, a druge ne. U slučajevima kada nije dozvoljeno da strani ključ poprimi null vrijednost, razumljivo da nije moguće definirati referencijalni integritet zasnovan na nuliranju.

Page 20: BP VEST Skripta

19

6. RELACIJSKA ALGEBRA

Relacijska algebra podrazumijeva definirane operacije nad entitetima (tablicama) i podacima koji im pripadaju. Operacije teorije skupova (Set-theory operations) Unija (T:=R U S) Presjek (T:=R I S) Razlika (T:=R – S) Produkt (T:=R × S) Prirodne relacijske operacije (Native-relation operations) Projekcija (T:=R [a] ) Selekcija (T:=R where a=12) Join (T:=R>< S) Dijeljenje (T:=R÷S) Definicija Kompatibilnim tablicama smatramo tablice koje a) Sadrže atribute jednakog naziva i isti broj atributa – imaju jednak broj kolona i sve kolone su istog

naziva b) Atributi istog naziva definirani su nad jednakim domenama UNIJA (T:=R UUUU S) Operacija unije može se provoditi samo nad kompatibilnim tablicama Po matematičkoj teoriji unija dvaju skupova R i S je skup T koji se sastoji od svih elemenata koji pripadaju bilo kojem od skupova R ili S. Primijenjeno na tablice, tablica T je unija tablica R i S, koja ima isto zaglavlje (header) kao i tablice R i S, a sadrži sve redove koji se nalaze bilo u tablici R ili S. R S T:=R U S

A B C A B C A B C s 1 4 d 1 5 s 1 4 d 1 5 c 2 4 d 1 5 c 2 5 f 4 4 c 2 5

c 2 4 f 4 4 PRESJEK (T:=R IIII S) Operacija presjeka može se provoditi samo nad kompatibilnim tablicama Po matematičkoj teoriji presjek dvaju skupova R i S je skup T koji se sastoji od svih elemenata koji pripadaju i skupu R i skupu S. Primijenjeno na tablice, tablica T je presjek tablica R i S, koja ima isto zaglavlje (header) kao i tablice R i S, a sadrži sve redove koji se nalaze u oba dvije tablice.

R S T:=R I S A B C A B C A B C s 1 4 d 1 5 d 1 5 d 1 5 c 2 4 c 2 5 f 4 4

Page 21: BP VEST Skripta

20

RAZLIKA (T:=R - S) Operacija razlike može se provoditi samo nad kompatibilnim tablicama Po matematičkoj teoriji razlika dvaju skupova R i S je skup T koji se sastoji od svih elemenata koji pripadaju skupu R i ne pripadaju skupu S. Primijenjeno na tablice, tablica T je razlika tablica R i S, koja ima isto zaglavlje (header) kao i tablice R i S, a sadrži sve redove koji se nalaze u R, a ne nalaze se u S. R S T:=R- S

A B C A B C A B C s 1 4 d 1 5 s 1 4 d 1 5 c 2 4 c 2 5 c 2 5 f 4 4

PRODUKT (T:=R ×××× S) Operacija produkta nad entitetima (tablicama), temelji se na skupovnoj operaciji Kartezijevog produkta. Po matematičkoj teoriji Kartezijev produkt dvaju skupova R i S je skup T koji se sastoji od ureñenih parova, pri čemu je prvi element ureñenog para iz skupa R, a drugi iz skupa S. Primijenjeno na tablice, tablica T je produkt tablica R i S, čije je zaglavlje (header) definirano: head(R ×××× S)=head(R) U head(S), a elementi(redovi) te tablice nastaju spajanjem redova iz tablice R i redova iz tablice S. R S T:=R× S

A B C D E F A B C D E F s 1 4 d 1 5 s 1 4 d 1 5 d 1 5 c 2 4 s 1 4 c 2 4 c 2 5 d 1 5 d 1 5 d 1 5 c 2 4 c 2 5 d 1 5 c 2 5 c 2 4

Općenito za produkt tablica vrijedi Ako je R (m × n) --- m redova i n kolona

S (k × l ) ---- k redova i l kolona, onda je T:=R × S tablica sa (m•k) redova i (n+l) kolona Za operatore unije, presjeka i produkta vrijede pravila asocijativnosti i komutativnosti. (R U S) U T= R U (S U T)= R U S U T (R I S) I T= R I (S I T)= R I S I T (R × S) × T= R × (S × T)= R × S × T Meñuzavisnost operacija R I S = R - (R - S) = S - (S - R) R – S = R – (R I S) PROJEKCIJA T:=R [a] Operacijom projekcije tablice nad atributima izvajaju se atributi tablice na kojima se vrši projekcija. Projekcija tablice R nad atributima X,Y,Z jest tablica T sa zaglavljem head(T)= {X,Y,Z} koja sadržava sve redove koji su sadržani u tablici R. Kao rezultat operacije projekcije dobija se nova tablica koja predstavlja vertikalni podskup zadane tablice.

Page 22: BP VEST Skripta

21

R T:=R[A] A B C A s 1 4 s d 1 5 d c 2 5 c

Operacijom projekcije nad zadanom tablicom R dobija se rezultat koji sadrži isti broj redova kao i tablica R, ali samo one atribute (kolone) po kojima se vrši projekcija. SELEKCIJA - IZDVAJANJE (T:=R where a=12) Operacijom izdvajanja (selekcije) nad zadanom tablicom R izdvaja se skup redova koji zadovoljavaju uvjet po kojem se selekcija vrši. Tablica koja se dobija kao rezultat operacije selekcije sadrži sve atribute (kolone) kao i izvorna tablica, ali samo one redove koji zadovoljavaju traženi uvjet. Dobijena tablica predstavlja horizontalni podskup izvorne tablice.

R R where A=s A B C A B C s 1 4 s 1 4 d 1 5 s 4 6 s 4 6 c 2 5

SPAJANJE - JOIN Operacija spajanja (join) ima nekoliko podvrsta: Inner join- unutrašnja veza T:=R>>>><<<< S Inner join operacijom povezuju se tablice na način da se spajaju redovi tablica po istim vrijednostima zajedničkog atributa, tj. spajaju se redovi koji u kolonama istog naziva u obje tablice imaju istu vrijednost. R S T:=R>< S

Page 23: BP VEST Skripta

22

R S T:=R>< S A B D D E F A B D E F s 1 4 5 1 5 d 1 5 1 5 d 1 5 1 2 4 c 2 5 1 5 c 2 5 3 6 7 s 3 3 6 7 s 3 3

U navedenom primjeru tablice R i S imaju zajednički atribut D, te se spajanje odvija po tom atributu. Prvi red tablice R ima vrijednost atributa D=4, te ne sudjeluje u vezi, jer u tablici S ne postoji red sa D=4. Drugi i treći red tablice R imaju vrijednost D=5, te se spajaju sa prvim redom u tablici S. Četvrti red tablice R preko vrijednosti D=3 povezuje se sa trećim redom tablice S, gdje takoñer imamo D=3. Left outer join- lijeva vanjska veza T:=R>>>><<<<LO S Lijeva vanjska veza je proširenje unutrašnje veze. Osnova za realizaciju lijeve vanjske veze je unutrašnja veza, kojoj se dodaju oni elementi tablice, koja je u relacijskom izrazu sa lijeve strane, koji ne sudjeluju u vezi. R S T:=R>< LOS

A B D D E F A B D E F s 1 4 5 1 5 d 1 5 1 5 d 1 5 1 2 4 c 2 5 1 5 c 2 5 3 6 7 s 3 3 6 7 s 3 3 s 1 4 null null

U prethodnom primjeru objašnjeno je nastajanje tablice R >< S. U stvaranju R>< LOS najprije se realizira R >< S (time se dobiju prva tri reda tablice T). Potom se dodaju svi redovi tablice R, koji ne sudjeluju u inner-join vezi. U ovom slučaju jedini red u tablici R koji nije obuhvaćen inner-join vezom je prvi red, a budući on ne sudjeluje u inner join-u vrijednosti atributa E i F su null vrijednosti. Right outer join- desna vanjska veza T:=R>>>><<<<RO S Desna vanjska veza je proširenje unutrašnje veze. Osnova za realizaciju desne vanjske veze je unutrašnja veza, kojoj se dodaju oni elementi tablice, koja je u relacijskom izrazu sa desne strane, koji ne sudjeluju u vezi. R S T:=R>< ROS

A B D D E F A B D E F s 1 4 5 1 5 d 1 5 1 5 d 1 5 1 2 4 c 2 5 1 5 c 2 5 3 6 7 s 3 3 6 7 s 3 3 null null 1 2 4

U prethodnom primjeru objašnjeno je nastajanje tablice R >< S. U stvaranju R>< ROS najprije se realizira R >< S (time se dobiju prva tri reda tablice T). Potom se dodaju svi redovi tablice S, koji ne sudjeluju u inner-join vezi. U ovom slučaju jedini red u tablici S koji nije obuhvaćen inner-join vezom je drugi red (D=1), a budući on ne sudjeluje u inner join-u vrijednosti atributa A i B su null vrijednosti. Outer join- vanjska veza T:=R>>>><<<<O S Vanjska veza je proširenje unutrašnje veze. Osnova za realizaciju lijeve vanjske veze je unutrašnja veza, kojoj se dodaju elementi obje tablice koji ne sudjeluju u unutrašnjoj vezi. R S T:=R>< OS

A B D D E F A B D E F s 1 4 5 1 5 d 1 5 1 5 d 1 5 1 2 4 c 2 5 1 5 c 2 5 3 6 7 s 3 3 6 7 s 3 3 null null 1 2 4 s 1 4 null null

Vrijedi T:=R>>>><<<<O S= (R>>>><<<<LO S) UUUU (R>>>><<<<RO S)

Page 24: BP VEST Skripta

23

Dijeljenje T:=R ÷÷÷÷ S Tablica T koja se dobije dijeljenjem R i S je najveća tablica za koju vrijedi da se svi redovi produkta T× S nalaze u tablici R.

R S T:=R÷S A B D A B D s 1 4 s 1 4 s 1 5 5 c 2 5

Prioritet logi čkih operatora 1. Projekcija 2. Selekcija 3. Produkt 4. Join, Dijeljenje 5. Razlika 6. Unija, Presjek LOGI ČKE OPERACIJE Logičke operacije često se primijenjuju u relacijskoj algebri, posebno kod primjene operacije selekcije tj. postavljanja složenih uvjeta za selekciju pojedinih redova iz tablice. Logički operatori su AND, OR i NOT. Operatori AND i OR su funkcije koje se primijenjuju nad dva argumenta, a funkcija NOT nad jednim argumentom.

AND T F OR T F NOT T T F T T T T F F F F F T F F T

MEðUZAVISNOST PRIRODNIH RELACIJSKIH OPERACIJA Za unutrašnju vezu (Inner join) vrijedi da se može izraziti kominacijom produkta, selekcije i projekcije. Pogledajmo primjer: R S

A B B C D 1 2 2 5 6 3 4 4 7 8 9 10 11

T:=R><S

A B C D 1 2 5 6 3 4 7 8

Page 25: BP VEST Skripta

24

Pogledajmo produkt ovih dvaju tablica C:=R × S

A R.B S.B C D 1 2 2 5 6 1 2 4 7 8 1 2 9 10 11 3 4 2 5 6 3 4 4 7 8 3 4 9 10 11

Operacija spajanja (inner-join) podrazumijeva samo one redove iz produkta gdje atributi istog naziva imaju iste vrijednosti. Dakle potrebno je primijeniti selekciju tj. izdvojiti one redove u kojima atributi istog naziva u obje tablice imaju istu vrijednost D:=C where R.B= S.B =(R×S) where R.B= S.B

A R.B S.B C D 1 2 2 5 6 3 4 4 7 8

Dobijena tablica D ima jedan atribut (kolonu) više u odnosu na tablicu koja je rezultat inner-join operacije. Izvršimo projekciju: T:=D[A,R.B,C,D]

A B C D 1 2 5 6 3 4 7 8

što je identično rezultatu inner-join operacije.

Page 26: BP VEST Skripta

25

PRIMJERI ZA VJEŽBU Primjeri: Neka su definirane tablice STUDENT, UPISNI LIST i MJESTO head(STUDENT)={Student_id,Ime,Prezime,Dat.roñenja, Mjesto_id,JMBG, Mat.broj} head(UPISNI_LIST)={Ulist_id,Šk.godina,Semestar,Obr.program,Student_id} head(MJESTO)={Mjesto_id,Ime_Mjesta,Pošt.broj} STUDENT Student id Ime Prezime Dat.roñenja Mjesto_id JMBG Mat. broj 1 Ante Rožić 11.10. 1980 3 1110980370071 11-7 2 Stipe Anić 03.07. 1980 1 0307980380025 12-7 3 .... .... .... ....

UPISNI_LIST Ulist id Šk.godina Semestar Obr.program Student_id

1 1999/00 2 Elektronika 2 2 1999/00 4 Strojarstvo 1 3 .... .... ....

MJESTO Mjesto id Ime_Mjesta Pošt.br

1 Split 21000 2 Šibenik 22000 3 Zadar 23000 4 ... ...

Vrijedi da je PK(STUDENT)=Student_id, PK(UPISNI_LIST)=Ulist_id, PK(MJESTO)=Mjesto_id , te STUDENT.Mjesto_id=FK(STUDENT), UPISNI_LIST.Student_id=FK(UPISNI_LIST) Zadatak 1. Prikazati sve studente (Ime, Prezime i Matični broj) koji su upisani u 1. semestar šk.god 1999/00 ((UPISNI_LIST where Šk.godina=’1999/00’ AND Semestar=1)[Student_id] >< STUDENT ) [Ime,Prezime, Mat.broj] Zadatak 2. Prikazati sve studente koji su roñeni u Splitu (MJESTO where Ime_Mjesta=’Split’ >< STUDENT ) [Ime,Prezime, Mat.broj] Zadatak 3. Prikazati sve studente koji nisu upisani u školskoj godini 2000/01. STUDENT - ((UPISNI_LIST where Šk.godina=’2000/01’)[Student_id] >< STUDENT) Zadatak 4. Prikazati sve studente koji nemaju niti jedan upisni list STUDENT – (UPISNI_LIST[Student_id] >< STUDENT) ili (STUDENT ><LO UPISNI_LIST) where Ulist_id=null Zadatak 5. Prikazati sve upisne listove za studenta sa Matičnim brojem 12-7 ((STUDENT where Mat.broj=’12-7’)[Student_id] >< UPISNI_LIST) [Semestar,Šk.godina,Obr.program]

Page 27: BP VEST Skripta

26

Zadana je baza podataka koja opisuje sustav studiranja:

Naći relacijske izraze za slijedeće upite: 1. Prikazati sve studente koji su u Šk.godini ‘2000/01’ upisali 1. sem Računarstva.

((OBR_PROG where OBR_PROG_IME=’Računarstvo’) >< (UPISNI_LIST where SEM=1 AND SK_GOD=’2000/01’))[STUDENT_ID] >< STUDENTI

2. Prikazati sve nastavnike koji ne predaju u školskoj godini ‘1999/00’ NASTAVNIK – NASTAVNIK >< (NASTAVNI_PLAN where SKGOD=’1999/00’) [NASTAVNIK_ID] ili ((NASTAVNIK ><LO NASTAVNI_PLAN where SKGOD=’1999/00’) where PREDMET_ID=null) [NASTAVNIK_ID,NASTAVNIK_PREZIME,NASTAVNIK_IME]

3. Prikazati izgled indeksa za 1.semestar Elektronike u školskoj godini 2000/01

((OBR_PROG where OBR_PROG_IME=’Elektronika’) >< NASTAVNI_PLAN where SKGOD=’2000/01’ AND SEM=1 >< PREDMETI>< NASTAVNIK) [NASTAVNIK_PREZIME,NASTAVNIK_IME, PREDMET_IME, SATI_pred, SATI_au_vj]

4. Prikazati sve studente koji su upisali, a nisu položili predmet ‘Baze podataka’ ((PREDMETI where PREDMET_IME=’Baze podataka’) >< UPISUJE where OCJENA=’null’) [ULIST_ID] >< UPISNI_LIST >< STUDENTI[STUDENT_ID,IME,PREZIME,MAT_BR]

5. Prikazati sve apsolvente koji imaju neki nepoloženi ispit

(UPISNI_LIST where APSOLVENT=1 >< STUDENTI ) [STUDENT_ID,IME,PREZIME,MAT_BR] I ((PREDMETI where USMENI=1 OR PISMENI=1)[PREDMET_ID] >< UPISUJE where OCJENA=’null’ >< UPISNI_LIST)[STUDENT_ID] >< STUDENTI [STUDENT_ID,IME,PREZIME,MAT_BR]

Page 28: BP VEST Skripta

27

7. INDEKSIRANJE BAZE PODATAKA

Podaci u bazi podataka (tablice i ostale strukture) moraju biti trajno smješteni na mediju koji omogućava sačuvanje podataka i njihovo normalno održavanje. Radna memorija računala, iako pruža mogućnost brzog i efikasnog pristupa podacima, ne može biti medij za trajni smještaj podataka. Prestankom napajanja ili pojavom sklopovskog (hardware) problema u funkcioniranju računala, dolazi do gubitka svih podataka u radnoj memoriji. Stoga se podaci smještaju na disku računala. Disk je rotirajući magnetski medij , uobičajeno sastavljen od nekoliko ploča (površina, platters), sa standardnom brzinom rotacije, i mehaničkom rukom – arm (slično principu gramofona). Na vrhu ruke nalaze se magnetske glave (heads) preko kojih se vrši učitavanje i zapisivanje podataka. Disk je sastavljen od niza traka (tracks), sektora (sector) i cilindara (cylinder) prema slici 14.

Slika 14. Struktura diska Za pristup odreñenom podatku na disku, potrebno je pristupiti točno odreñenoj poziciji. To znači da mehanička ruka mora najprije zauzeti položaj na odreñenom cilindru, a potom sačekati dok disk rotira da bi traženi sektor bio smješten ispod magnetske glave. Nakon smještaja glave nad traženim podacima, vrši se učitavanje podataka. Ukupni ciklus pristupa podacima na disku može se prikazati kroz tri faze: • Pozicioniranje ruke • Rotiranje diska • Transfer – učitavanje podataka u memoriju Vremenski gledano prve dvije faze su znatno trajnije i čine daleko najveći dio ukupnog vremenskog ciklusa pristupa podacima, što pristup podacima na disku ukupno čini razmjerno sporim, što čini glavni problem smještaja podataka na disku. Napretkom u razvoju računalnih komponenti razvijene su i radne memorije, koje omogućavaju pohranu podataka, nezavisno od vanjskog izvora napajanja (battery supply). Ovakve memorije, meñutim cijenom daleko nadmašuju disk. Za isti kapacitet memorije troškovi radne memorije su oko 60 puta veći od cijene diskovnog prostora. Ovo je posebno značajno kod baza podataka, gdje baratamo sa velikim količinama podataka. Dodatni problem bio bi prebacivanje podataka sa jednog računala na drugo i stvaranje rezervnih kopija (backup). Imajući sve ovo u vidu računalni disk ostaje kao jedini prikladni medij za pohranu podataka. Diskovni prostor za smještaj baze podataka podijeljen je na stranice (pages). Uobičajene veličine stranica su 2Kb (2048 byte) i 4Kb (4096 byte). Podaci iz tablice u bazi podataka smještaju su na stranice tvrdog diska u slotove. Broj slotova na pojedinoj stranici zavisi od veličine podatka u jednom redu tablice. Primjer: Ako je memorijska stranica veličine 2Kb, a za smještaj jednog reda tablice treba 128 byte-a, onda jedna stranica za smještaj podataka iz navedene tablice sadrži 16 slotova.

T f

Page 29: BP VEST Skripta

28

slot 1 slot 2 Page 1 ..... slot 16 slot 1 slot 2 Page 2 .... slot 16 Stranica (page) predstavlja osnovnu jedinicu za učitavanje podataka sa diska. Kako je prethodno opisano najveći dio vremena za učitavanje podataka čini smještaj magnetske glave na točno odreñenu poziciju, gdje se nalaze podaci. Stoga se pri učitavanju podataka, učitavaju čitave stranice kako bi se što više smanjila potreba za ponovnim pozicioniranjem glave. Uvoñenje indeksa u bazu podataka ima za osnovni cilj ubrzavanje pretraživanja, tj. smanjenje broja pristupa disku. Indeks definiran nad tablicom vezuje se za odreñeni atribut (kolonu ) u tablici. INDEX (Prezime) STUDENT Prezime (Key) D.P. id Ime Prezime JMBG Datum roñ. Bili ć P1 1 Marko Milić xxxxx Mili ć P2 2 Ante Bilić xxxxx Indeks za odreñeni atribut jest tablica sa dva stupca i jednakim brojem redova, kao i tablica nad kojom je indeks definiran. Prva kolona u indeksu je atribut za koji je indeks definiran i naziva se ključ indeksa (index key), a u drugoj koloni je disk pointer ( pokazivač na mjesto na disku na kojem se nalazi podatak sa odreñenom vrijednošću indeksnog ključa). Važna osobina indeksa je da je tablica indeksa uvijek striktno ureñena po vrijednostima ključa, bilo u rastućem redoslijedu (ascending) ili padajućem (descending). Koncept indeksiranja može se usporediti sa katalogizacijom knjiga u biblioteci. Za svaku knjigu postoji odgovarajuća kartica sa osnovnim podacima o knjizi i podatkom gdje je smještena. Pri tome može postojati nekoliko odvojenih kataloga, u jednom su knjige sortirane prema naslovu, u drugom prema imenu autora itd.Kad korisnik zatraži knjigu, npr. od željenog autora, potrebno je pogledati u katalog gdje su knjige sortirane po autoru, te se nañe pripadajuća kartica i pogleda u kojem je dijelu knjižnice ta knjiga. Prilikom pretraživanja podataka, ukoliko se podacima pristupa po vrijednostima atributa nad kojima postoji indeks, sustav ne pretražuje cijelu polaznu tablicu, već umjesto toga, pretražuje se tablica indeksa, koja je po veličini mnogo manja. Pri tome nije nužno pretražiti cijelu tablicu indeksa, već samo do zadane vrijednosti indeksnog ključa. Kada se u pretraživanju indeksa doñe do zadane vrijednosti indeksnog ključa i lociraju svi podaci, pretraživanje indeksa se završava, budući je indeks ureñen po vrijednostima ključa, pa ostatak tablice indeksa sigurno ne sadrži više podatke sa zadanom vrijednošću ključa. Za neke oblike pretraživanja čak nije ni potrebno pretraživati cijelu tablicu, već je dovoljno pretraživanje samo tablice indeksa, po vrijednostima ključa. Takvi upiti ispituju samo postojanje odreñenog podatka, te indeksiranje tablice po traženoj vrijednosti atributa, čini dovoljnim pretraživanje indeksa, bez pretraživanja osnovne tablice. Negativna strana indeksiranja ogleda se u činjenici da se smanjuje brzina ažuriranja i dodavanja novih podataka. Kod ovih operacija, uz promjene u samoj tablici, potrebno je promijeniti i tablicu indeksa. Višestruki indeksi predstavljaju indeksiranje bazne tablice po većem broju atributa. Indeksna tablica zadržava istu strukturu, tj. sastoji se od već opisanih kolona ključ indeksa(key) i pokazivač – disk pointer. Ključ indeksa složen je od vrijednosti svih atributa koji su uključeni u indeks. INDEX (Prezime,JMBG) STUDENT (Key) D.P. id Ime Prezime JMBG Datum roñ. Bili ć;2222 P1 1 Marko Milić 1111 Mili ć;1111 P2 2 Ante Bilić 2222

Page 30: BP VEST Skripta

29

Ovakvi indeksi pogodni su za pretraživanje po jednoj ili obadvije vrijednosti atributa. Pretraživanje po jednoj vrijednosti atributa identično je pretraživanju indeksa sa jednim atributom. Pretraživanje po više vrijednosti daje rezultat samo one vrijednosti gdje oba atributa zadovoljavaju tražene uvjete. CLUSTERED INDEKS Uobičajeni način popunjavanja tablice prilikom unosa novih redova podrazumijeva slijedno unošenje, tj. jedan red iza drugog, po redu. Uvoñenjem indeksa formira se indeksna tablica, koja sadržava podatke o položaju podataka u tablici prema indeksnom ključu, ali redoslijed podataka ostaje nepromijenjen. Pretraživanjem tablice indeksa dobije se podatak o smještaju traženih podataka, ali su oni u osnovnoj tablici raspršeni. Ukoliko se indeks definira svojstvom CLUSTERED, bitno se mijenja raspored podataka u osnovnoj tablici. CLUSTERED indeks podrazumijeva smještaj podataka u osnovnoj tablici u ureñenom redoslijedu prema vrijednostima ključa. INDEX (Prezime) STUDENT Prezime (Key) D.P. id Ime Prezime JMBG Datum roñ. Antić P1 1 Ivo Antić xxxxx Bili ć P2 2 Ante Bilić xxxxx Katić P3 3 Jure Katić Mili ć P4 4 Marko Milić

U jednoj tablici može postojati samo jedan CLUSTERED indeks. JEDINSTVENI INDEKS (UNIQUE INDEX) Definiranjem indeksa sa svojstvom jedinstvenosti (UNIQUE), odreñuje se da u indeksnoj tablici ne mogu postojati dvije iste vrijednosti indeksnog ključa, tj. ključ indeksa je jedinstven. Budući je ključ indeksa vrijednost atributa iz tablice, time se definira da u tablici ne mogu postojati dva redka sa istom vrijednošću atributa po kojoj se stvara indeks. Jedinstvenost indeksa, a time i atributa u tablici podrazumijeva da vrijednost atributa ne može biti null, tj. atribut po kojem se stvara jedinstveni indeks, mora imati minimalni kardinalitet 1. Za višestruke indekse, koji predstavljaju kombinaciju više atributa, jedinstveni indeks podrazumijeva jedinstvenost kombinacije atributa koji su obuhvaćeni indeksom. Npr. ukoliko se definira jedinstveni indeks na tablici STUDENT po atributima ime i prezime, to podrazumijeva da u tablici ne mogu postojati dva studenta koji imaju jednaka oba atributa (ime i prezime). KOMPRESIJA INDEKSA Osnovna struktura indeksa podrazumijeva postojanje jednog redka u tablici indeksa za svaki red u osnovnoj tablici. Ukoliko indeks nije jedinstven, moguće je postojanje većeg broja istih vrijednosti indeksnog ključa. Budući je u pravilu ključ indeksa podatak koji je duži od pokazivača , grupiranjem pokazivača po istim vrijednostima ključa postigla bi se znatna ušteda. U takvim slučajevima provodi se kompresija indeksa Prx key D.P. D.P. D.P Prx key D.P. D.P

Slika 15. Kompresija indeksa Svi indeksni podaci sa istim vrijednostima ključa grupiraju se u blokove koji su opisani zajedničkom vrijednošću ključa (Slika 15.). Na početku svakog bloka nalazi se tzv. Prefiks bloka (Prx), koji sadrži podatak o početku prethodnog i slijedećeg bloka (druge vrijednosti ključa), te broju vrijednosti tekućeg ključa (broju pokazivača u tekućem bloku). B-TREE STRUKTURA INDEX-a Indeks, koji je i sam po definiciji tablica, takoñer se nalazi smješten na disku računala, što znači da je smješten po memorijskim stranicama u slotovima. Primjer: Zadana je tablica sa milijun redova podataka, te indeks definiran nad cjelobrojim atributom u toj tablici. Jedan red u tablici indeksa sadržava vrijednost indeksnog ključa (integer – 4byte) i disk pointer (integer 4-byte). Dakle za svaku vrijednost indeksnog ključa 8 byte. Podrazumijevajući veličinu

Page 31: BP VEST Skripta

30

memorijske stranice (page) 2Kb, vrijedi da na jednu stranicu dolazi 2Kb:8byte=256 indeksnih redova. Dakle za smještaj milijun redova u tablici indeksa potrebno je 1.000.000: 256=3907 stranica. L1 L2 ..... L3907 key D.P. key D.P. key D.P. A1 P1 slot1 A257 P257 A2 P2 slot2 A258 P258 ... ... ... ... ... A256 P256 slot256 A512 L1-L3907...LEAF pages (Leaf stranice) na kojima su smješteni osnovni indeksi. Pri tome su vrijednosti ključa striktno ureñene po rastućem rasporedu tj. vrijedi Ak<Am, za svaki k<m. ROOT LEVEL key D.P. A1 D1 slot1 An D2 slot2 Ak D3 ... ... ... slot256

D1 D2 ..... D16 key D.P. key D.P. key D.P. A1 L1 slot1 An L257 Ak Lk A257 L2 slot2 ... ... A513 L3 ... ... ... ... ... slot256 ... ... L1 L2 ..... L3907 key D.P. key D.P. key D.P. A1 P1 slot1 A257 P257 A2 P2 slot2 A258 P258 ... ... ... ... ... A256 P256 slot256 A512

Slika 16. Indeksna struktura binarnog stabla (B-Tree) Radi ubrzavanja pristupa indeksima , koji zauzimanju 3907 memorijskih stranica, formira se viši nivo indeksnih stranica tzv. Directory Level, na način da se početni indeks sa svake leaf stranice uključi u nove stranice na Directory level, te služi kao pokazivač, za brži dolazak do odreñene vrijednosti indeksnog ključa. Na nivou direktorija, za smještaj 3907 indeksnih redova, potrebno je 3907:256=16 stranica. Radi daljnjeg ubrzavanja organizira se i najviši indeksni nivo, tzv.root level, po identičnom principu. Opisana struktura indeksa najčešće se koristi u suvremenim bazama podataka i naziva se B-TREE (binarno stablo) struktura (Slika 16). Primjer: Pronaći vrijednost indeksnog ključa A380. Pretraživanje počinje na root nivou. Budući vrijedi A1<A380<An, podatak o smještaju indeksa naći će se na directory level stranici D1. Slijedi prijelaz na D1, te pretraživanje vrijednosti ključa na toj stranici. Budući vrijedi A257<A380<A513, podaci o traženim indeksima nalaze se na Leaf stranici L2. Pretraživanjem leaf stranice L2 dolazi se do pokazivača, koji pokazuju položaj na disku gdje se nalaze traženi podaci, te se glava za učitavanje podataka vodi točno na utvrñeni položaj.

Page 32: BP VEST Skripta

31

8. NORMALIZACIJA BAZE PODATAKA

Normalizacija baze podataka predstavlja primjenu odreñenih matematičkih i formalnih pravila kojima se osigurava ispravno postavljanje modela podataka i njihova logička povezanost. Definicija: Funkcijska zavisnost atributa Za tablicu R koja sadrži atribute X i Y koji mogu biti i složeni vrijedi funkcijska zavisnost atributa Y o atributu X , tj. X→Y, ako je svaka pojedina vrijednost atributa X povezana sa samo jednom vrijednošću atributa Y. ILI Vrijedi X→Y ako u tablici R ne postoje dva reda sa istom vrijednošću atributa X, a različitim vrijednostima atributa Y. Primjer: A B C a 100 6 b 200 7 c 300 8 d 200 9 vrijedi A→B, A→C, C→A, C→B, B→A, B→C. Definirane su 4 normalne forme, koje sve tablice u bazi moraju zadovoljavati da bi struktura podataka bila ispravna. 1. NORMALNA FORMA Tablica se nalazi u 1. normalnoj formi ako su svi neključni atributi funkcijski ovisni o primarnom ključu. Ovo pravilo je jednostavno i proizlazi iz definicije primarnog ključa. Budući je primarni ključ jedinstven, tj. ne mogu se pojaviti dvije iste vrijednosti primarnog ključa u jednoj tablici, onda se podrazumijeva da su svi ostali atributi funkcijski ovisni o ključu. Baza podataka je u 1. normalnoj formi, ako su sve tablice u 1. normalnoj formi. Pravilo prve normalne forme naglašava transformacijsko pravilo prikaza viševrijednosnih atributa. Primjer: prikaz viševrijednosnog atributa sport za entitet STUDENT. head(STUDENT)={Student_id,Ime,Prezime,Dat.roñenja, Mj.roñenja,JMBG,Sport} card(Ime,STUDENT)=(1,1), card(Prezime,STUDENT)=(1,1), card(Dat.roñenja,STUDENT), card(Mj.roñenja,STUDENT)=(1,1), card(JMBG,STUDENT)=(1,1), card(Sport,STUDENT)=(0,n) STUDENT Student id Ime Prezime Dat.roñenja Mj. ro ñenja JMBG Sport 1 Ante Rožić 11.10. 1980 Osijek 1110980370071 - 2 Stipe Anić 03.07. 1980 Split 0307980380025 Odbojka 2 Stipe Anić 03.07. 1980 Split 0307980380025 Košarka 3 .... .... .... .... Navedeni prikaz u skladu je sa pravilom da nije dozvoljen unos više vrijednosti pojedinog atributa u jednom redku. Dobijena tablica nije u prvoj normalnoj formi, jer nije zadovoljeno pravilo da su svi neključni atributi funkcijski zavisni o ključu. U primjeru vrijedi Student_id → Sport. Posljedice ovakvog prikaza su razne anomalije, problemi koji se javljaju pri unosu i manipuliranju podacima. 1. Povrijeñena je jedinstvenost primarnog ključa 2. Anomalija unosa: za svaki sport kojim se bavi pojedini student, potrebno je ponovno unijeti

vrijednost svih atributa vezanih za tog studenta: Ime, Prezime, itd. 3. Anomalija ažuriranja/promjene podataka: Kod promjene vrijednosti nekog atributa potrebno je taj

atribut promijeniti u svim redovima.

Page 33: BP VEST Skripta

32

2. NORMALNA FORMA Tablica se nalazi u 2. normalnoj formi ako se nalazi u 1. normalnoj formi, i ako su svi neključni atributi potpuno funkcijski zavisni o ključu. Pravilo druge normalne forme vrijedi za složeni primarni ključ koji se sastoji od više atributa (kolona). Definicija: Potpuna funkcijska zavisnost atributa U tablici R koja sadrži atribute X i Y koji mogu biti i složeni, vrijedi da je Y potpuno funkcijski zavisan o atributu X , ako je Y funkcijski zavisan o X i nije funkcijski zavisan niti o jednom manjem podskupu atributa X. Drugim rječima, kada vrijedi X→Y, tada ne smije postojati niti jedan podskup Z (Z⊂X), za koji bi vrijedilo Z→Y. Pravilo druge normalne forme kazuje da ne smije postojati funkcijska zavisnost izmeñu neključnog atributa i podskupa primarnog ključa. Primjer: STUDENT Student id Ime Prezime Mj. ro ñenja JMBG 1 Ante Rožić Osijek 1110980370071 2 Stipe Anić Split 0307980380025 3 .... .... .... SPORT Student_id Sport Dat.roñenja 2 odbojka 03.07. 1980 2 košarka 03.07. 1980 ... ... ... Rješenje problema viševrijednosnog atributa sada je postavljeno u skladu sa transformacijskim pravilom, tj. atribut je prikazan novom tablicom u kojoj je primarni ključ složen od stranog ključa entiteta STUDENT i viševrijednosnog atributa, odnosno PK(SPORT)=(Student_id,Sport). Tablica sadrži i atribut Dat.roñenja. S obzirom da je datum roñenja vezan za studenta, neovisno o tome da li se bavi sportom ili ne vrijedi Student_id→Dat.roñenja, a Student_id je podskup primarnog ključa u tablici SPORT. Ovakva tablica dakle nije u drugoj normalnoj formi. Nepravilnosti koje prizlaze iz ovakvog prikaza: 1. Anomalija unosa: Ne može se unijeti datum roñenja za studenta koji se ne bavi sportom. 2. Anomalija promjene: Kod promjene datuma roñenja, potrebno je promijeniti taj podatak u svim

redovima koji su vezani za tog studenta 3. Anomalija brisanja: Brisanjem posljednjeg sporta kojim se student bavi, gubi se i podatak o

njegovom datumu roñenja. Problem se riješava da se atribut koji je funkcijski zavisan o podskupu primarnog ključa (student_id), prebacuje u drugu tablicu u kojoj je taj atribut-podskup primarni ključ, a to je u ovom slučaju tablica STUDENT. 3. NORMALNA FORMA Tablica se nalazi u 3. normalnoj formi ako se nalazi u 2. normalnoj formi, i ako niti jedan neključni atribut nije tranzitivno funkcijski zavisan o primarnom ključu. Definicija: Tranzitivna funkcijska zavisnost atributa U tablici R koja sadrži atribute X, Y i A , vrijedi da je A tranzitivno funkcijski zavisan o atributu X , ako je X→Y, Y→X, Y→A i A→Y. Simbolički tranzitivna zavisnost se prikazuje X→Y→A

Page 34: BP VEST Skripta

33

Primjer: STUDENT Student id Ime Prezime JMBG 1 Ante Rožić 1110980370071 2 Stipe Anić 0307980380025 3 .... .... UPISNI_LIST ulist_id student_id semestar šk.godina obr.program Mj.ro ñenja 1 1 1 1999/00 Elektronika Osijek 2 1 2 1999/00 Elektronika Osijek vrijedi ulist_id→student_id ( svaki upisni list vezan je samo za jednog studenta) student_id→ulist_id ( jedan student ima više upisnih listova) student_id →Mj.roñenja (student je roñen u jednom odreñenom mjestu) Mj.roñenja→student_id (u jednom mjestu može biti roñeno više studenata) Budući vrijedi ulist_id→student_id →Mj.roñenja, atribut mjesto roñenja je tranzitivno(posredno) funkcijski zavisan o primarnom ključu tablice (ulist_id). Ovakva tablica dakle nije u trećoj normalnoj formi. Nepravilnosti koje proizlaze iz ovakve strukture podataka: 1. Anomalija unosa: Nije moguće unijeti mjesto roñenja za pojedinog studenta, dok se ne unese njegov

upisni list. 2. Anomalija promjene /ažuriranja: Kod promjene mjesta roñenja pojedinog studenta, taj podatak treba

mijenjati u svim upisnim listovima, koji su vezani za tog studenta. 3. Anomalija brisanja: Brisanjem upisnog lista briše se podatak o mjestu roñenja Problem svoñenja tablice na treću normalnu formu rješava se na način da se atribut koji je tranzitivno zavisan o ključu, preseli u tablicu, u kojoj je atribut koji posreduje u tranzitivnoj vezi (u ovom slučaju student_id) primarni ključ. STUDENT Student id Ime Prezime Mj. ro ñenja JMBG 1 Ante Rožić Osijek 1110980370071 2 Stipe Anić Split 0307980380025 3 .... .... .... UPISNI_LIST ulist_id student_id semestar šk.godina obr.program 1 1 1 1999/00 Elektronika 2 1 2 1999/00 Elektronika BOYCE-CODDOVA NORMALNA FORMA (BCNF) Definicija: Determinant je atribut o kojem je neki atribut potp uno funkcijski zavisan. Tablica se nalazi u BCN formi ako svaki determinant ima jedinstvenu vrijednost u cijeloj tablici. Primjer 2: Tablice STUDENT i MJESTO. Vrijedi da je PK(STUDENT)=Student_id, PK(MJESTO)=Mjesto_ID=FK(STUDENT)

Page 35: BP VEST Skripta

34

MJESTO Mjesto_ID IME MJESTA OPĆINA DRŽAVA 1 Split Split Hrvatska 2 Smokvica Pag Hrvatska 3 Smokvica Smokvica Hrvatska 4 Osijek Osijek Hrvatska 5 Bonn - Njemačka

STUDENT Student id Ime Prezime Dat.roñenja Mjesto_ID Pošt.broj 1 Ante Rožić 11.10. 1980 4 31000 2 Stipe Anić 03.07. 1980 1 21000 3 .... .... .... ....

Za tablicu STUDENT vrijedi Student_id→Mjesto_ID , Mjesto_ID →Pošt.broj, Mjesto_ID →Student_id, Pošt.broj → Mjesto_ID Atribut Mjesto_Id je determinant jer je atribut Pošt.broj potpuno funkcijski zavisan o oznaci mjesta (Mjesto_id). U tablici se ne mogu pojaviti dva reda sa istom vrijednošću Mjesto_id, a različitom vrijednošću atributa Pošt.broj. Dakle Mjesto_ID jest determinant, ali nije jedinstven, tj. u tablici se mogu pojaviti studenti koji su roñeni u istom mjestu, tj. u raznim redovima može se pojaviti ista vrijednost atributa Mjesto_ID. Tablica dakle nije u BCN formi. Nepravilnosti koje proizlaze iz ovakve strukture podataka: 1. Anomalija unosa: Nije moguće unijeti poštanski broj za mjesto dok god nije unešen prvi student koji

je roñen u tom mjestu. 2. Anomalija promjene: Ako se promijeni poštanski broj pojedinog mjesta, treba promijeniti sve zapise

koji pripadaju studentima roñenim u tom mjestu 3. Anomalija brisanja: Ako se iz tablice ukloni zadnji student koji je roñen u nekom mjestu, gubi se

podatak o poštanskom broju Problem svoñenja tablice na BCN formu rješava se na način da se atribut koji je potpuno funkcijski zavisan o determinantu koji nije jedinstven, preseli u tablicu, u kojoj je taj determinant (u ovom slučaju Mjesto_ID) primarni ključ. U gornjem primjeru to znači da se atribut Pošt.broj preseli u tablicu u kojoj je primarni ključ atribut Mjesto_ID. MJESTO Mjesto_ID IME MJESTA POŠT. BROJ OPĆINA DRŽAVA 1 Split 21000 Split Hrvatska 2 Smokvica 23249 Pag Hrvatska 3 Smokvica 20272 Smokvica Hrvatska 4 Osijek 31000 Osijek Hrvatska 5 Bonn - - Njemačka

STUDENT Student id Ime Prezime Dat.roñenja Mjesto_ID 1 Ante Rožić 11.10. 1980 4 2 Stipe Anić 03.07. 1980 1 3 .... .... .... ....

4. NORMALNA FORMA Tablica se nalazi u 4. normalnoj formi ako i samo ako vrijedi da postojanje višeznačne zavisnosti atributa A→→→→> B povlači za sobom postojanje funkcijske ovisnosti svih atributa u toj tablici o atributu A.

Page 36: BP VEST Skripta

35

Definicija: Višeznačna zavisnost atributa U tablici R koja sadrži atribute A,B i C , vrijedi da je B višeznačno zavisan o atributu A , ako vrijedi: za svaki B koji odgovara vrijednostima atributa A i C, B je ovisan samo o A, ali ne i o C. Primjer: Tablica predavanja Predavač Predmet Poglavlje Ili ć Fizika Optika Ili ć Fizika Mehanika Ili ć Fizika Toplina Matić Fizika Optika Matić Fizika Mehanika Matić Fizika Toplina U tablici se bilježe predmeti, predavači i poglavlja koja se predaju za pojedine predmete. Vrijedi: Predmet→>Poglavlje, budući da je sadržaj predmeta vezan isključivo za predmet, a ne zavisi od toga koji nastavnik predaje taj predmet. Da bi tablica bila u 4. normalnoj formi treba vrijediti Predmet→Predavač, što ovdje ne vrijedi budući za jedan isti predmet postoji više predavača. Tablica se svodi na 4. normalnu formu rastavljanjem postojeće tablice na dvije nove Predavač Predmet Predmet Poglavlje Ili ć Fizika Fizika Optika Matić Fizika Fizika Mehanika Fizika Toplina Svoñenje tablica na zadane normalne forme, često zahtjeva rastavljanje postojećih tablica (dekompoziciju). Pri dekompoziciji tablica, mora vrijediti da se postupkom razdvajanja tablica ne izgubi niti jedna informacija, niti se pojave informacije koje ne postoje u polaznoj tablici. U tu svrhu postoje dva pravila: a) Svaka funkcijska zavisnost tablice T može biti logički izvedena iz funkcijskih zavisnosti u tablicama

R i S, koje nastanu dekompozicijom tablice T. b) Zajednički atribut tablica R i S mora biti ključ u barem jednoj od tih tablica. Primjer: STUDENT1 Student id Sport Ime Prezime Mjesto_id Ime_mjesta Pošt.broj JMBG 1 odbojka Ante Rožić 4 Osijek 31000 1110980370071 2 nogomet Stipe Anić 1 Split 21000 0307980380025 1 košarka Ante Rožić 4 Osijek 31000 1110980370071 3 .... .... .... PK(STUDENT1) =(Student_id,Sport) Ovako formirana tablica ne zadovoljava 2NF, budući su neki atributi funkcijski zavisni o podskupu primarnog ključa Vrijedi: Student_id→Ime, Student_id→Prezime, Student_id→Mjesto_id itd. U skladu sa opisanim načinom rješavanja 2NF, sve atribute koji su funkcijski zavisni o nekom atributu koji je podskup primarnog ključa treba prebaciti u tablicu u kojoj je taj atribut primarni ključ. Dakle treba formirati novu tablicu u kojoj je primarni ključ atribut Student_id, u koju se zatim projiciraju svi atributi koji su funkcijski zavisni o Student_id (Ime,Prezime, Mjesto_id, Ime_mjesta, Pošt.broj, JMBG). STUDENT Student id Ime Prezime Mjesto_id Ime_mjesta Pošt.broj JMBG 1 Ante Rožić 4 Osijek 31000 1110980370071 2 Stipe Anić 1 Split 21000 0307980380025 3 .... .... ....

Page 37: BP VEST Skripta

36

SPORT Student id Sport 1 odbojka 2 nogomet 1 košarka 3 Dakle polazna tablica rastavljena je u dvije tablice, koje su sada u 2NF. Meñutim tablica STUDENT nije u 3NF, budući unutar nje postoji tranzitivna zavisnost pojedinih atributa o primarnom ključu. Vrijedi Student_id→Mjesto_id→Ime_mjesta. Razrješavanje tranzitivne zavisnosti podrazumijeva formiranje nove tablice u kojoj je atribut koji posreduje u funkcijskoj zavisnosti (Mjesto_id) primarni ključ STUDENT Student id Ime Prezime Mjesto_id Pošt.broj JMBG 1 Ante Rožić 4 31000 1110980370071 2 Stipe Anić 1 21000 0307980380025 3 .... .... MJESTO Mjesto_ID Ime_mjesta 1. Split 2. Smokvica 3. Smokvica 4 Osijek 5. Bonn

Sada je tablica STUDENT u 3NF, ali ne zadovoljava BCN formu, zbog toga što je atribut Mjesto_ID determinant s obzirom na atribut Pošt.broj, ali nema jedinstvenu vrijednost u cijeloj tablici. Razrješavanjem ove BCN forme dobijemo konačnu strukturu tablica STUDENT Student id Ime Prezime Mjesto_id JMBG 1 Ante Rožić 4 1110980370071 2 Stipe Anić 1 0307980380025 3 .... ....

MJESTO Mjesto_ID Ime_mjesta Pošt.broj 1 Split 21000 2. Smokvica .... 3. Smokvica. .... 4 Osijek 31000 5. Bonn -

Page 38: BP VEST Skripta

37

9. SQL JEZIK – JEZIK BAZA PODATAKA SQL jezik (Structured Query Language – strukturni jezik za pretraživanje) jest srce relacijske tehnologije. Razvoj SQL-a kao jezika za manipulaciju podacima tekao je usporedo s razvojem relacijskog modela podataka, osnove kojeg je postavio 1971. godine E.F.Codd. Kada je Codd postavio svoj koncept relacijskog modela podataka, ustvrdio je da “... usvajanje relacijskog modela podataka... dopušta razvoj univerzalnog jezika podataka baziranog na primjeni relacijske algebre”. Iako je odmah uočio zahtjeve koje bi takav jezik trebao ispunjavati, kao i njegove prednosti pri manipulaciji podacima, tada nije pokušao razviti takav jezik u praksi. S obzirom na brzinu kojom se prihvaćaju nove ideje u informatici, razvoj SQL-a tekao je razmjerno sporo. Tek 1974. godine pojavljuje se članak autora D.D. Chamberlaina i R.F. Boycea u kojem oni opisuju strukturni jezik za pretraživanje podataka, nazvan SEQUEL. Godine 1975. Boyce, Chamberlain i Hammer predstavljaju koncept jezika SQUARE koji je koristio matematičke izraze, za razliku od engleskih termina koje je koristio SEQUEL. Oba jezika su bila relacijski potpuna prema kriteriju koji je postavio E.F.Codd. Uskoro SQUARE mijenja ime u SEQUEL2, i taj jezik je korišten u razvoju prvog prototipa relacijskog sustava za upravljanje bazama podataka , nazvanog “SystemR”, razvijenog u IBM-u. Kasnije jezik mijenja ime u “SQL”. SQL je standardiziran po ISO ( International Standardization Organization) i ANSI (American National Standards Institute). Svi sustavi za upravljanje bazama podataka, kako oni najmanji na PC platformama, tako i veliki client-server sustavi, nastoje što je moguće više slijediti originalni standard SQL-a, ali ga i obogaćuju raznim dodatnim opcijama.

Page 39: BP VEST Skripta

38

9.1. TIPOVI PODATAKA Prilikom definiranja podataka u relacijskim sustavima, za sva svojstva entiteta (atribute), potrebno je definirati tip podataka, kao ključni segmenat odreñivanja domene nad kojom su definirani pojedini atributi. Tipovi podataka (format) mogu se podijeliti u 4 ključne kategorije • znakovni tipovi podataka • binarni podaci • numerički tipovi podataka • podaci formata datum- vrijeme ZNAKOVNI TIPOVI PODATAKA Character Char (n) – string duljine točno n znakova. Svaki znak prikazuje se jednim bajtom. Znakovi mogu biti alfanumerički i specijalni. Duljina znaka je uvijek n bajtova, bez obzira na veličinu podatka koji se unosi, a maksimalan broj znakova je 255. Ako je stvarna duljina unesenog stringa manja od n, sustav dodaje prazne znakove do duljine n. Primjer: Ako je n=6, a uneseni string ‘ABC’ , on se u memoriji pohranjuje kao ‘ABC###’, tj. uvijek fiksne duljine n=6. Pridjeljuje se alfanumeričkim atributima, za koje se pretpostavlja da su približno iste duljine. Character varying Varchar (n) – string promjenive duljine, maksimalno n karaktera. Pri tome maksimalna duljina zavisi od mogućnosti procesora i operativnog sustava, a najčešće iznosi 255. Pri unosu podataka, duljina stringa nije fiksna već je odreñena veličinom podatka. Primjer: Ako je n=25, a uneseni podatak ‘Ivo’, bilježi se duljine 4 bajta kao ‘Ivo3’, pri čemu zadnji bajt 3 označava stvarnu duljinu stringa. Format varchar pridjeljuje se alfanumeričkim atributima promjenjive duljine. Text Text - String neograničene veličine. BINARNI PODACI Bit Bit– podatak koji predstavlja binarnu vrijednost ( 1 ili 0). Veličina rezerviranog memorijskog prostora je 1 bajt. Ukoliko se bit tipu podataka pokuša pridjeliti cjelobrojna vrijednost, ona se interpretira kao 1. NUMERI ČKI TIPOVI PODATAKA Binary(n) Sadržava maksimalno 255 bajta binarnih podataka, te se koristi za spremanje binarnih i heksadecimalnih vrijednosti.

INTEGER – int cjelobrojni format s predznakom ili bez njega. Zauzima 4 bajta i sadržava cijele brojeve od -2 31 (-2,147,483,648) do (2 31 – 1) (2,147,483,647).

Page 40: BP VEST Skripta

39

SMALL INTEGER - smallint cjelobrojni format s predznakom ili bez njega. Zauzima 2 bajta i sadržava cijele brojeve od -215 (-32,768) do (215-1) (32,767).

TINY INTEGER (BYTE) - tinyint cjelobrojni format koji prikazuje brojeve od 0 do 255. Zauzima 1 bajt.

NUMERIC - numeric(p,q) decimalni broj, ukupno p znamenki i predznak, q znamenki iza decimalnog zareza. DECIMAL - decimal(p,q)

decimalni broj, koji se interno bilježi sa m znamenki, pri čemu vrijedi 0<p<q<m. Decimal (7,2) dopušta unos broja koji ima točno dvije znamenke iza decimalnog zareza, a ukupan broj znamenaka mu je najmanje 7. Stvarni broj znamenaka koji se rezervira za interni prikaz u bazi zavisi od operacijskog sustava. FLOAT – Float(n) Realni broj u formatu pomičnog zareza (floating point). Zauzima 4 bajta memorije. DOUBLE – Double(n) Realni broj dvostruke preciznosti u formatu pomičnog zareza (floating point). Zauzima 8 bajta memorije.

DATUM I VRIJEME FORMAT

Datum i vrijeme sastavljeni su od alfanumeričkih podataka koji predstavljaju podatke o datumu i vremenu. Uobičajeni format prikaza je "dan-mjesec-godina sat:minut: sekunda AM"

datetime Je tip podatka koji je predstavljen sa 8 bajtova ili dva 4-bajtna cjela broja: 4 bajta za prikaz datuma i 4 bajta za prikaz vremena (sati). Moguće je prikazati datume od 1. siječnja 1753 do 31. prosinca 9999, sa točnošću od 3.33 millisekunde.

smalldatetime – skraćeni format datum- vrijeme Je tip podatka koji je predstavljen sa 4 bajta: 2 bajta za prikaz datuma i 2 bajta za prikaz vremena (sati). Moguće je prikazati datume od 1. siječnja 1900 do 6. lipnja 2079, sa točnošću od minute.

Page 41: BP VEST Skripta

40

9.2. FORMIRANJE TABLICE

Prilikom definiranja tablice (entiteta) potrebno je definirati sve atribute (kolone) kao i ograničenja vezana za integritet podataka i referencijalni integritet.

Za formiranje tablice koristi se SQL instrukcija CREATE TABLE , koja ima sintaksu oblika

CREATE TABLE ime_tablice ( naziv_kolone1 | svojstva | column_constraint ,

naziv_kolone2 | svojstva | column_constraint,

....,

table constraints )

ime_tablice Ime svake tablice mora biti jedinstveno u bazi podataka. Dužina naziva tablice može imati maksimalno 128 znakova.

naziv_kolone

Predstavlja naziv pojedinačne kolone u tablici. Naziv pojedine kolone mora biti jedinstven u tablici.

svojstva

Odreñuju tip podataka, null vrijednosti, identity – svojstvo za kolonu.

IDENTITY [(seed, increment)] Generira inkrementalnu vrijednost za svaki novi red podataka u tablici na osnovu seed i increment parametara. Ako je navedena, seed vrijednost označava početak brojača i bit će dodijeljena prvom redu u tablici, a svaki slijedeći red dobit će jedinstvenu identity vrijednost, koja je jednaka posljednjoj identity vrijednosti uvećanoj za vrijednost parametra increment. Ako vrijednosti seed i increment nisu navedene smatra se da je njihova vrijednost 1. Pridjeljivanje IDENTITY svojstva koloni podrazumijeva njezino svojstvo NOT NULL. Samo jedna kolona u tablici može biti definirana sa svojstvom identity. Svojstvo identity može se dodijeliti onoj koloni koja je definirana kao numerički tip podataka.

NULL | NOT NULL Svojstvo nuliranja kolone, koje odreñuje da li je navedena kolona može sadržavati null vrijednosti. Ukoliko se u definiciji kolone ovo svojstvo ne navede izričito, smatra se NULL.

CONSTRAINT ime_ograničenja

Constraint – ograničenje, definira ograničenja i dodatna relacijska svojstva unutar tablice. Ako ime_ograničenja nije navedeno u naredbi CREATE TABLE , sistem sam generira naziv za pojedina ograničenja. Ako se zahtjevi na pojedina ograničenja promijene, ograničenje se uklanja, te potom kreira novo. Pri tome je bitno razlikovati postavljanje ograničenja na pojedine kolone, od postavljanja ograničenja na nivou tablice (table constraints). Ukoliko su ograničenja vezana za pojedinu kolonu ona se pri definiranje tablice navode u definiciji kolone. Ako se radi o ograničenjima koja obuhvaćaju više kolona (npr. složeni primarni ključ), njih je potrebno definirati kao ograničenja na nivou tablice, nakon što su definirane sve kolone u tablici.

Page 42: BP VEST Skripta

41

PRIMARY KEY [CLUSTERED | NONCLUSTERED] (col_1 , col_2 ,..., col_n) Osigurava integritet i jedinstvenost podataka u odreñenom atributu (koloni), gdje su col_1, ..., col_n kolone (atributi) koje čine primarni ključ. Sve kolone koje čine primarni ključ moraju imati svojstvo NOT NULL. Ako to nije posebno navedeno, sustav sam postavlja NOT NULL, za sve kolone koje čine primarni ključ tablice. Ukoliko se ograničenje primarnog ključa definira na nivou kolone, lista kolona se izostavlja. Za osiguranje jedinstvenosti primarnog ključa, SQL automatski formira jedinstveni (unique) index na zadane kolone. Unutar tablice može postojati samo jedan primarni ključ.

UNIQUE [CLUSTERED | NONCLUSTERED] (col_1 , col_2 ,..., col_n)

Osigurava jedinstvenost podataka u navedenim kolonama), gdje su col_1, ..., col_n kolone (atributi) obuhvaćene ograničenjem. Ukoliko se ograničenje jedinstvenosti definira na nivou kolone, lista kolona se izostavlja.Unutar tablice može se definirati više UNIQUE ograničenja. SQL sustav automatski stvara jedinstveni(unique) index za kolonu ograničenu UNIQUE. Za kolonu koja se definira sa ograničenjem UNIQUE, sistem automatski postavlja svojstvo NOT NULL.

FOREIGN KEY (col_1 , .., col_16) REFERENCES ime_tablice (ref_col_1, .., ref_col_16) Definira referencijalni integritet – vezu stranog ključa. Broj kolona i tip podataka u svakoj koloni koja se navodi u FOREIGN KEY col_n izrazu mora se poklapati sa onima navedenim u REFERENCES dijelu ref_col_n. Svaka vrijednost podataka koja se unosi u kolonu stranog ključa mora postojati u tablici na koju se taj strani ključ odnosi.

DEFAULT konstanta | izraz Odreñuje uobičajenu vrijednost (default) za kolonu, kada se prilikom unosa podataka u tablicu ne navede vrijednost za taj atribut. DEFAULT constraint može se primijeniti na kolone bilo kojeg tipa podataka, osim one kolone kojoj je dodijeljeno IDENTITY svojstvo.

CHECK (expression)

Ograničava moguće vrijednosti koje se unose u pojedine kolone tablice.

Definirajmo tablice iz baze podataka koja opisuje studiranje: CREATE TABLE mjesto ( mjesto_id int IDENTITY CONSTRAINT PK_MJESTO PRIMARY KEY, ime_mjesta varchar(30) NOT NULL, post_br int NULL, drzava varchar(25) NOT NULL ) CREATE TABLE student ( student_id int IDENTITY

CONSTRAINT PK_STUDENT PRIMARY KEY, ime varchar(20) NOT NULL, prezime varchar(30) NOT NULL, jmbg char(13), ime_oca varchar(20), dat_roñenja smalldatetime NOT NULL, mjesto_rod int NOT NULL

CONSTRAINT FK_MJESTO_ST FOREIGN KEY REFERENCES mjesto(mjesto_id), dat_upisa smalldatetime NOT NULL DEFAULT getdate()

)

Page 43: BP VEST Skripta

42

CREATE TABLE upisni_list ( ulist_id int IDENTITY

CONSTRAINT PK_UPISNI PRIMARY KEY, student_id int NOT NULL

CONSTRAINT FK_ST_UPIS FOREIGN KEY REFERENCES student(student_id), sem tinyint NOT NULL, sk_god varchar(8) NOT NULL,

obr_prog_id int NOT NULL CONSTRAINT FK_OBR_UPIS FOREIGN KEY REFERENCES obr_prog(obr_prog_id), CONSTRAINT CHK_SEM CHECK (sem>0 AND sem<6)

) CREATE TABLE predmet ( predmet_id int IDENTITY, ime_predmeta varchar(25) NOT NULL,

sati_pred tinyint NOT NULL, sati_au_vj tinyint NOT NULL DEFAULT 0,

sati_lab_vj tinyint NOT NULL DEFAULT 0, CONSTRAINT PK_PREDMET PRIMARY KEY(predmet_id)

)

CREATE TABLE upisuje ( ulist_id int

CONSTRAINT FK_UPISNI_UPISUJE FOREIGN KEY REFERENCES upisni_list(ulist_id), predmet_id int CONSTRAINT FK_PREDM_UPISUJE FOREIGN KEY REFERENCES predmet(predmet_id), testiran bit NOT NULL DEFAULT 0, ocjena tinyint, datum_polag smalldatetime, CONSTRAINT PK_UPISUJE PRIMARY KEY (ulist_id,predmet_id)

) Na ovim primjerima vidljive su razlike u definiranju ograničenja (constraints) na nivou kolone (column constraints) ili na nivou tablice (table constraints). Kod deklariranja tablice student, primarni ključ čini jedna kolona (student_id), te je ograničenje primarnog ključa (PRIMARY KEY) moguće primijeniti u sklopu definicije kolone koja čini primarni ključ (student_id). Sa druge strane tablica upisuje je relacijska tablica koja je nastala kao posljedica relacije više-na-više izmeñu entiteta upisni_list i predmet. Takva tablica ima složeni primarni ključ koji je sastavljen od stranih ključeva entiteta koji se nalaze u relacijskoj vezi (ulist_id i predmet_id). Stoga ograničenje primarnog ključa nije moguće prikazati u sklopu deklaracije jedne kolone, već se mora primijeniti ograničenje na nivou tablice.

9.3. PROMJENE STRUKTURE TABLICE Promjene na već formiranoj tablici obavljaju se naredbom ALTER TABLE

Dodavanje kolona ili ograničenja (constraints) u tablicu ALTER TABLE ime_tablice

ADD naziv_kolone| svojstva| constraints, naziv_kolone| svojstva| constraints

Page 44: BP VEST Skripta

43

Primjer:

ALTER TABLE student ADD CONSTRAINT UQ_JMBG UNIQUE (jmbg)

ALTER TABLE mjesto ADD CONSTRAINT DF_DRZAVA DEFAULT ‘Hrvatska’ FOR drzava

ALTER TABLE student ADD spol char (1) NOT NULL CONSTRAINT CK_SPOL check (spol=’M’ OR spol=’Ž’)

Brisanje kolona ili ograničenja (constraints) iz tablice

ALTER TABLE ime_tablice

DROP COLUMN naziv_kolone, CONSTRAINT naziv_ograničenja

Primjer:

ALTER TABLE student DROP COLUMN ime_oca

Promjene svojstava postojećih kolona u tablici

ALTER TABLE ime_tablice ALTER COLUMN naziv_kolone| svojstva

Primjer:

ALTER TABLE student ALTER COLUMN prezime varchar(20) NOT NULL

Promjene na nekoj već formiranoj tablici, kako je navedeno obavljaju se naredbom ALTER TABLE. Meñutim ovaj oblik promjena podliježe odreñenim pravilima.

Dodavanje novih kolona Dodavanje novih kolona može se slobodno realizirati dok je tablica prazna, te ne sadrži podatke. Meñutim ako tablica već sadrži neke podatke, svaki od već postojećih redova u tablici proširuje se sa novom kolonom, za koju prethodno nije definirana njegova vrijednost. U ovakvim slučajevima, moguća su dva rješenja : 1. Kolona koja se dodaje u tablicu treba se definirati sa svojstvom NULL. Na taj način svim već

postojećim redovima dodaje se nova kolona, a vrijednosti u toj koloni za svaki redak u tablici bit će null.

2. Ako se kolona ne želi definirati sa svojstvom null, za nju je potrebno navesti default vrijednost. U takvim slučajevima svi postojeći redovi u novostvorenoj koloni poprimaju vrijednost koja je odreñena kao default.

Primjer:

ALTER TABLE student ADD ime_majke varchar (20) ili ALTER TABLE student ADD ime_majke varchar (20) NOT NULL DEFAULT ‘Nije poznato’ Dodavanje novih ograničenja Kod dodavanja novih ograničenja treba voditi računa da svako ograničenje počinje važiti od trenutka kada je definirano. Ukoliko se nekoj tablici, koja već sadrži odreñene podatke (odreñeni broj redova) želi dodati ograničenje tipa CHECK ili FOREIGN KEY, potrebno je definirati kako se novo ograničenje odnosi prema već postojećim podacima.

Page 45: BP VEST Skripta

44

Neka je tablica upisni_list definirana kao: CREATE TABLE upisni_list ( ulist_id int IDENTITY

CONSTRAINT PK_UPISNI PRIMARY KEY, student_id int NOT NULL

CONSTRAINT FK_ST_UPIS FOREIGN KEY REFERENCES student(student_id), sem tinyint NOT NULL, sk_god varchar(8) NOT NULL,

obr_prog_id int NOT NULL CONSTRAINT FK_OBR_UPIS FOREIGN KEY REFERENCES obr_prog(obr_prog_id)

) Pretpostavimo da su u tablicu uneseni neki upisni listovi, nakon čega primjenimo ograničenje na vrijednosti semestra izrazom ALTER TABLE upisni_list ADD CONSTRAINT CHK_SEM CHECK (sem>0 AND sem<6) Novopostavljeno ograničenje vrijedit će za sve podatke koji se unesu nakon što je ograničenje definirano, ali je pitanje kako se odnosi prema onim redovima u tablici koji su prethodno unešeni. Djelovanje novog ograničenja na već postojeće podatke odreñuje se opcijama WITH CHECK i WITH NOCHECK. Ako se ograničenje definira sa opcijom WITH CHECK, automatski će biti provjereni i svi prethodno uneseni podaci da li zadovoljavaju pravilo. Primjenom opcije WITH NOCHECK, novo ograničenje primjenit će se samo na one podatke koji se unesu nakon ograničenja, bez provjere prethodno unešenih podataka. ALTER TABLE upisni_list WITH CHECK ADD CONSTRAINT CHK_SEM CHECK (sem>0 AND sem<6) Brisanje postojećih kolona Brisanje postojećih kolona u tablici primjenom instrukcije ALTER TABLE DROP može se primijeniti samo na one kolone koje ne podliježu nikakvim ograničenjima. Drugim rječima, nije moguće ukloniti kolone - koje čine primarni ključ ili dio primarnog ključa - koje predstavljaju strani ključ - koje su vezane ograničenjem tipa CHECK - jedinstvene kolone (UNIQUE) - kolone koje imaju odreñenu default vrijednost. - kolone po kojima postoji indeks. Za uklanjanje ovakvih kolona, potrebno je prethodno izbrisati sva ograničenja vezana za te kolone. Promjena svojstava postojećih kolona Promjena svojstava neke od postojećih kolona vrši se instrukcijom oblika ALTER TABLE ime_tablice ALTER COLUMN naziv_kolone| svojstva Na tablici je moguće promijeniti samo svojstva kolone, a ne i pojedina ograničenja. Kod promjene pojedinih ograničenja, potrebno je najprije ukloniti postojeće ograničenje, a nakon toga definirati novo. Stoga je instrukcijom ALTER TABLE moguće samo mijenjanje svojstava vezanih za pojedinu kolonu (tip podataka i null |not null svojstvo). Primjenom ove instrukcije nije moguće promijeniti svojstva kolona: - koje čine primarni ključ ili dio primarnog ključa - koje predstavljaju strani ključ - koje su vezane ograničenjem tipa CHECK ili UNIQUE. Jedina promjena koja se može izvršiti jest

ako su te kolone definirane kao niz znakova varchar, dozvoljeno je mijenjanje duljine niza. - kolone po kojima postoji indeks.

Page 46: BP VEST Skripta

45

BRISANJE TABLICE Tablica se briše naredbom DROP TABLE ime_tablice

9.4. INDEKSI Za formiranje indeksa koristi se instrukcija CREATE INDEX oblika: CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX ime_indeksa ON ime_tablice(kolona_1,..kolona_n) UNIQUE – definira jedinstveni indeks CLUSTERED | NONCLUSTERED – odreñuje clustered indeks. Ukoliko se ovaj podatak ne navede indeks se smatra NONCLUSTERED

Npr: CREATE UNIQUE INDEX IX_JMBG ON student(JMBG)

Brisanje indeksa vrši se instrukcijom oblika: DROP INDEX ime_tablice.ime_indeksa

Page 47: BP VEST Skripta

46

9.5. UNOS PODATAKA Za unos podataka u tablicu koristi se SQL izraz oblika INSERT [INTO] ime_tablice (kolone) VALUES (vrijednosti)

INTO Opcijska ključna riječ, može se navesti, ali nije obavezno. ime_tablice Opisuje tablicu u koju se unose podaci. Tablica prethodno mora biti definirana naredbom CREATE TABLE kolone Lista kolona u koje se unose vrijednosti. Kolone se mogu navesti u proizvoljnom redoslijedu, ali podaci koji se unose (vrijednosti) moraju biti u istom redoslijedu kao i navedene kolone. Navoñenje kolona potrebno je samo ako se novi red tablice popunjava sa samo nekim kolonama, a ne svim. Ako se ne navodi lista kolona, podrazumijeva se da se popunjavaju sve kolone.

VALUES Ključna riječ koja se koristi za navoñenje vrijednosti koje se unose u novi red tablice.

vrijednosti Vrijednosti koje se unose u novi red tablice. Tip podataka pojedinih vrijednosti mora odgovarati tipu podataka koji je definiran za pojedinu kolonu. Za kolone koje imaju definirane default vrijednosti može se koristiti ključna riječ default. Prilikom unosa novog redka u tablicu, ne unose se vrijednosti kojima rukuje sam sistem (IDENTITY kolone).

Primjeri:

unos podataka u tablicu student

CREATE TABLE student ( student_id int IDENTITY

CONSTRAINT PK_STUDENT PRIMARY KEY, ime varchar(20) NOT NULL, prezime varchar(30) NOT NULL, jmbg char(13), spol char(1), dat_roñenja smalldatetime NOT NULL, mjesto_rod int NOT NULL

CONSTRAINT FK_MJESTO_ST FOREIGN KEY REFERENCES mjesto(mjesto_id) )

head(student)={student_id, ime, prezime,jmbg,spol, dat_roñenja, mjesto_rod}

A. INSERT – Unos svih kolona tablice

INSERT student VALUES('Marko', 'Bilić', '1110980370086', 'M', ’11.10.1980',11)

B. INSERT sa nazivima kolona

INSERT student(spol, mjesto_rod, dat_roñenja, ime, prezime) VALUES (’M’ , 11 , ’11.10.1980', 'Marko', 'Bilić') Prilikom unosa podataka u novi redak tablice, moguće su različite situacije i ponašanja sustava u zavisnosti o tome kako su definirane pojedine kolone, te njihova null i default svojstva.

Page 48: BP VEST Skripta

47

svojstvo kolone nema ulaza, nema default

nema ulaza, postoji default

ulaz null nema default

ulaz null postoji default

null null Default null null

not null greška – error Default greška- error greška- error

U tablici su prikazana ponašanja sustava za pojedine situacije.

9.6. SELEKCIJA PODATAKA Selekcija – dobavljanje podataka vrši se SQL izrazom oblika SELECT [ALL | DISTINCT] imena_kolona FROM imena_tablica|logičke veze WHERE uvjetni_izraz

pri čemu ALL daje sve redove izlaznog rezultata prema zahtjevu izraza,a DISTINCT daje samo jedinstvene redove, eliminirajući duplikate. Ukoliko se u select izrazu ne navede niti jedan od modifikatora ALL | DISTINCT, podrazumijeva se ALL.

imena_kolona Definira kolone koje se prikazuju. • Zvjezdica (*), predstavlja sve kolone po redoslijedu navedenom kod formiranja tablice (CREATE

TABLE). • Ako lista imena_kolona sadrži više kolona, nazivi kolona se meñusobno odvajaju zarezom.

Primjer: SELECT * FROM STUDENT SELECT ime, prezime,jmbg FROM STUDENT SELECT DISTINCT ime,prezime FROM STUDENT imena_tablica |logičke veze nazivi tablica iz kojih se dobavljaju podaci. Tablice moraju prethodno biti definirane u bazi podataka. Logičke veze opisuju operacije prirodnog spajanja meñu tablicama (inner join, outer join itd). Realizacija logičkih veza podrazumijeva navoñenje imena tablica i načina njihovog povezivanja (join) u obliku:

tablica1 Operator_veze tablica 2 ON tablica1.kolona1=tablica2.kolona1 Primjer: SELECT STUDENT.IME,STUDENT.PREZIME,IME_MJESTA FROM STUDENT INNER JOIN MJESTO ON STUDENT.MJESTO_ROD=MJESTO.MJESTO_ID

Prilikom definiranja select izraza koji obuhvaća atribute (kolone) iz više tablica, treba voditi računa o jedinstvenosti naziva izabranih atributa. To znači da, ukoliko se navode kolone iz više tablica koje imaju isti naziv, uz naziv kolone treba definirati iz koje tablice se selektira tražena kolona. Primjer: SELECT STUDENT_ID,IME, PREZIME, SEM, SK_GOD FROM STUDENT INNER

JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID

Ova definicija nije ispravna budući se atribut (kolona) STUDENT_ID nalazi u obje tablice (STUDENT i UPISNI_LIST), pa time nije jednoznačno odreñeno po kojem se atributu vrši selekcija. Ispravna definicija izraza bila bi:

SELECT STUDENT.STUDENT_ID, IME, PREZIME, SEM, SK_GOD FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID

Page 49: BP VEST Skripta

48

uvjetni_izraz logički izraz koji definira uvjet po kojem se vrši pretraživanje.

9.6.1. UVJETNI IZRAZI Uvjetni izraz (search condition) SELECT lista_kolona FROM ime_tablice WHERE uvjetni izraz Oblik uvjetnog izraza ima oblik Naziv_kolone Predikat Vrijednost PREDIKATI USPOREDBE (Comparision predicates) Primjenjivo na sve tipove podataka

= Jednako <> Različito od > Veće od !> Nije veće < Manje od !< Nije manje >= veće ili jednako <= manje ili jednako

Primjer: SELECT * FROM STUDENT WHERE IME=’Marko’ PREDIKATI PODRU ČJA (range predicates) naziv_kolone BETWEEN x and y - atribut zauzima vrijednosti izmeñu x i y. Primjenjivo na sve tipove podataka. Primjer: SELECT * FROM MJESTO WHERE POST_BR between 20000 and 30000 naziv_kolone NOT BETWEEN x and y - atribut zauzima vrijednosti izvan opsega izmeñu x i y. Primjenjivo na sve tipove podataka. Primjer: SELECT * FROM MJESTO WHERE POST_BR NOT between 20000 and 30000 PREDIKATI LISTE (list predicates) naziv_kolone IN (lista vrijednosti)– vrijednost atributa jednaka je nekoj od vrijednosti navedenoj u listi. Primjenjivo na sve tipove podataka Primjer: SELECT * FROM MJESTO WHERE IME_MJESTA IN (‘Split’, ‘Trogir’,’Makarska’) što je jednako kao : SELECT * FROM MJESTO WHERE (IME_MJESTA= ‘Split’ ) OR (IME_MJESTA= ‘Trogir’) OR (IME_MJESTA= ‘Makarska’) naziv_kolone NOT IN (lista vrijednosti)–atribut ima bilo koju vrijednost osim vrijednosti navedenih u listi. Primjenjivo na sve tipove podataka Primjer: SELECT * FROM MJESTO WHERE IME_MJESTA NOT IN (‘Split’, ‘Trogir’,’Makarska’) PREDIKATI UZORKA (pattern predicates) naziv kolone LIKE uzorak - vrijednost atributa poklapa se sa navedenim uzorkom Primjenjivo na tekstualne i datum tipove podataka. Vrste uzoraka % - niz karaktera bilo koje duljine. _ - Bilo koji pojedinačni karakter

Page 50: BP VEST Skripta

49

[ ] - Bilo koji karakter u navedenim granicama [^˙] – Bilo koji karakter izvan navedenih granica Primjeri: SELECT * FROM STUDENT WHERE PREZIME Like ‘A%’ Prikazuje sve studente kojima prezime počinje sa slovom A. SELECT * FROM STUDENT WHERE PREZIME Like ‘%ić’ Prikazuje sve studente kojima prezime završava sa ‘ić’. SELECT * FROM STUDENT WHERE IME Like ‘_arko’ Prikazuje sve studente kojima se u imenu nalazi ‘arko’, a ispred je bilo koje slovo.npr. ‘Marko’,’Darko’,’Žarko’ SELECT * FROM STUDENT WHERE PREZIME Like ‘[P-Z]ilić’ Prikazuje sve studente kojima prezime počinje sa slovom izmeñu P i Z, a u nastavku se nalazi ‘ilić’. SELECT * FROM STUDENT WHERE IME Like ‘[AB]%’ Prikazuje sve studente kojima ime počinje sa slovom A ili B

PREDIKATI NEPOZNATE VRIJEDNOSTI IS NULL, IS NOT NULL Primjer: SELECT IME, PREZIME, SEM FROM STUDENT LEFT OUTER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SEM IS NULL LOGI ČKI OPERATORI - AND, OR, NOT Logički operatori AND i OR povezuju više uvjeta u uvjetnom izrazu. Logički izraz AND povezuje dva ili više uvjeta i vraća rezultat samo ako su svi uvjeti zadovoljeni (istiniti). Primjer: SELECT IME, PREZIME, SEM FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SK_GOD=’1999/00’ AND SEM=1. Logički izraz OR povezuje dva ili više uvjeta i vraća rezultat ako je bilo koji uvjet zadovoljeni (istinit). Primjer: SELECT * FROM MJESTO WHERE IME_MJESTA= ‘Split’ OR IME_MJESTA= ‘Trogir’ OR IME_MJESTA= ‘Makarska’ Logički izraz NOT negira uvjet koji mu slijedi Primjer: SELECT * FROM MJESTO WHERE NOT IME_MJESTA= ‘Split’ PRIORITET LOGI ČKIH OPERATORA Kada se u uvjetnom dijelu izraza pojavljuje više logičkih operatora, logički izraz formira se prema prioritetu djelovanja operatora NOT- najviši prioritet AND -srednji prioritet OR - najniži prioritet

Page 51: BP VEST Skripta

50

Primjer: SELECT IME, PREZIME FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SK_GOD=’1999/00’ OR ŠK_GOD=’1998/99’ AND SEM=1. Kao rezultat dobije se lista svih studenata koji su upisani u 1. semestar šk.godine ‘1998/99’ i onih koji su upisani u šk.godinu ‘1999/00’ (bilo koji semestar). Prioritet logičkih operatora, može se promijeniti uvoñenjem zagrada () u logički izraz Na primjer: SELECT IME, PREZIME FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE (SK_GOD=’1999/00’ OR ŠK_GOD=’1998/99’) AND SEM=1.

9.6.2. OBLIKOVANJE IZLAZNIH REZULTATA Preimenovanje kolona u rezultatu Kod postavljanja upita (select) kojim se dohvaćaju podaci, izlazna lista (rezultat) formira se na način da naziv kolone koja se dohvaća postaje zaglavlje te kolone. Primjer: SELECT PREZIME, IME, SEM FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SK_GOD=’1999/00’ Rezultat: Prezime Ime Sem Matić Ivo 1 Bili ć Ante 3 Ali ć Josip 1

Za postizanje izlazne liste rezultata, koja je korisniku razumljivija, može se primijeniti preimenovanje izlaznih rezultata u obliku zaglavlje_kolone=naziv_kolone u sklopu select izraza. Primjer: SELECT PREZIME,IME, UPISANI_SEMESTAR=SEM FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SK_GOD=’1999/00’ Prezime Ime UPISANI_SEMESTAR Matić Ivo 1 Bili ć Ante 3 Ali ć Josip 1

Zamjena podataka u rezultatu upita Proširimo tablicu STUDENT atributom koji opisuje status studenta ( R- redovni student, I- izvanredni student) ALTER TABLE student ADD tip_studija char (1) not null CONSTRAINT CK_2 check (tip_studija=’R’ or tip_studija =’I’) U tablicu student uvodimo novi atribut (kolonu), koja označava tip studiranja, te može poprimiti samo vrijednosti ‘R’ ili ‘I’, kao oznaka za redovne ili izvanredne studente. Upit SELECT IME, PREZIME, TIP_STUDIJA FROM STUDENT daje rezultat u kojem se u koloni tip_studija nalaze znakovi ‘R’ ili ‘I’ kao oznaka tipa studiranja. Kako bi se ove kratice učinile razumljivijim mogu se u izlaznom rezultatu dodijeliti puni nazivi korištenjem CASE izraza.

Page 52: BP VEST Skripta

51

SELECT IME, PREZIME,

STUDIJ=CASE TIP_STUDIJA WHEN ‘R’ THEN ‘REDOVNI’ WHEN ‘I’ THEN ‘IZBORNI’ END FROM STUDENT. Upit SELECT IME,PREZIME, SEM, TIP_STUDIJA FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SK_GOD=’1999/00’ AND SEM IN (1,3,5) može se pomoću naredbe CASE prikazati u pogodnijem obliku SELECT IME, PREZIME,

STATUS=CASE WHEN TIP_STUDIJA=‘R’ AND SEM=1 THEN ‘REDOVNI STUDENT 1. GODINE’ WHEN TIP_STUDIJA=‘R’ AND SEM=3 THEN ‘REDOVNI STUDENT 2. GODINE’ WHEN TIP_STUDIJA=‘I’ AND SEM=1 THEN ‘IZVANREDNI STUDENT 1. GODINE’ WHEN TIP_STUDIJA=‘I’ AND SEM=3 THEN ‘IZVANREDNI STUDENT 2. GODINE’ ELSE APSOLVENT END FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SK_GOD=’1999/00’AND SEM IN (1,3,5) Povezivanje podataka u rezultatu upita Upit SELECT PREZIME,IME, TIP_STUDIJA FROM STUDENT daje listu svih studenata u formatu Prezime Ime tip_studija Matić Ivo R Bili ć Ante R Ali ć Josip I ... ... ...

Povezivanjem kolona ime i prezime može se dobiti uobičajeni prikaz studenta: SELECT STUDENT=PREZIME+’ ‘+IME ,

STUDIJ=CASE TIP_STUDIJA WHEN ‘R’ THEN ‘REDOVNI’ WHEN ‘I’ THEN ‘IZBORNI’ END FROM STUDENT Student studij Matić Ivo Redovni Bili ć Ante Redovni Ali ć Josip Izvanredni ... ...

Page 53: BP VEST Skripta

52

Izračunate kolone (Computed values) SQL dozvoljava formiranje novih kolona u select izrazu, čije se vrijednosti izračunavaju na temelju podataka koji se nalaze u numeričkim kolonama postojećih tablica. Primjer: Prikaz upisnih listova vezanih za pojedine studente uz označenu godinu studiranja.

SELECT IME,PREZIME, SEM, GODINA_STUDIJA= SEM/2+ SEM%2 FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SK_GOD=’1999/00’ AND SEM IN (1,3,5) Pri izračunavanju vrijednosti u pojedinim kolonama mogu se koristiti vrijednosti postojećih kolona za koje su definirani numerički tipovi podataka i neki od numeričkih operatora +,-,*,/, % (Modulo operator – ostatak pri cjelobrojnom dijeljenju).

9.6.3. SORTIRANJE IZLAZNIH REZULTATA

Za sortiranje izlaznih rezultata koristi se izraz ORDER BY, kao dio select instrukcije.

SELECT [ALL | DISTINCT] nazivi_kolona FROM nazivi_tablica|logičke veze WHERE uvjetni izraz ORDER BY kolone_sortiranja Sintaksa: ORDER BY naziv_kolone tip_sortiranja, naziv_kolone tip_sortiranja,...

Sortiranje može biti rastuće (ascending ASC) ili padajuće (descending DESC). Ako nije naveden tip sortiranja podrazumijeva se rastuće (ASC) sortiranje.

head(STUDENT)={student_id, ime, prezime,jmbg,spol, dat_roñenja, mjesto_id}

Primjer: SELECT * FROM STUDENT ORDER BY PREZIME, IME Umjesto naziva kolona u izrazu order by može se koristiti redni broj kolone u select listi. Primjer: SELECT * FROM STUDENT ORDER BY 3 ASC , IME

Page 54: BP VEST Skripta

53

9.6.4. OGRANIČAVANJE ISPISA REZULTATA Upit tipa SELECT [ALL | DISTINCT] imena_kolona FROM imena_tablica|logičke veze WHERE uvjetni_izraz prikazuje sve rezultate iz izabranih tablica koji zadovoljavaju uvjetni izraz. U slučaju potrebe za prikazom samo dijela izlaznih rezultata ispis se može ograničiti primjenom sintakse SELECT [ALL | DISTINCT] [TOP n [PERCENT]] imena_kolona FROM imena_tablica|logičke veze WHERE uvjetni_izraz ORDER BY kolone_sortiranja pri čemu je select izraz proširen modifikatorom TOP n ili TOP n PERCENT. Ovaj modifikator označava da će u ispisu rezultata biti prikazano samo prvih n redova (TOP n), odnosno samo n% (TOP n PERCENT) od ukupnog broja redova koji zadovoljavaju postavljeni uvjet. Primjer: SELECT TOP 50 PREZIME,IME,JMBG FROM STUDENT ORDER BY PREZIME,IME. Iz ukupnog skupa studenata prikazuje samo prvih 50 sortirano po prezimenu i imenu. SELECT TOP 50 PERCENT PREZIME,IME,JMBG FROM STUDENT ORDER BY PREZIME,IME. Iz ukupnog skupa studenata prikazuje prvu polovicu liste u ureñenom sortiranju po prezimenu i imenu.

9.7. SELECT INTO (MAKE TABLE QUERY) SELECT [ALL | DISTINCT] nazivi_kolona INTO nova_ tablica FROM nazivi_tablica WHERE uvjetni izraz Izraz select into stvara novu tablicu na osnovi kolona navedenih u nazivi_kolona i redova koji se biraju uvjetnim izrazom iz postojećih tablica u bazi. Podatak nova_ tablica predstavlja ime nove tablice, koja će se formirati iz rezultata upita. Ta tablica ne smije prethodno biti definirana u bazi.

SELECT INTO je operacija koja se odvija u dva koraka. U prvom koraku formira se nova tablica , a drugim korakom u novu tablicu unose se redovi koji zadovoljavaju uvjetni izraz. Ako se drugi korak ne izvrši iz bilo kojeg razloga, nova tablica ostaje ali u njoj nema nikakvih podataka. Ovim izrazom omogućeno je automatsko formiranje nove tablice bez njezinog prethodnog definiranja naredbom CREATE TABLE. Definicija podataka u novoj tablici formira se automatski i ona je identična definiciji pojedinih atributa(kolona) u postojećim tablicama, koje su obuhvaćene SELECT izrazom. Primjer: Na temelju strukture podataka u bazi studentske službe potrebno je formirati novu tablicu koja će sadržavati podatke o studentima koji su upisani u školsku godinu 2000/01. Tablica mora sadržavati slijedeće podatke: Ime , Prezime i Matični broj studenta, upisani semestar, obrazovni program i školsku godinu.

Page 55: BP VEST Skripta

54

SQL izraz za rješavanje ovog zadatka glasi SELECT IME, PREZIME, MAT_BR, SEM, OBR_PROG_IME, SK_GOD INTO STUDENT2 FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID = UPISNI_LIST.STUDENT_ID INNER JOIN OBR_PROG ON OBR_PROG.OBR_PROG_ID = UPISNI_ LIST.OBR_PROG_ID WHERE SK_GOD=’2000/01’.

9.8. APPEND UPITI ( proširivanje tablice podacima iz drugih tablica) Upitima tipa Append (dodavanje) u postojeću tablicu u bazi podataka dodijeljuju se podaci iz drugih tablica prema zadanim uvjetima. Standardna SQL sintaksa ovih izraza je oblika INSERT ime_tablice SELECT nazivi_kolona FROM tablice|veze WHERE uvjetni_izraz gdje ime_tablice predstavlja naziv neke od postojećih tablica u bazi podataka. Primjer: Dobijenu tablicu u prethodnom zadatku treba proširiti sa podacima za školsku godinu 1999/00. Nakon što smo problem riješili za školsku godinu 2000/01. prethodnim zadatkom u bazi smo dobili novu tablicu STUDENT2, koja je definirana: head(STUDENT2)= {IME, PREZIME,MAT_BR, SEM,OBR_PROG_IME, SK_GOD} Postojeće podatke u tablici potrebno je proširiti sa onima koji se odnose na školsku godinu 1999/00. INSERT STUDENT2 SELECT IME, PREZIME, MAT_BR, SEM, OBR_PROG_IME, SK_GOD FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID = UPISNI_LIST.STUDENT_ID INNER JOIN OBR_PROG ON OBR_PROG.OBR_PROG_ID = UPISNI_ LIST.OBR_PROG_ID WHERE SK_GOD=’1999/00’. 9.9.AŽURIRANJE PODATAKA U TABLICI

Ažuriranje podataka u tablici provodi se naredbom UPDATE prema sintaksi

UPDATE naziv_tablice SET naziv_kolone = nova vrijednost, naziv_kolone2 = nova_vrijednost2 [FROM tablica_1, tablica_2,...] WHERE uvjetni izraz

Primjeri: UPDATE STUDENT SET ime=’Marko’ where ime=’Darko’ and prezime=’Y’ UPDATE UPISNI_LIST SET sem=3 FROM STUDENT, UPISNI_LIST WHERE ime=’Darko’ AND prezime=’Y’ AND STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID AND sem=1 UPDATE STUDENT SET mjesto_id=MJESTO.mjesto_id FROM MJESTO, STUDENT WHERE MJESTO.ime_mjesta =’Trogir’ and student_id=21 9.10. BRISANJE PODATAKA IZ TABLICE

Brisanje podataka iz tablice provodi se naredbom DELETE prema sintaksi

DELETE naziv_tablice [FROM tablica_1, tablica_2,...] WHERE uvjetni izraz

Page 56: BP VEST Skripta

55

Primjeri: DELETE STUDENT where ime=’Darko’ and prezime=’Y’ DELETE UPISNI_LIST FROM STUDENT, UPISNI_LIST WHERE ime=’Darko’ AND prezime=’Y’ AND STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID AND sem=1 ili DELETE UPISNI_LIST FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE ime=’Darko’ AND prezime=’Y’ AND sem=1 Zadatak: Pretpostavimo da posjedujemo podatke o studentima u obliku definiranom u tablici STUDENT2 head(STUDENT2)= {IME, PREZIME,MAT_BR, SEM,OBR_PROG_IME, SK_GOD} IME PREZIME MAT_BR SEM OBR_PROG_IME SK_GOD Ante X 11-cc 1 Elektronika 1999/00 Marko C 12-dd 1 Elektronika 1999/00 .... .... .... ... .... ... Iz postojeće tablice potrebno je uspostaviti bazu podataka strukture prema slici

Korak1: Formiranje tablice STUDENTI CREATE TABLE STUDENT ( student_id int IDENTITY

CONSTRAINT PK_STUDENT PRIMARY KEY, ime varchar(20) NOT NULL, prezime varchar(30) NOT NULL, mat_br char(5) )

Korak 2: U tablicu STUDENT prenijeti podatke o svim studentima INSERT STUDENT SELECT DISTINCT Ime, Prezime,Mat_br FROM STUDENT2 Korak 3: Formiranje tablice OBR_PROG CREATE TABLE OBR_PROG ( obr_prog_id int IDENTITY PRIMARY KEY, obr_prog_ime varchar(20) NOT NULL, )

Korak 4: U tablicu OBR_PROG prenijeti podatke o različitim obrazovnim programima INSERT OBR_PROG SELECT DISTINCT OBR_PROG_IME FROM STUDENT2 Korak 5: Tablicu STUDENT2 preimenujemo U UPISNI_LIST, te je proširimo kolonama ULIST_ID, STUDENT_ID i OBR_PROG_ID

Page 57: BP VEST Skripta

56

ALTER TABLE UPISNI_LIST ADD ULIST_ID int IDENTITY PRIMARY KEY, STUDENT_ID int CONSTRAINT FK_STUDENT_ULIST REFERENCES STUDENT(student_id) , OBR_PROG_ID int CONSTRAINT FK_OBR_ULIST REFERENCES OBR_PROG(obr_prog_id) Korak 6: Pridijelimo vrijednosti novostvorenim kolonama STUDENT_ID i OBR_PROG_ID UPDATE UPISNI_LIST SET OBR_PROG_ID=OBR_PROG.OBR_PROG_ID FROM UPISNI_LIST,OBR_PROG WHERE UPISNI_LIST.OBR_PROG_IME=OBR_PROG.OBR_PROG_IME UPDATE UPISNI_LIST SET STUDENT_ID=STUDENT.STUDENT_ID FROM UPISNI_LIST,STUDENT WHERE STUDENT.MAT_BR=UPISNI_LIST.MAT_BR Korak 7: Iz tablice UPISNI_LIST uklanjamo kolone IME,PREZIME, MAT_BR, OBR_PROG_IME ALTER TABLE UPISNI_LIST DROP COLUMN IME,PREZIME, MAT_BR, OBR_PROG_IME 9. 11. ALIAS-i

Alias (drugo ime) koristi se u upitima SQL jezika za promjenu naziva objekta (tablice) kojoj se pristupa. Svakoj tablici može se dodijeliti alias, bilo zbog lakše upotrebe ili razlikovanja kod tzv. self-join query postupaka. Sintaksa: Naziv_tablice alias ili Naziv_tablice AS alias Primjer: Ispisati sve parove studenata koji su roñeni istog datuma SELECT student_1=STUDENT_1.PREZIME+’ ‘+STUDENT_1.IME, student_2=STUDENT_2.PREZIME+’ ‘ + STUDENT_2.IME FROM STUDENT AS STUDENT_1, STUDENT AS STUDENT_2 where STUDENT_1.DATUM=STUDENT_2.DATUM and STUDENT_1.STUDENT_ID>STUDENT_2. STUDENT_ID ili SELECT student_1=STUDENT_1.PREZIME+’ ‘+STUDENT_1.IME, student_2=STUDENT_2.PREZIME+’ ‘ + STUDENT_2.IME FROM STUDENT STUDENT_1 INNER JOIN STUDENT STUDENT_2 ON STUDENT_1.DATUM=STUDENT_2.DATUM WHERE STUDENT_1.STUDENT_ID>STUDENT_2. STUDENT_ID 9.12. AGREGATNE FUNKCIJE

Agregatne funkcije generiraju zbirne(skupne) vrijednosti nad pojedinim kolonama tablice. Agregatne funkcije (SUM, AVG, MIN, MAX, COUNT) koriste se u SELECT izrazu, te mogu biti primjenjene nad svim redovima tablice ili samo nad onim redovima koji su definirani WHERE izrazom.

Značenje agregatnih funkcija

SUM – zbroj AVG- prosjek MIN -minimum MAX -maximum COUNT- pobrojavanje

Agregatne funkcije SUM i AVG mogu se koristiti samo za numeričke tipove podataka.

Sintaksa:

SELECT agregate(naziv_kolone), agregate(naziv_kolone) FROM tablice WHERE uvjetni izraz

Primjeri:

SELECT COUNT(ULIST_ID) FROM UPISNI_LIST WHERE šk_god=’1999/00’ and sem=1

SELECT max(SEM) FROM UPISNI_LIST INNER JOIN STUDENT ON UPISNI_LIST.STUDENT_ID=STUDENT.STUDENT_ID WHERE ime=’M’ and prezime=’N’

Page 58: BP VEST Skripta

57

9. 13. GRUPNI UPITI (GROUP BY Query) SELECT [ALL | DISTINCT] nazivi kolona, agregatne kolone FROM nazivi_tablica| join veze [WHERE uvjetni izraz] [GROUP BY nazivi kolona] [HAVING uvjetni izraz] [ORDER BY sort_izraz] GROUP BY Odreñuje grupe po kojima se dijele izlazni rezultati, dobijeni pomoću select izraza, te primjenu agregatnih funkcija nad pojedinim grupama. GROUP BY izraz može se primijeniti na sve kolone, osim onih tipa text. Primijenom GROUP BY izraza, rezultati dobijeni dijelom izraza SELECT [ALL | DISTINCT] nazivi kolona FROM nazivi_tablica| join veze [WHERE uvjetni izraz] grupiraju se na način da oni redovi izlaznog rezultata koji u svim kolonama navedenim u GROUP BY izrazu imaju iste vrijednosti spadaju u istu grupu, nad kojom se može zadati odreñena agregatna funkcija.

Primjer: SELECT STUDENT.STUDENT_ID , IME, PREZIME, SEM FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID prikazuje sve upisne listove za pojedine studente u formatu

student_id ime prezime sem 1 A B 1 2 C D 1 ... ... ... ... 1 A B 2 2 C D 2 ... ... ... ... 1 A B 3

Proširimo gornji upit GROUP BY izrazom SELECT STUDENT.STUDENT_ID , IME, PREZIME, BROJ=COUNT(SEM) FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID GROUP BY STUDENT.STUDENT_ID , IME, PREZIME Djelovanje GROUP BY operatora podrazumijeva grupiranje izlaznih rezultata na način da se svi redovi koji u kolonama navedenim u GROUP BY izrazu imaju iste vrijednosti, povezuju u zajedničku grupu. U gornjem primjeru grupa je odreñena kolonama student_id, ime i prezime, što znači da se svi redovi koji u ovim kolonama imaju istu vrijednost, povezuju u zajedničku grupu, nad kojom se provodi odreñena agregatna funkcija.

student_id ime prezime broj 1 A B 3 2 C D 2 ... ... ... ...

Page 59: BP VEST Skripta

58

Zadanim upitom dobijamo podatke o studentima (student_id, ime, prezime) i broj upisnih listova (semestara) koje je taj student upisao u tijeku studija.

HAVING uvjetni izraz Predstavlja ograničenje izlaznih rezultata po zadanom uvjetu nakon izvršenja GROUP BY operacije. Osnovna razlika izmeñu WHERE i HAVING izraza jest u činjenici da WHERE izraz ograničava izlazne rezultate prije njihovog grupiranja tj. uvjetuje broj redova koji ulaze u grupiranje, dok HAVING izraz postavlja uvjet na izlazne rezultate nakon što je grupiranje završeno.

Primjer:

SELECT STUDENT.STUDENT_ID , IME, PREZIME, BROJ=COUNT(SEM) FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID WHERE SK_GOD>’1997/98’ GROUP BY STUDENT.STUDENT_ID , IME, PREZIME Navedeni upit prikazuje podatke o studentima u formatu student_id, ime, prezime, broj, gdje broj predstavlja broj upisnih listova za svakog studenta za školske godine iznad 1997/98. Izraz SELECT STUDENT.STUDENT_ID , IME, PREZIME, BROJ=COUNT(SEM) FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID GROUP BY STUDENT.STUDENT_ID , IME, PREZIME HAVING SK_GOD>’1997/98’ je neispravan, budući operator HAVING djeluje nakon što završi grupiranje rezultata, kada izlazni rezultati imaju oblik

student_id ime prezime broj 1 A B 3 2 C D 2 ... ... ... ...

Budući se nakon grupiranja gubi podatak o školskoj godini, ne može se primijeniti gore navedeni uvjet. Neka su definirane tablice

head(STUDENT)={student_id, ime, prezime,jmbg,spol, dat_roñenja, mjesto_id}

head(MJESTO)={mjesto_id, ime_mjesta, post_br}

head(UPISNI_LIST)={ulist_id, student_id,obr_prog_id,sk_god,sem}

head(OBR_PROG)={obr_prog_id, obr_prog_ime}

Primjeri:

Prikazati studente upisane u 1. sem šk.god 1999/00 po mjestu roñenja

SELECT mjesto.mjesto_id , ime_mjesta, broj=count(*) FROM student INNER JOIN upisni_list on student.student_id=upisni_list.student_id INNER JOIN mjesto on student.mjesto_id=mjesto.mjesto_id WHERE sk_god=’1999/00’ and sem=1 GROUP BY mjesto.mjesto_id, ime_mjesta ORDER BY ime_mjesta Prikazati studente i najviši upisani semestar za svakog studenta SELECT student.student_id, ime, prezime, zadnji_sem=max(sem) FROM student INNER JOIN upisni_list on student.student_id=upisni_list.student_id GROUP BY student.student_id, ime, prezime

Page 60: BP VEST Skripta

59

Prikazati statistiku broja upisanih studenata u 1.sem. školske godine 1999/00, po obrazovnim programima SELECT obr_prog_ime, broj_upisanih=count(*) FROM obr_prog INNER JOIN upisni_list on obr_prog.obr_prog_id=upisni_list.obr_prog_id WHERE sk_god=’1999/00’ and sem=1 GROUP BY obr_prog_ime Zadaci za vježbu:

Prikazati statistiku broja upisanih studenata u školskoj godini 1999/00, po obrazovnim programima i semestrima SELECT OBR_PROG_IME,SEM , BROJ_UPISANIH=COUNT(ULIST_ID) FROM OBR_PROG INNER JOIN UPISNI_LIST ON OBR_PROG.OBR_PROG_ID=UPISNI_LIST.OBR_PROG_ID WHERE SK_GOD=’1999/00’ GROUP BY OBR_PROG_IME, SEM ORDER BY SEM,OBR_PROG_IME Prikazati prosjek ocjena za studente SELECT STUDENTI.STUDENT_ID, IME, PREZIME, Prosjek=AVG(OCJENA) FROM STUDENTI INNER JOIN UPISNI_LIST ON STUDENTI.STUDENT_ID = UPISNI_LIST.STUDENT_ID INNER JOIN UPISUJE ON UPISNI_LIST.ULIST_ID = UPISUJE.ULIST_ID GROUP BY STUDENTI.STUDENT_ID, IME, PREZIME Prikazati statistiku upisanih studenata koji slušaju predmet naziva ‘Fizika’ po školskim godinama SELECT SK_GOD, broj=COUNT(UPISUJE.ULIST_ID) FROM UPISNI_LIST INNER JOIN UPISUJE ON UPISNI_LIST.ULIST_ID = UPISUJE.ULIST_ID INNER JOIN PREDMETI ON UPISUJE.PREDMET_ID = PREDMETI.PREDMET_ID WHERE PREDMET_IME = 'Fizika' GROUP BY SK_GOD Prikazati broj apsolvenata po školskim godinama SELECT SK_GOD, broj=COUNT(*) FROM UPISNI_LIST WHERE (APSOLVENT = 1) GROUP BY SK_GOD

Page 61: BP VEST Skripta

60

Prikazati statistiku ocjena studenata iz pojedinih predmeta u obliku ime_predmeta ocjena broj studenata koji su dobili ocjenu

SELECT PREDMET_IME, OCJENA, broj=COUNT(ULIST_ID) FROM PREDMETI INNER JOIN UPISUJE ON PREDMETI.PREDMET_ID = UPISUJE.PREDMET_ID GROUP BY PREDMET_IME, OCJENA

9.14. UGNJEŽðENI UPITI - PODUPITI

Podupit (Subquery) je SELECT izraz uključen u glavni SELECT, INSERT, UPDATE ili DELETE upit. Upit koji uključuje podupit (subquery), svoj uvjetni dio izraza temelji na rezultatima koji su dobijeni izvršenjem podupita. Podupit se uključuje u glavni upit u uvjetnom dijelu izraza tj. u dijelu WHERE ili HAVING. SELECT [ALL | DISTINCT] nazivi kolona, agregatne kolone FROM nazivi_tablica| join veze [WHERE uvjet=subquery] [GROUP BY nazivi kolona] [HAVING uvjet=subquery] Prilikom izvršenja SQL izraza koji uključuje podupit, najprije se izvršava podupit, a rezultati koje podupit daje postaju dio uvjetnog izraza glavnog upita. Postoje tri osnovna oblika oblika podupita (subqueries): • podupiti liste na koje se primijenjuje IN predikat • podupiti sa operatorom usporedbe • podupiti kojima se ispituje postojanje odreñenih podataka Podupiti liste Podupit vraća niz rezultata (listu), koju glavni upit koristi u svom uvjetnom izrazu preko predikata liste (IN).

Primjer:

Prikazati studente upisane u 1. sem šk.god 1999/00

SELECT STUDENT_ID , IME, PREZIME FROM STUDENT WHERE STUDENT_ID IN (SELECT STUDENT_ID FROM UPISNI_LIST WHERE SK_GOD=’1999/00’ AND SEM=1) ORDER BY PREZIME,IME Izraz se izvršava u dva koraka. Prvo podupit iz tablice upisni_list vraća student_id za sve studente koji imaju upisni list u 1. sem školske godine 1999/00. Rezultat je lista sa podacima student_id. Potom glavni upit iz tablice student vraća podatke o svim studentima čiji se student_id nalazi u listi koristeći predikat liste (IN).

Primjer:

Prikazati studente koji nemaju niti jedan upisni list

SELECT student_id , ime, prezime FROM student WHERE student_id not in (select student_id from upisni_list) ORDER BY prezime,ime

Page 62: BP VEST Skripta

61

Podupiti sa operatorom usporedbe

Rezultat podupita može se u glavni upit uključiti preko jednog od predikata usporedbe (=,<>,<,....)

Takva struktura podupita podrazumijeva da podupit mora vratiti samo jednu vrijednost, a ne kao u prethodnom primjeru listu vrijednosti.

Primjer: Prikazati sve studente koji su roñeni u istom mjestu kao i student ‘x y’

SELECT STUDENT_ID , IME, PREZIME FROM STUDENT WHERE MJESTO_ID = (SELECT MJESTO_ID FROM STUDENT WHERE IME=’X’ AND PREZIME=’Y’) ORDER BY PREZIME,IME Primjer: Izbrisati upisni list 1 semestra za studenta ‘x y’ DELETE UPISNI_LIST WHERE STUDENT_ID =(SELECT STUDENT_ID FROM STUDENT WHERE IME=’X’ AND PREZIME=’Y’) AND SEM=1 što je isto kao DELETE UPISNI_LIST FROM STUDENT, UPISNI_LIST WHERE ime=’Darko’ AND prezime=’Y’ AND STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID AND sem=1 Primjer: Prikazati sve upisne listove za studenta ‘x y’ osim posljednjega. SELECT SK_GOD ,SEM FROM UPISNI_LIST WHERE STUDENT_ID = (SELECT STUDENT_ID FROM STUDENT WHERE IME=’X’ AND PREZIME=’Y’) AND SEM<(SELECT MAX(SEM) FROM UPISNI_LIST WHERE STUDENT_ID=( SELECT STUDENT_ID FROM STUDENT WHERE IME=’X’ AND PREZIME=’Y’)) Primjer: Za sve upisne listove 6. semestra obrazovnog programa ‘Elektronika’ postaviti apsolventski status.

UPDATE UPISNI_LIST SET APSOLVENT=1 WHERE SEM=6 AND OBR_PROG_ID= (SELECT OBR_PROG_ID FROM OBR_PROG WHERE OBR_PROG_IME=’ELEKTRONIKA’)

Korelirani pod-upiti (Cross-corellated queries)

Prethodni primjeri pod-upita bili su izraženi na način da se podupit izvršio samo jednom i rezultati koje vraća podupit su se proslijeñivali u uvjetni dio glavnog upita. U upitima koji uključuju korelirane podupite, izračunavanje podupita zavisi od glavnog upita, što znači da se podupit izvodi za svaki podatak glavnog upita. Primjer: SELECT * from STUDENT where mjesto_id= (SELECT mjesto_id from MJESTO where IME_MJESTA=’Osijek’) je primjer pod-upita koji je nezavisan u glavnom upitu, te se izvodi samo jednom. Isti rezultat može se dobiti pomoću koreliranog podupita SELECT * from STUDENT where ‘Osijek’=(SELECT IME_MJESTA from MJESTO where STUDENT.MJESTO_ID=MJESTO.MJESTO_ID) Izvršavanje upita počinje od tablice STUDENT. Uzima se prvi red u tablici STUDENT, te se za tog studenta vadi vrijednost mjesto_id i proslijeñuje u podupit. Podupit traži redak u tablici MJESTO gdje je vrijednost mjesto_id jednaka onoj koja odgovara prvom studentu. Kad naiñe na takav podatak u tablici mjesto, provjerava Ime_mjesta i usporeñuje sa zadanom vrijednošću (‘Osijek’), i tako za sve redove u tablici student.

Page 63: BP VEST Skripta

62

Primjer: Izraditi korelirani podupit kojim se ispisuju podaci o studentima koji su upisali 1 sem u školskoj godini 1999/00. SELECT * from STUDENT where 1 IN (SELECT sem FROM upisni_list where STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID AND sk_god=’1999/00’) Podupiti sa predikatom postojanja (EXISTS, NOT EXISTS) Operator EXISTS ispituje postojanje podataka uz navedene uvjete i najčešći je način korištenja koreliranih podupita. U ovakvoj strukturi ugnježñenog upita, uvjetni izraz glavnog upita ispituje postojanje podataka koje vraća podupit. Primjer: Prikazati sve studente koji nemaju niti jedan upisni list. SELECT STUDENT_ID,IME, PREZIME FROM STUDENT WHERE NOT EXISTS (SELECT * FROM UPISNI_LIST WHERE STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID) Primjer: Prikazati sva mjesta u kojima je roñen neki student SELECT * FROM MJESTO WHERE EXISTS (SELECT * FROM STUDENT WHERE MJESTO.MJESTO_ID=STUDENT.MJESTO_ID)

9. 15. UNIJA Operator unije (UNION) definira relacijsku operaciju unije, tj. povezuje rezultate više upita u jedinstveni skup rezultata. Sintaksa: Upit_1 UNION [ALL] Upit_2...ORDER BY sort Primjer: Definirane su tablice T1 i T2 kao T1 T2

a b c a b c abc 2 4 ghi 4 6 def 3 5 jkl 5 7 ghi 4 6 mno 6 8

SELECT * from T1 UNION SELECT * from T2

a b c abc 2 4 def 3 5 ghi 4 6 jkl 5 7

mno 6 8 UNION operator uklanja duplicirane redove rezultata obaju upita. Ukoliko se želi prikaz svih redova, bez eliminacije duplikata, potrebno je navesti opciju ALL : SELECT * from T1 UNION ALL SELECT * from T2 Pri formiranju unije mora vrijediti: - upiti čiji se rezultati uniraju moraju imati jednaki broj izlaznih kolona - odgovarajuće izlazne kolone u upitima koji se povezuju unijom moraju biti istog tipa podataka

Page 64: BP VEST Skripta

63

9. 16. POGLED (VIEW) Pogledi su virtualne tablice, koje se formiraju kao posebna organizacijska jedinica u bazi podataka. Osnovne tablice postoje kao stvarne, fizičke tablice u bazi podataka. One imaju svoju definiciju koja je pohranjena u sistemskom katalogu baze podataka, svoje podatke koji su pohranjeni na disku i svoje indekse. Pogled (view), kao virtualna tablica , nema svoje indekse, niti datoteke s podacima, ali mu korisnik pristupa kao i svakoj drugoj tablici. Kreiranje pogleda Pogled se definira naredbom CREATE VIEW ime AS SELECT ...select query [WITH CHECK] U sklopu definicije pogleda moguće je navesti bilo koji select query, obični ili grupni uz postojeća pravila u okviru SQL-a. Atributi pogleda imaju iste nazive kao i atributi tablica nad kojima je pogled definiran. Primjer:

CREATE VIEW V_UPISNI_LIST AS SELECT IME, PREZIME, MAT_BR, SEM, SK_GOD, OBR_PROG_IME, APSOLVENT FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID=UPISNI_LIST.STUDENT_ID INNER JOIN OBR_PROG ON UPISNI_LIST.OBR_PROG_ID= OBR_PROG.OBR_PROG_ID je pogled formiran nad tablicama STUDENT, UPISNI_LIST i OBR_PROG, sa izlaznim atributima IME, PREZIME, MAT_BR,SEM,SK_GOD, OBR_PROG_IME i APSOLVENT. Ovakvom pogledu moguće je pristupati kao i svakoj drugoj tablici: SELECT * FROM V_UPISNI_LIST WHERE IME=’X’ AND PREZIME=’Y’ ORDER BY SK_GOD, SEM SELECT IME, PREZIME FROM V_UPISNI_LIST WHERE SEM=1 AND SK_GOD=’1999/00’ ORDER BY PREZIME, IME Preimenovanje atributa pogleda Prilikom uobičajenog definiranja pogleda, njegovi atributi imaju iste nazive kao i atributi tablica nad kojima je pogled definiran. Ako postoji potreba za promjenom naziva pojedinih atributa, to se može ostvariti na tri načina:

Page 65: BP VEST Skripta

64

1. Uobičajeno pravilo promjene naziva atributa u SELECT upitima tipa novi_naziv=atribut Primjer: CREATE VIEW V_STUDENTI AS SELECT IME, PREZIME, SK_GOD,UPISANI_SEMESTAR=SEM FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID =UPISNI_LIST.STUDENT_ID

2. Korištenjem izraza AS u obliku: atribut AS novi_naziv

Primjer: CREATE VIEW V_STUDENTI AS SELECT IME, PREZIME, SK_GOD,SEM AS UPISANI_SEM FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID =UPISNI_LIST.STUDENT_ID

3. Navoñenjem novih naziva atributa u definiciji pogleda u obliku CREATE VIEW naziv_pogleda (nazivi atributa) AS Primjer: CREATE VIEW V_STUDENTI (IME, PREZIME, SK_GOD, UPISANI_SEM) AS SELECT IME, PREZIME, SK_GOD, SEM FROM STUDENT INNER JOIN UPISNI_LIST ON STUDENT.STUDENT_ID =UPISNI_LIST.STUDENT_ID

Ažuriranje, unos i brisanje podataka u pogledu Za razliku od stvarnih tablica, mogućnosti promjene podataka u pogledu podliježu znatnim ograničenjima. Mijenjanje, unos i brisanje podataka u pogledu nije dozvoljeno - ako je pogled formiran dohvaćanjem podataka iz više od jedne tablice - ako je pogled formiran grupnim upitom (group by) - ako je bilo koji atribut pogleda stvoren pomoću agregatne funkcije - ako se pri formiranju pogleda koristi opcija DISTINCT - ako je pogled formiran kao UNION query - ako je pogled formiran pomoću složenog upita sa podupitom Tako definirana ograničenja čine mogućnosti promjene podataka u pogledu vrlo ograničenim. Dodatna ograničenja mogu se aktivirati korištenjem izraza WITH CHECK u definiciji pogleda. Pomoću ove opcije provjerava se da li se unosom ili promjenom podataka narušava struktura pogleda, tj. da li promjena ili unos podataka zadovoljava uvjet naveden u upitu. Ako se opcija WITH CHECK ne navede u pogled je moguće unijeti podatke koji narušavaju strukturu pogleda Primjer: CREATE VIEW V1_STUDENT AS SELECT IME, PREZIME, ROD_DAT FROM STUDENT WHERE ROD_DAT>’01.01.1980’ je pogled koji prikazuje sve studente koji su roñeni nakon 1. siječnja 1980. Ovakav pogled može se ažurirati i brisati, budući zadovoljava sva gore navedena pravila. INSERT V1_STUDENT VALUES ( ‘Z’,’D’,’01.05.1979’) što je isto kao INSERT STUDENT(IME,PREZIME,ROD_DAT) VALUES ( ‘Z’,’D’,’01.05.1979’) Primjer: CREATE VIEW V1_STUDENT AS SELECT IME, PREZIME, ROD_DAT FROM STUDENT WHERE ROD_DAT>’01.01.1980’ WITH CHECK

Page 66: BP VEST Skripta

65

Uvoñenjem opcije provjere (WITH CHECK) instrukcija INSERT V1_STUDENT VALUES ( ‘Z’,’D’,’01.05.1979’) neće dati rezultat jer novi podatak koji se unosi ne zadovoljava uvjet ROD_DAT>’01.01.1980’ Ako se u tablici STUDENT nalazi podatak sa vrijednostima atributa IME=’P’, PREZIME=’R’ , ROD_DAT=’01.12.1980’ instrukcija UPDATE V1_STUDENT SET ROD_DAT=’01.11.1980’ where IME=’P’ AND PREZIME=’R’ može se izvesti jer je zadovoljeno ograničenje ROD_DAT>’01.01.1980’ Uklanjanje pogleda

Pogled se uklanja iz baze podataka naredbom DROP VIEW naziv_pogleda Primjer: DROP VIEW V1_STUDENT

9.17. OSNOVE VIŠEKORISNIČKOG RADA

Zbog većeg broja korisnika koji pristupaju bazama podataka, administrator baze ima zadatak ograničiti prava pristupa i korištenja podataka. Osnovni razlozi ograničenja prava pristupa podacima u bazi su: - mogućnosti neovlaštenog pristupa podacima - nestručno rukovanje podacima - moguće zloupotrebe DBA- Database administrator ( Administrator baze podataka) , kao ključna osoba u održavanju baze podataka je korisnik najvišeg prioriteta, koji ima sva prava pristupa. Ovisno o zadacima koje obavljaju pojedini korisnici DBA formira nove korisnike u bazi ADD USER ime_korisnika: šifra ime_korisnika (login) – korisničko ime koje mora biti jedinstveno u bazi podataka, tj. nije dozvoljeno da postoje dva različita korinika sa istim imenom šifra (password) – sigurnosna (tajna) šifra, kojom svaki korisnik potvrñuje svoj identitet Dodjeljivanje privilegija (prava) Prava pristupa pojedinim korisnicima dodjeljuju se naredbom

GRANT nazivi_prava ON naziv_objekta TO ime_korisnika nazivi_prava – lista prava pristupa podacima SELECT – pravo čitanja podataka UPDATE – pravo promjene (ažuriranja) podataka DELETE – pravo brisanja podataka INSERT - pravo unosa podataka naziv_objekta – ime objekta (tablice ili pogleda) u bazi na koji se prava odnose ime_korisnika – naziv korisnika kojem se prava dodjeljuju

Page 67: BP VEST Skripta

66

Primjeri: GRANT SELECT, UPDATE ON STUDENT TO K1 Korisniku K1 dodjeljuje se pravo čitanja i promjene podataka u tablici STUDENT GRANT SELECT, DELETE ON STUDENT TO K2 Korisniku K2 dodjeljuje se pravo čitanja i brisanja podataka u tablici STUDENT Sužavanje pojedinih prava na dijelove tablica i pogleda Prava promjene i unosa podataka moguće je suziti na pojedine atribute (kolone) u tablici INSERT (lista_atributa) – pravo unosa podataka u samo odreñene kolone UPDATE (lista_atributa) – pravo promjene podataka u navedenim kolonama tablice Primjer: GRANT SELECT, UPDATE(Datum, MjestoId) ON STUDENT TO K3 Korisniku K3 dodjeljuje se pravo čitanja i pravo promjene datuma i mjesta roñenja u tablici STUDENT Kaskadno dodjeljivanje privilegija Administrator baze podataka može pojedinim korisnicima, uz dodjeljivanje prava dati mogućnost proslijeñivanja tih prava drugim korisnicima.

GRANT nazivi_prava ON naziv_objekta TO ime_korisnika WITH GRANT OPTION Dodjeljivanjem prava uz opciju WITH GRANT OPTION, korisniku se daje mogućnost da po potrebi ta prava proslijedi drugima. Primjer: DBA: GRANT SELECT, UPDATE ON STUDENT TO K1 WITH GRANT OPTION K1 : GRANT SELECT ON STUDENT TO K2 Korisnik K1 proslijeñuje svoje pravo čitanja podataka korisniku K2

Opoziv (uklanjanje prava) Prethodno dodjeljena prava korisnicima mogu se ukloniti naredbom

REVOKE nazivi_prava ON naziv_objekta FROM ime_korisnika Primjer: REVOKE UPDATE ON STUDENT FROM K1 Prilikom uklanjanja prava moguće je korištenje dodatnih opcija CASCADE ili RESTRICT Primjer: REVOKE UPDATE ON STUDENT FROM K1 CASCADE Pravo promjene podataka u tablici STUDENT oduzima se korisniku K1, ali i svima onima kojima je korisnik K1 to pravo proslijedio. Primjer: REVOKE UPDATE ON STUDENT FROM K1 RESTRICT Pravo promjene podataka u tablici STUDENT oduzima se korisniku K1 samo u slučaju da on to pravo nije nikome proslijedio. Ako je K1 proslijedio pravo UPDATE prikazuju se podaci o korisnicima koji su to pravo naslijedili.

Page 68: BP VEST Skripta

67

Poništavanje prava naslijeñivanja Pravo daljnjeg dodijeljivanja privilegija, koje se daje sa opcijom WITH GRANT OPTION moguće je poništiti naredbom

REVOKE GRANT OPTION FOR nazivi_prava ON naziv_objekta FROM ime_korisnika Primjer: REVOKE GRANT OPTION FOR UPDATE ON STUDENT FROM K1 Korisniku K1 se oduzima pravo da dijeli UPDATE privilegiju drugima, a ujedno se brišu sva UPDATE prava koje je K1 prethodno dodijelio. Pri tome UPDATE pravo samog korisnika K1 ostaje sačuvano.

Grupiranje korisnika Radi lakšeg i bržeg dodijeljivanja prava korisnicima koji rade na istim poslovima i imaju slične potrebe za pristup pojedinim podacima, korisnici se povezuju u grupe

CREATE GROUP naziv_grupe FOR USERS (lista_korisnika) Primjer: CREATE GROUP KORISNICI FOR USERS (K1, K2, K3) Dodjeljivanjem prava grupi, prava se dodijeljuju svim korisnicima koji su članovi te grupe GRANT SELECT, UPDATE ON STUDENT TO KORISNICI Grupa korisnika može se naknadno mijenjati dodavanjem novih ili isključenjem nekog od postojećih članova te grupe

ALTER GROUP naziv_grupe ADD|DROP USERS (lista_korisnika) Primjer: ALTER GROUP KORISNICI ADD USERS (K6)

ALTER GROUP KORISNICI DROP USERS (K2,K3)

9. 18. OBRADA SQL UPITA Kada baza podataka primi SQL zahtjev za obradu odreñenih podataka, mehanizam za izvršenje upita (Database Engine) prolazi kroz niz koraka obrade zahtjeva (query compilation steps), prije neposrednog izvršenja. U prvoj fazi obrade (syntax checking phase), sistem prima upit i provjerava ispravnost sintakse SQL izraza. Izraz mora biti formiran u skladu sa pravilima SQL sintakse, te objekti koji se pozivaju u izrazu moraju postojati u bazi. Druga faza podrazumijeva provjeru prava pristupa pojedinih korisnika, tj. provjerava se da li korisnik koji je postavio upit ima valjano pravo pristupa na objekte koji se pozivaju u SQL upitu. Pošto su prve dvije faze završene, nastupa faza optimizacije upita (query optimization phase). Optimizacija SQL upita podrazumijeva odabir najboljeg i najbržeg načina za izvoñenje SQL upita, bilo da se radi o dohvatu podataka ili njihovoj promijeni (ažuriranju). U suvremenim relacijskim sustavima postoji nužna potreba za optimiranjem SQL upita. Pretpostavimo upit: SELECT IME, PREZIME FROM STUDENT , UPISNI_LIST WHERE STUDENT.STUDENT_ID =UPISNI_LIST.STUDENT_ID AND SEM=1 AND SK_GOD=’1999/00’ Pretpostavka je da se u tablici STUDENT nalazi 1000 studenata, a u tablici upisni list 3000 upisnih listova, od čega ih je 200 u 1. semestru školske godine 1999/00. Neka se upit izračunava bez ikakve optimizacije. Mogući tok izvoñenja ovakvog upita bio bi slijedeći: 1. Izračunava se Kartezijev produkt tablica STUDENT i UPISNI_LIST, tj. svaki student sa svakim

upisnim listom. Dobijeni meñurezultat sadrži 3.000.000 redova. S obzirom da je veličina radne

Page 69: BP VEST Skripta

68

memorije ograničena, sustav ne može držati toliku količinu podataka u radnoj memoriji, već ih pohranjuje na disk.

2. Dobijeni Kartezijev produkt reducira se WHERE uvjetom. Ponovno je potrebno učitati 3.000.000 redova sa diska u radnu memoriju i nad svakim redom provesti WHERE uvjet. Sada rezultat sadrži samo 200 redova, koji se projiciraju nad atributima IME i PREZIME.

Optimizacijom upita tijek izvršavanja bio bi slijedeći. 1. Najprije se izvršava restrikcija tablice UPISNI_LIST i izdvajaju se samo oni upisni listovi koji

zadovoljavaju uvjetni dio izraza SEM=1 AND SK_GOD=’1999/00’. Dobijeni meñurezultat sadrži 200 redova i može se privremeno držati u radnoj memoriji.

2. Provodi se spajanje dobijenog meñurezultata sa tablicom student na temelju izraza STUDENT.STUDENT_ID =UPISNI_LIST.STUDENT_ID. Iz tablice STUDENT dohvaća se 1000 redova a dobijeni rezultat spajanja sadrži 200 redova.

3. Rezultat se projicira nad atributima IME i PREZIME Očito je da se jedan upit može obraditi na više mogućih načina. Pri tome pojedine metode obrade upita troše više računarskih resursa (memorije, ulazno/izlaznih operacija itd.). Radi brzine izvoñenja upita i racionalnog korištenja resursa pri izvoñenju upita bitna je optimizacija tj. odabir najpovoljnijeg načina. Suvremeni sustavi baza podataka rješavaju problem optimizacije upita automatski, tj. optimizacijski mehanizam ugrañen je u sustav baze podataka.

Page 70: BP VEST Skripta

69

9.19. METODE POVEZIVANJA TABLICA Povezivanjem (join) dvaju tablica podrazumijevamo proces kombiniranja tj. povezivanja redova jedne tablice sa redovima druge tablice, da bi se dobili rezultati postavljenog SQL upita. Bez obzira da li je upitni izraz formuliran u obliku Kartezijevog produkta ili join veze, interni mehanizmi baze podataka aktiviraju istovjetne postupke. Proces povezivanja dvaju tablica odvija se kroz dva koraka. U prvom, pristupa se redovima u jednoj od zadanih tablica, koja se uobičajeno naziva vanjska (outer).Drugi korak podrazumijeva pristup drugoj tablici (unutrašnjoj – inner), pri čemu se redovi druge tablice kombiniraju sa dobijenim meñurezultatima iz prvog koraka. Rezultat koji se dobije je složena tablica, koja sadržava sve redove proizašle iz ovakvog povezivanja. METODA UGNJEŽ ðENE PETLJE (NESTED LOOP JOIN) Pogledajmo primjer slijedećeg upita SELECT T1.C1, T1.C2, T2.C3, T2.C4 from T1,T2 where T1.C1=5 and T1.C2=T2.C3 što je isto kao i izraz SELECT T1.C1, T1.C2, T2.C3, T2.C4 from T1 INNER JOIN T2 ON T1.C2=T2.C3 where T1.C1=5 Za realizaciju veze izmeñu ovih tablica smatrajmo tablicu T1 vanjskom (outer table). Prvi korak ovog upita podrazumijeva izdvajanje redova tablice T1 koji zadovoljavaju uvjetni dio izraza – T1.C1=5. Izdvajanjem ovih redova dobija se meñurezultat koji se pohranjuje u privremenu tablicu (IT1). Nakon što je dobijen meñurezultat, za svaki tako izdvojeni redak, pristupa se podacima u tablici T2. IT1 T2 C1 C2 C3 C4 5 19 17 22 5 13 19 24 5 15 15 28 5 17 19 27 5 12 12 29 5 19 14 31 5 18 13 25 Interni pokazivač u tablici IT1 nalazi se na prvom redku, te se izdvaja vrijednost atributa po kojem se vrši povezivanje (C2). Ta vrijednost je 19. Zatim se redom pretražuju redovi u tablici T2, te se izdvajaju oni redovi za koje vrijedi da je T2.C3=19. Kada se završi pretraživanje T2, pokazivač u tablici IT1 pomiče se na slijedeći redak, ponovno se utvrñuje vrijednost atributa C2 (13), te se ponovno pretražuje tablica T2 i traže oni redovi za koje vrijedi da je T2.C3=13 itd. U općem slučaju algoritam povezivanja metodom ugnježñene petlje može se prikazati SELECT * INTO IT1 FROM T1 WHERE T1.C1=5 (m redova) SELECT m=COUNT(*) FROM IT1 SELECT n=COUNT(*) FROM T2 FOR I=1 TO m P1=I FOR J=1 TO n P2=J IF P1->C2 = P2-> C3 THEN ISPIS IT1.C1,IT1.C2, T2.C3,T2.C4 NEXT J NEXT I gdje je P1 pokazivač u tablici IT1, a P2 pokazivač u tablici T2.

Page 71: BP VEST Skripta

70

MERGE JOIN METODA Izvršavanje ove metoda sastoji se od dva koraka. Prvi korak u realizaciji podrazumijeva izdvajanje redova koji zadovoljavaju uvjetni izraz, ali u točno ureñenom redoslijedu, sortirano po vrijednostima u kolonama preko kojih se vrši spajanje. Dakle nakon izdvajanja redova koji zadovoljavaju uvjetni izraz, obje tablice se sortitraju po vrijednosti join kolona . IT1 IT2 C1 C2 C3 C4 5 12 12 29 5 13 13 25 5 15 14 31 5 17 15 28 5 18 17 22 5 19 19 24 5 19 19 27 Za realizaciju veze izmeñu tablica, svakoj tablici dodijeljuje se interni pokazivač, koji je na početku postvaljen na prvi redak u tablici. Za tekući položaj pokazivača u svakoj tablici usporeñuju se vrijednosti u kolonama po kojima se vrši spajanje, te se pokazivači pomiču prema dnu tablica. SELECT * INTO IT1 FROM T1 WHERE C1=5 ORDER BY C2 SELECT * INTO IT2 FROM T2 ORDER BY C3 P1=IT1(1) P2=IT2(1) PETLJA: WHILE (TRUE) { WHILE (P1→C2 >P2→C3) { P2++ IF (P2 OUT ) EXIT PETLJA; } WHILE (P1→C2 < P2→C3) { P1++ IF (P1 OUT ) EXIT PETLJA; } IF (P1→C2 = P2→C3)

{ MEMP=P2; WHILE (P1→C2 = P2→C3) { ISPIS IT1.C1.IT1.C2, IT2.C3, IT2.C4 ; P2++; } } P1++; IF( P1 OUT) EXIT PETLJA; IF (P1→C2= MEMP→C3) P2=MEMP; }

Page 72: BP VEST Skripta

71

10. TRANSAKCIJE-(TRANSACTIONS)

Osnovna namjena suvremenih DBMS sustava za rukovanje bazama podataka je omogućavanje istovremenog rada većoj grupi korisnika nad istom bazom podataka. Pri tome jedni unose podatke, drugi ih ažuriraju, a treći samo pretražuju. Temeljem takvog rada, česti su slučajevi da više korisnika dohvaća istu grupu podataka. Pri tome korisnik ima dojam da samo on pristupa podacima, neovisno od ostalih korisnika. Transakcija je skup SQL instrukcija koje se izvršavaju zajedno. Transakcija počinje oznakom BEGIN TRAN, a završava pozitivnim ishodom (izvršenjem transakcije) – COMMIT TRAN, ili negativnim ishodom (poništenjem transakcije) - ROLLBACK TRAN. Transakcija se sastoji od više SQL instrukcija. Transakcija ima pozitivan ishod samo ako se sve instrukcije koje su obuhvaćene transakcijom izvrše bez greške. Primjer: head (STUDENT)={student_id, ime, prezime}, gdje je student_id =PK(STUDENT), IDENTITY head(UPISNI_LIST)={ulist_id, student_id, sem,sk_god}, gdje je ulist_id=PK(UPISNI_LIST), IDENTITY BEGIN TRAN insert into STUDENT values (‘X’,’Y’) st=@IDENTITY if st IS NULL ROLLBACK TRAN insert into UPISNI_LIST values (st, 1, ‘1999/00’) ul=@IDENTITY if ul IS NULL ROLLBACK TRAN COMMIT TRAN Sve instrukcije obuhvaćene transakcijom izvršavaju se po principu sve ili ništa, tj. u slučaju prekida transakcije zbog greške u nekoj od instrukcija, poništavaju se sve akcije koje su transakcijom obuhvaćene. Prilikom pokretanja transakcije sve akcije koje su njom obuhvaćene, odvijaju se u posebnom dijelu baze, koji se naziva transakcijski log (transaction log). U slučaju uspješnog završetka transakcije, rezultati tj. podaci koji proizlaze iz transakcije, zapisuju se fizički na disk u bazu podataka. To znači da su rezultati koje je transakcija dala, vidljivi tek nakon što se stvarno fizički zapišu u bazu na disku.

Značenje transakcijskog log-a

Gore opisani princip izvoñenja transakcija eliminira neke moguće probleme koji bi se mogli javiti, kod izravnog djelovanja pojedinih djelova transakcije na samim podacima u bazi. Primjer:

BEGIN TRAN UPDATE P1

... ... ROLLBACK TRAN Problem “pamćenja” prethodnog stanja Kada bi pojedine SQL instrukcije djelovale izravno na podatke u tablicama, javio bi se problem pamćenja prethodnog stanja. U gornjoj transakciji instrukcija UPDATE P1, mijenja odreñeni skup podataka. Kada bi ona djelovala izravno na podatke, odmah bi izazvala promjene podataka na disku. Ako se ovakva transakcija u svom daljnjem tijeku završi sa ROLLBACK-om, potrebno je poništiti promjene koje je transakcija izazvala tj. vratiti stanje prije instrukcije UPDATE P1, što znači da bi se moralo “pamtiti” i pohranjivati podatke kakvi su bili prije te instrukcije.

Page 73: BP VEST Skripta

72

Vrijeme Tf

Problem zavisnosti o nepotvrñenoj promjeni Promotrimo primjer meñuzavisnosti dvaju transakcija na slici 17.

Transakcija T1 vrijeme Transakcija T2

AŽURIRANJE P1 t1 ------

-----

t2

SELECT P1

ROLLBACK

t3

Slika 17. Zavisnost podataka o nepotvrñenoj promjeni

Transakcija T1 u prvom koraku ažurira podatke P1. Kada bi ovi podaci bili odmah fizički promijenjeni u tablici, tu promijenu mogli bi vidjeti i drugi korisnici. U trenutku t2 nastupa transakcija T2, koja čita izmjenjene podatke P1. Transakcija T1 izvršava se dalje i završava ROLLBACKOM, što znači da se sve akcije te transakcije poništavaju, pa podaci P1 ostaju u stanju prije promjene. U ovom slučaju P1 bi pročitao krive podatke! Uloga transakcijskog log-a kod sistemskih prekida Računala na kojima se nalaze baze podataka podložna su sistemskim prekidima (tzv. soft crash). Jedan od čestih tipova sistemskih prekida je gubitak napajanja. Nestanak struje se može dogoditi u trenutku izvršavanja neke transakcije, ili u trenutku kad se rezultati neke transakcije zapisuju u bazu podataka na disk. Kako znati gdje je sustav “stao”, tj. što je od tekućih operacija izvršeno a što nije?

Slika 18. Stanje transakcija u transakcijskom logu Stanje izvršavanja svih transakcija bilježi se u transakcijskom log-u (Slika 18). Nakon odreñenog perioda sustav uvodi tzv. kontrolne točke (checkpoint). U trenutku kada nastupa checkpoint, pokreće se fizički zapis podataka u tablicu na disku za sve transakcije koje su obavljene u log-u, a čiji sadržaj nije još zapisan u bazu. Sve transakcije koje su u tijeku u trenutku uzimanja checkpointa, pamte se u posebnoj checkpoint datoteci. U slučaju prekida u sustavu, nakon ponovnog pokretanja, sustav ulazi u režim oporavka (recovery). Oporavak počinje pregledom checkpoint datoteke i ustanovljavanjem koje su transakcije bile u tijeku. Nakon toga slijedi prijelaz u transakcijski log, gdje počinje pregled onih transakcija koje su zabilježene u checkpoint –logu, kao i svih kasnijih. Transakcije koje su obavljene u transakcijskom logu, a njihov rezultat nije zapisan u tablice, pokreću se ponovo (REDO) , a one koje u trenutku prekida nisu bile dovršene uklanjaju se (UNDO).

T1

T2

T3 T4

checkpoint

Page 74: BP VEST Skripta

73

Primjer: Promatra se stanje izvršavanja transakcija u vremenskom periodu prema slici 18. Nastupanjem kontrolne točke (checkpoint), rezultati svih završenih transakcija (a to je u ovom slučaju samo T1) zapisuju se fizički u tablice baze podataka. U checkpoint datoteku pohranjuju se podaci o transakcijama koje su u trenutku uzimanja kontrolne točke bile u izvršavanju (T2). Pretpostavka je da sistemski prekid nastupa u trenutku Tf. Transakcije T2 i T4 još uvijek nisu završene, dok je transakcija T3 izvršena u transakcijskom logu, ali je neizvjesno da li je njezin sadržaj zapisan u bazu. Kod postupka oporavka, sustav provjerava checkpoint datoteku i utvrñuje da je u trenutku posljednje kontrole log-a u tijeku bila transakcija T2. Zatim prelazi u transakcijski log, te kontrolira stanje transakcije T2 i onih koje su započete poslije T2 (T3 i T4). Budući transakcije T2 i T4 nisu završene u transakcijskom logu, one se poništavaju, a transakcija T3 se ponavlja. Zaklju čavanje podataka u bazi Svaka transakcija obavlja se u relativnoj izolaciji u odnosu na druge transakcije, tj. vrijedi pravilo da nitko drugi ne može pristupiti podacima koje jedan korisnik mijenja ili briše, ali podatke koje jedan korisnik čita mogu čitati i drugi korisnici, jer samo čitanje podataka ne donosi nikakve promjene na podacima. Ovakav sustav zaštite pristupa podacima realizira se zaključavanjem onih dijelova baze podataka nad kojima se provode pojedine operacije, tj. postavljanjem lokota (lock). Sustavi baza podataka prepoznaju dvije vrste lokota : djeljivi lokot (shared), koji se postavlja na podacima koji se samo iščitavaju (select), i ekskluzivni lokot (exclusive), koji se postavlja na podacima koji se obrañuju. Lokot nad odreñenim podacima postavlja sustav baze podataka automatski u zavisnosti o tipu akcije koja se nad podacima provodi. Kada neka transakcija T2 zahtijeva pristup podacima za obradu, ona ujedno traži lokot nad tim podacima.Ukoliko iste podatke obrañuje neka druga transakcija T1, ona već drži lokot nad tim podacima. Ishod ovakvog stanja zavisi od tipa obrade nad podacima koje pojedine transakcije vrše. Slika 19. prikazuje meñusobne veze meñu lokotima, u redovima su prikazani lokoti koje drži transakcija T1, a po stupcima lokoti koje zahtjeva transakcija T2.

T1\T2 X S X N N S N D

Slika 19. Ponašanje sustava u meñudjelovanju lokota

Iz toga je vidljivo da dvije transakcije mogu pristupiti istim podacima jedino ako obje transakcije isključivo čitaju podatke. Problem gubitka ažuriranih informacija Meñudjelovanje dvaju transakcija i nužnost primjene lokota može se uočiti na slijedećem primjeru dvaju transakcija:

T1 vrijeme T2 dohvat P1 t1 ----

---- t2 dohvat P1 ažuriranje P1 t3 -----

COMMIT t4 ažuriranje P1 t5 COMMIT

Primjer pokazuje meñudjelovanje dvaju transakcije, gdje T1 mijenja podatke P1, a T2 traži pristup istim podacima dok T1 još nije završen. Transakcija T1 primila je podatke P1 u obradu, i izvršila ažuriranje podataka P1. U trenutku t2, pristup istim podacima traži T2, ali T1 još uvijek traje, što znači da promjena podataka P1 još nije zapisana u odgovarajuću tablicu, pa T2 čita prethodno stanje podataka P1 bez promjena koje je izvršila transakcija T1. Tek u trenutku t4 završava T1 i rezultati transakcije se zapisuju u

Page 75: BP VEST Skripta

74

tablicu. U trenutku t5 završava transakcija T2 koja svoje “rezultate” zapisuje fizički u tablicu, te poništava promjene koje je izvršila transakcija T1. Rješenje ovog problema primjenom lokota (lock)

T1 vrijeme T2 dohvat P1 - postavlja S lock t1 ----

----

t2

dohvat P1 - postavlja S lock

ažuriranje P1

traži X lock - ne dobija ga i čeka

t3

----

čekanje

t4

ažuriranje P1 traži X lock - ne dobija ga i čeka

čekanje

t5

čekanje

U trenutku t1 transakcija T1 dohvaća podatke P1 i na njima postavlja djeljivi lokot. U trenutku t2 istim podacima pristupa transakcija T2 i postavlja svoj djeljivi lokot. Transakcija T1 u trenutku t3 treba izvršiti promjenu na podacima, te traži pretvaranje svog djeljivog lokota u ekskluzivni (X-lock). Taj lokot ne dobija budući transakcija T2 nad istim podacima drži S-lock. Transakcija T2 takoñer traži X-lock, ali bez uspjeha jer postoji S-lock od strane transakcije T1. Ne dolazi do gubitka informacija, ali obje transakcije prelaze u stanje čekanja. Ova pojava se naziva deadlock. Dvije transakcije svojim zahtjevima blokiraju jedna drugu, te onemogućavaju pristup podacima. Sustavi baza podataka imaju ugrañene mehanizme za detekciju deadlock-a. Uobičajeni način razrješavanja ovakve situacije je prekid jedne od transakcija, što drugoj omogućava normalan nastavak i izvršavanje do kraja. Razumljivo deadlock nije zadovoljavajuće rješenje meñudjelovanja transakcija. Umjesto toga interni mehanizmi baze podataka vrše prilagoñavanje lokota strukturi same transakcije.

T1 vrijeme T2 dohvat P1 - postavlja X lock t1

----

---- t2 dohvat P1 traži S lock- ne dobija ga i čeka

ažuriranje P1

t3

čekanje

COMMIT –oslobaña lokot t4 čekanje

---

t5

dohvat P1- dobija S lock Djelovanje lokota razrješava ovakve situacije, jer omogućava da se promjene na podacima odvijaju u relativnoj izolaciji, pa u navedenom slučaju, transakcija T2 može pristupiti podacima P1, tek nakon što T1 izvrši promjenu, a u tom slučaju transakcija T2, čita stvarne podatke, dakle nakon njihove promjene. Nivoi zaklju čavanja Sustav može postaviti lokot ili na stranicu memorije (page) ili na cijelu tablicu. Kad god je to moguće, postavlja se lokot na stranicu. Razlog je u činjenici da takvo postavljanje lokota čini podatke dostupnijim korisnicima (istovremeno više korisnika može pristupiti podacima iz iste tablice, ali sa različitih stranica), a i dohvat podataka je brži.

Page 76: BP VEST Skripta

75

11. HIJERARHIJSKI MODEL PODATAKA Hijerarhijski model baze podataka i sustavi za upravljanje pojavili su se na tržištu potkraj 60-ih godina prošlog stoljeća, a neki od tih sustava još i danas su u upotrebi. Zanimljivo je da ove baze nisu nastale na temelju prethodno definiranog modela, kao što je to slučaj sa relacijskim bazama.Umjesto toga osnove hijerahijskog modela razvijene su na osnovu već implementiranog IBM-ovog IMS sustava (Information Managment System). STRUKTURA HIJERARHIJSKOG MODELA PODATAKA Hijerarhijski model podataka baziran je na slogovima (record) koji se sastoje od polja (field). Ureñeni skup slogova u hijerarhijskom modelu naziva se stablo (three), a baza podataka sastavljena je od ureñenog skupa stabala. Svako stablo ima jedan osnovni slog (root) i nula ili više slogova podstabla. Odnos izmeñu tih slogova naziva se odnos roditelj dijete (parent-child relationship). Jedan slog kao roditelj (parent) može imati više slogova djece (child), ali jedan child slog može imati samo jedan parent slog. Primjer: Baza podataka obrazovanja Baza podataka opisuje podatke o održavanju tečajeva. Svaki tečaj ima svoje osnovne podatke, te može zahtjevati odreñeno predznanje, tj. preduvjet za pohañanje jednog tečaja može biti da je polaznik završio neki drugi tečaj. Baza sadrži podatke : - za svaki tečaj: šifru i naziv tečaja - za svaki tečaj koji ima uvjet o potrebnom predznanju, šifru tečaja koji mora biti prethodno završen. - za svaki termin održavanja tog tečaja: datum, mjesto, podaci o nastavniku koji održava tečaj, te

podaci o polaznicima tečaja - za svakog nastavnika: šifra, prezime i ime - za svakog polaznika: šifra polaznika, prezime, ime i ocjena Slogovi kojima se opisuje ovakva baza podataka su: TECAJ s poljima TECAJID i NASLOV ---- TECAJ(TECAJID,NASLOV) PREDUVJET(PREDUVJETID) TERMIN(TERMINID, DATUM,MJESTO) NASTAVNIK(NASTID,PREZIME,IME) POLAZNIK(POLID, PREZIME,IME,OCJENA) TECAJ

TECAJID NASLOV PREDUVJET TERMIN

PREDUVJETID TERMINID DATUM MJESTO NASTAVNIK POLAZNIK NASTID IME PREZIME POLID IME PREZIME OCJENA Baza podataka ima osnovni slog TECAJ koji ima dva podstabla TERMIN i PREDUVJET. Slog podstablo PREDUVJET je root-only tj. nema svoje podslogove, a slog TERMIN ima dva child-sloga NASTAVNIK i POLAZNIK. Za svaku pojavu parent sloga postoji n child slogova , gdje vrijedi (n≥0). Veza izmeñu parent i child sloga naziva se link. Ovdje se može uočiti razlika u odnosu na relacijski model: podaci koji su u relacijskoj bazi povezani pomoću stranih ključeva, u hijerarhijskoj bazi su povezani preko veze roditelj-dijete ( parent-child). Dakle veza izmeñu slogova TECAJ i TERMIN nije definirana posebnim poljem TECAJID (koje bi predstavljalo strani ključ), već vezom TECAJ-TERMIN.

Page 77: BP VEST Skripta

76

Struktura IMS sustava Jezik za manipulaciju podacima u hijerarhijskoj bazi sastoji se od skupa operatora pomoću kojih se obrañuju podaci u stablima. Operatori uključuju: - operator za lociranje pojedinog stabla u bazi, tj. operator za lociranje osnovnog root sloga za pojedino

stablo - operator za pomicanje s tekućeg stabla na slijedeće - operator za pomicanje sa sloga na slog unutar stabla, hijerarhijski prema gore ili prema dolje - operator unosa podataka na točno specificirano mjesto u strukturi stabla - operator brisanja pojedinog sloga u stablu Cjelovitost i konzistentnost podataka, tj. njihov integritet u hijerarhijskom modelu, zasnovan je na samoj koncepciji modela. Postoje odreñena pravila definirana modelom, koja moraju zadovoljavati svi podaci: - niti jedan slog ne može postojati kao child slog ako za njega ne postoji parent slog - u slučaju brisanja parent sloga, sustav automatski briše sve child slogove Definicija podataka IMS sustav koristi tri osnovna elementa za definiciju podataka: - DBD (Database description) element za opis baze podataka, i definiranje strukture baze. U gruboj

aproksimaciji može se reći da DBD odgovara relacijskoj naredbi CREATE TABLE - PCB (Program Communication Block) – blok za kreiranje pogleda kojima korisnik pristupa.

Ekvivalent relacijskoj instrukciji CREATE VIEW. - Naredbe za definiciju sloga (SEGM) i polja (FIELD) Prethodno opisana baza podataka mogla bi se prikazati slijedećom strukturom 1. DBD NAME=TECAJDB 2. SEGM NAME=TECAJ, BYTES=36 3. FIELD NAME=(TECAJID, SEQ), BYTES=3, START=1 4. FIELD NAME=NASLOV, BYTES=33, START=4 5. SEGM NAME=PREDUVJET, PARENT=TECAJ, BYTES=3 6. FIELD NAME=(PREDUVJETID,SEQ), BYTES=3, START=1 7. SEGM NAME=TERMIN, PARENT=TECAJ, BYTES=21 8. FIELD NAME=(TERMINID,SEQ), BYTES=3, START=1 9. FIELD NAME=DATUM, BYTES=6, START=4 10.FIELD NAME=MJESTO, BYTES=12, START=10 11.SEGM NAME=NASTAVNIK, PARENT=TERMIN, BYTES=27 12.FIELD NAME=(NASTID,SEQ), BYTES=3, START=1 13.FIELD NAME=IME, BYTES=12, START=4 14.FIELD NAME=PREZIME, BYTES=12, START=16 15.SEGM NAME=POLAZNIK, PARENT=TERMIN, BYTES=28 16.FIELD NAME=(POLID,SEQ), BYTES=3, START=1 13.FIELD NAME=IME, BYTES=12, START=4 14.FIELD NAME=PREZIME, BYTES=12, START=16 15.FIELD NAME=OCJENA, BYTES=1, START=28 IMS ne podržava specifične tipove podataka poput onih koji se definiraju u relacijskom modelu, već sva polja smatra bajt stringovima (nizovima bajtova). Stoga se pri definiciji pojedinog polja navodi samo njegova duljina u bajtovima. Korisnički pogled je dio hijerarhije baze podataka sličan konceptu pogleda u relacijskoj bazi.

Page 78: BP VEST Skripta

77

Primjer: 1. PCB DBDNAME=VTECAJ 2. SENSEG NAME=TECAJ, PROCOPT=G 3. SENSEG NAME=TERMIN, PARENT=TECAJ, PROCOPT=G 4. SENFLD NAME=TERMINID, START=1 5. SENFLD NAME=DATUM, START=4 6. SENSEG NAME=POLAZNIK, PARENT=TERMIN, PROCOPT=G Manipulacija podacima u IMS sustavu IMS ima vlastiti jezik za manipulaciju podacima (data manipulation language), koji se pomoću običnih poziva uključuje u programe pisane u nekom od jezika treće generacije (COBOL, PL/I). Primjer jednog poziva iz PL/I jezika izgledao bi: CALL PLITDLI (5, GU, VTECAJ, OUT, TECAJ WHERE NASLOV=”Fizika”,POLAZNIK WHERE OCJENA=4) gdje je značenje pojedinih argumenta 5 – ukupan broj argumenata u pozivu instrukcije GU – Get unique, dobavlja prvi slog koji zadovoljava postavljene kriterije VTECAJ – struktura (pogled) u kojoj se pristupa podacima OUT – struktura koja prihvaća podatke ostali argumenti predstavljaju uvjete temeljem kojih se pristupa podacima Strukture pohrane podataka Hijerarhijski sustav podržava dvije osnovne strukture pohrane (spremanja ) podataka. 1. HSAM – hierarhic sequential access method – direktna metoda pristupa, cijela baza je predstavljena

kontinuirano, kao na magnetskoj traci (Slika 20). Dapače, čest slučaj u praksi bio je da su ovakve baze pohranjivane na magnetsku traku.

TECAJ M11 PREDUVJET1 PREDUVJET2 TERMIN1 NASTAVNIK1 POLAZNIK1 POLAZNIK2

POLAZNIK3 TERMIN2 NASTAVNIK2 POLAZNIK4 POLAZNIK5 TECAJM12 ...

Slika 20. HSAM struktura pohrane podataka

2. HISAM - hierarhic indexed sequential access method (indeksna metoda) – dopušta indeksni pristup

do osnovnih slogova stabla (root) i sekvencijalni pristup do child slogova (Slika 21).

Indeks M10 M11 M12 ... TECAJ M11 PREDUVJET1 PREDUVJET2 TERMIN1 NASTAVNIK1 POLAZNIK1 POLAZNIK2

POLAZNIK3 TERMIN2 NASTAVNIK2 POLAZNIK4 POLAZNIK5 TECAJM12 ...

Slika 21. HISAM struktura pohrane podataka

Page 79: BP VEST Skripta

78

LITERATURA

1. P. O’Neil: “Database - Principles, Programming, Performance”, Morgan Kaufmann Publishers, 1994.

2. C.J. Date: “An Introduction to Database Systems I”, Addison-Wesley Publishing Company, 1990.

3. J.L. Harrington: “Relational Database Design Clearly Explained”, Morgan Kaufmann Publishers, 1998.

4. T.J. Teorey: “Database Modeling & Design”, Morgan Kaufmann Publishers, 1999.

5. R. Vujnović: “SQL i relacijski model podataka”, Znak, Zagreb, 1995.

6. “Microsoft SQL server, Database Developer’s Companion”, Microsoft Press, 1996.