Kako postati programer (10): relacione baze, prosleđivanje parametara funkciji, stack, heap, regex
U prethodnom broju ste videli kako se prave tabele i kako se obavljaju osnovni upiti u bazu podataka, a sada ćemo pokazati šta je to „relaciono” u relacionim bazama Foreign key Join Sintaksa SQL jezika koja se koristi je sledeća: SELECT (prikaz svih kolona koje nas zanimaju iz tabela koje nas zanimaju) FROM (iz koje tabele će se inicijalno vući podaci) JOIN (tabela za povezivanje sa ovom od malopre) ON (koje kolone između tabela su povezane) Ako sada promenite ime gosta u njegovoj tabeli, zahvaljujući relacijama koje smo uspostavili, automatski će se promeniti ime ovog gosta svuda gde se on pominje u tabeli „Narudžbine”. Uz to, baza neće dozvoliti unos u tabelu „Narudžbine” gosta koji ne postoji i zabraniće brisanje gostiju iz baze koji su nešto već naručili, jer bi se tako uzurpirala tabela sa „Narudžbinama”. One-to-Many, Model, EER Diagram Foreign keyeve ste mogli da napravite direktno preko opcije alter table i biranjem odgovarajućeg taba. Međutim, postoji lakši način dizajniranja tabela u bazi i relacija između njih. Radi se o modelu baze, a svaki model može da se predstavi EER dijagramom. EER dijagram je odličan za vizuelni prikaz tabela i relacija između njih u vidu nodova povezanih linijama (vidi sliku). Model i dijagram možete napraviti iz postojeće baze opcijom DataBase -> Reverse Engineer u Workbenchu, a možete da ih kreirate i „od nule”. Još jedan bitan termin u vezi sa bazama je kardinalnost relacije, što se lako može videti putem dijagrama. Ako biste izmenili relaciju da bude one-to-one, onda bi svaki gost mogao da ima samo jednu narudžbinu. Ukoliko bi isti gost poručio novo jelo, baza bi prijavila grešku da unos gosta u tabelu „Narudžbine” nije jedinstven. Vrlo važna napomena je da menjanjem modela ne menjate automatski svoju bazu. Model je odvojen od baze i potrebno je da ga nakon svake izmene sinhronizujete – u ovom slučaju sa vašom lokalnom bazom, ali možete i sa bilo kojom drugom kojoj imate pristup. Model je zapisan u fajlu na hard disku, pa ga možete koristiti da, na primer, sinhronizujete bazu svog programa koja se nalazi na zvaničnom serveru i njenu lokalnu kopiju na vašem računaru. Ako ste napravili izmenu da konekcija između gostiju i narudžbina bude „1-1”, nakon sinhronizacije sa bazom videćete da se vaša baza promenila. Naime, kolona gosti u tabeli „Narudžbine” dobila je atribut „UQ” (unique). Naravno, ovo ste mogli i ručno da uradite i bez posezanja za modelom/dijagramom. Baze – zaključak Ovo su neke osnove relacionih baza podataka. Posebna problematika je da sa bazom povežete aplikaciju koju programirate. Tada je čest korak da napravite klase sa poljima koja su slična tabelama i kolonama iz baze, a takve klase se obično nazivaju entitetima. Zatim, nije loše znati za pojam transakcije u bazi. To je mehanizam bezbednosti u slučaju nepredviđenog prekida unosa serije (bloka) podataka u bazu. Podaci iz serijskog unosa nisu vidljivi prilikom upita sve dok se ne završi i poslednji unos. Takođe, baza ima mogućnost da vrati (roll-back) podatke na prethodno ispravno stanje, ukoliko je došlo do nepredviđenog prekida upisa. Ukupno postoje četiri osnovna sistema zaštite koji se skraćeno nazivaju ACID. Za kraj, napominjemo da model i EER dijagram služe samo za dizajniranje baze, ne i za unos podataka u nju. Za razliku od relacionih, postoje i nerelacione baze podataka. One imaju malo drugačiju filozofiju, i jedna od najočiglednijih razlika je da njihove tabele nemaju striktnu strukturu. Na primer, tabela u jednom redu može da ima dva polja, u sledećem deset, ili, drugim rečima, različit broj kolona. Svako polje može da sadrži drugi tip podataka. Pass by reference/value int x = 5; int y = x; y = 8; System.out.println(x); //5 System.out.println(y); //8 NekaKlasa k1 = new NekaKlasa(); NekaKlasa k2 = new NekaKlasa(); k1.y = 5; k2 = k1; k2.y = 7; System.out.println(k1.y); //7 System.out.println(k2.y); //7 Zašto je promenjena vrednost promenljive k1? Poenta je u tome što su to referentne promenljive. Kada ste napisali korak k2 = k1, vi ste podesili da k2 pokazuje (referiše) na deo memorije (objekat) na koji pokazuje i k1. Sada, bilo da menjate k1 ili k2, menjate isti objekat. Možete se zapitati kako onda da kopirate referentne promenljive tako da pokazuju na objekte iste klase, a da se menjanjem jedne ne menja i objekat druge. Potrebno je upravo to, da pokazuju na dva različita objekta istog tipa. To se radi ručnim kopiranjem objekata (zbog jednostavnosti pretpostavimo da je polje y primitivna promenljiva.): NekaKlasa k1 = new NekaKlasa(); NekaKlasa k2 = new NekaKlasa(); //k1 = k2; preskacemo k1.y = 5; k2.y = 5; Ako biste pravilnije pratili OOP princip, napisali biste tzv. copy konstruktor koji vrši isto ovakvo izjednačavanje po poljima, pa biste k2 kreirali sledećom linijom kôda: NekaKlasa k2 = new NekaKlasa(k1); Sada stižemo do pitanja šta se dešava kada promenljivu prosledite u funkciju. Za Javu je poznato da radi po principu pass-by-value, tj. da se u funkciji kreira kopija prosleđene promenljive. U slučaju integera, menjanjem promenljive u funkciji nećete uticati na vrednost originalne promenljive. Međutim, u slučaju referenci to ne važi. Referentna promenljiva unutar funkcije je zaista kopija originalne reference, ali i kopija i original i dalje pokazuju na isti objekat. package XXX; public class XXX { static class NekaKlasa { int y; } public static void main(String[] args) { int x = 5; NekaKlasa k = new NekaKlasa(); k.y = 10; System.out.println(x); //5 System.out.println(k.y); //10 promeni(x); promeni(k); System.out.println(x); //5 System.out.println(k.y); //20 } public static void promeni(int x1){ x1 = 6; } public static void promeni(NekaKlasa k1){ k1.y = 20; } } Postoje mehanizmi kojima ova pravila mogu da se premoste. U jeziku C++ možete korišćenjem znaka „&” forsirati da prosleđujete promenljivu po referenci. Na taj način možete da menjate originalnu primitivnu promenljivu. U slučaju Jave ne postoji način da se parametar prosledi kao referenca. Ali, pomenuli smo da u Javi postoje objekti analogni primitivnim promenljivama, pa je tako int primitivan, a Integer objekat. Ako ste promenljivu u startu definisali kao Integer (objekat), menjanjem parametra funkcije ipak menjate originalni Integer. Slično, postoje načini da se reference prilikom prosleđivanja funkcija razdvoje, tako da svaka pokazuje na sopstveni objekat. Stack, heap, rekurzija Čuveni sajt Stack Overflow dobio je naziv po grešci koju operativni sistem izbacuje kada se prepuni stek memorija. Ovu grešku je vrlo lako reprodukovati pozivom beskonačne rekurzivne funkcije. Rekurzivna funkcija nije ništa drugo nego funkcija koja u svom telu poziva samu sebe. Nećemo pisati primer, jer vrlo lako možete da pronađete implementaciju klasične rekurzivne funkcije pomoću koje se pronalazi faktorijel nekog broja. Kada budete želeli da proširite znanje o rekurziji, pronađite šta je to tail rekurzija, koja ima neke specijalne osobine i kojom se izbegava „Stack Overflow” greška. Svaki put kada program „pukne”, IDE će izlistati stek (stack trace) i među trenutno aktivnim podacima u stek memoriji pokazati u kojoj liniji kôda je došlo do greške. A ukoliko nestane prostora u heap memoriji, prikazuje se greška „Out of Memory Error”. Regularni izrazi Ognjen POPOVIĆ |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Home / Novi broj | Arhiva • Opšte teme | Internet | Test drive | Test run | PD kutak | CeDeteka | WWW vodič • Svet igara Svet kompjutera Copyright © 1984-2018. Politika a.d. • Redakcija | Kontakt | Saradnja | Oglasi | Pretplata • Help • English | |
SKWeb 3.22 |