Programiranje

Relacije unutar baze podataka i njihovo povezivanje

Stvaranje veza u bazama podataka

Kada saznamo koje ćemo podatke skladištiti u našoj bazi podataka, moramo razmisliti o tome kako su ti delovi podataka međusobno povezani. Neke baze podataka se mogu koristiti bez povezivanja zapisa u različitim tabelama. Baza podataka može jednostavno preuzeti zapise iz jedne ili druge tabele.
Ali kako modeliramo složenije informacije u našoj bazi podataka, moraćemo da izgradimo odnose podataka.

Postoje tri vrste veza za povezivanje podataka

To su veze jedan-prema-više (one-to-many), veza više-prema-više (many-to-many) i veza jedan-prema-jedan (one-to-one). Veza nije nešto što moramo eksplicitno definisati u našoj šemi baze podataka ili u alatu DBMS.
To može biti više način razmišljanja o tome kako su delovi podataka međusobno povezani u našem informacionom modelu.

Kada planiramo bazu podataka, povući ćemo linije koje predstavljaju veze, tačnije odnose unutar baze.
Koristicćemo te podatke za kreiranje polja, organizovanje tabela, smanjenje viška zaposlenih i poboljšanje integriteta naših podataka.
A kada su odnosi definisani, možemo konfigurisati našu bazu podataka da ih primeni.
U ovom poglavlju ćemo pogledati svaki odnos redom i videti kako se oni primenjuju na našu bazu podataka.

Relacije unutar baze podataka i njihovo povezivanje

 

Veza jedan-prema-više (one-to-many)

-Hajde da pogledamo relaciju jedan prema više. Ovo je najčešći tip odnosa koji koriste baze podataka. Povezuje jedan deo podataka, jedan red tabele sa jednim ili više drugih podataka.
Ovaj odnos je predstavljen linijom koja izgleda ovako:

Relacije unutar baze podataka i njihovo povezivanje

Razmotrimo sada tabelu naših gostiju i našu tabelu jela. (Slika 3 – TABELA)
Želimo da predstavimo omiljeno jelo našeg kupca u tabeli “Gosti”.
Za svakog gosta bismo napisali naziv jela u kolonu “Omiljeno jelo”.

Ali ovo je mnogo posla i ako ikada promenimo naziv jela, možda bismo primetili pravopisnu grešku u tabeli sa jelima, morali bismo biti savesni i ažurirati ime u tabeli naših gostiju.
U maloj bazi podataka ovo možda i nije veliki problem, ali u velikoj bazi podataka ova vrsta praktičnog održavanja i administracije brzo bi postala dugotrajan problem za rešavanje i veliki problem za doslednost i integritet našeg podataka.

Umesto toga, koristićemo primarni ključ (primary key) za jelo za predstavljanje podataka u tabeli gostiju.
Korišćenje ključa ima nekoliko prednosti, ključ se nikada ne menja i garantovano je jedinstven.
Takođe ima prednost što zauzima mnogo manje prostora od imena u punom tekstu, što pomaže da baza podataka bude manja kako se dodaje više unosa. Ovde koristimo odnos jedan prema više jer jedno jelo može biti omiljeno mnogim kupcima.

Relacije unutar baze podataka i njihovo povezivanje


Dakle, na ovoj slici vidimo mnogo gostiju na jedno jelo. U odnosu jedan prema više, strani ključ (foreign key) će biti na strani mnogih. Redni broj jela je strani ključ u koloni “Omiljeno jelo” u tabeli “Gosti”, tako da je ovaj odnos jedno jelo za mnoge goste, pa je jedan-prema-više.

Bez obzira na to u kom pravcu se odnos pojavljuje na papiru ili dijagramu, on je i dalje jedan prema više. Sada, naša kolona sa omiljenim jelom ima podatak koji predstavlja čitav red u tabeli “Jelo” i ne moramo da brinemo o promenama koje uzrokuju probleme koje cćemo morati da popravimo ili ažuriramo da bismo održali integritet naših podataka.

Ovaj odnos možemo takođe koristiti za modeliranje drugih veza između stavki.

Da bismo pratili rezervacije, imali bismo unos za svaku rezervaciju u posebnoj tabeli.
Svaka rezervacija će imati jednog gosta, ali jedan gost može imati mnogo rezervacija, barem se nadamo da hocće :). Korišćenje odnosa jedan-prema-više ne zahteva da kraj mnogih ima mnogo instanci. Mogle bi postojati samo dve različite vrednosti sa više strana, ili čak jedna. Poenta je u tome da ovaj odnos omogućava da se jedan zapis poveže sa mnogim zapisima.

Veza više-prema-više (many-to-many)

Druga veza koji se često koristi u bazama podataka naziva se odnos više prema više. Ovaj model je koristan kada želimo da povežemo više stvari sa više stvari.

Sada ćemo da razmotrimo naređenja i kako ih pratimo. Naša tabela porudžbina prati pojedinačne porudžbine gostiju. Postoji samo jedan gost po porudžbi i svaki gost bi mogao imati više od jedne porudžbe, tako da je to odnos jedan prema više. Ali porudžbine se mogu sastojati od više stavki.

Da bismo pratili koja su jela deo nekog redosleda, mogli bismo da počnemo da dodajemo kolone u tabelu “Porudžbine” i da u svaku stavimo ključ jela, ali ne bismo trebali da počnemo da dodajemo kolone ovde u tabelu porudžbi jer ne znamo šta najveći broj stavki koje neko može da poruči.

A ako napravimo 50 kolona, po jednu za svako potencijalno jelo koje gost može poručiti, većina naših polja će ostati prazna. Da bismo efikasno rešili ovaj problem, koristićemo odnos više prema više. Mnoge porudžbine mogu imati mnogo jela, a mnoga jela mogu biti uključena u mnoge porudžbinee.

To je ono što crtamo kada otkrijemo da nam je potreban ovakav odnos, linija sa krakom na svakom kraju. I to nam je signal da moramo da uradimo još malo posla. U vecćini DBMS alata ne možemo direktno da modeliramo odnos više prema više, pa moramo da napravimo povezujuću tabelu koja ima vezu jedan prema više sa obe tabele koje želimo da koristimo. Nazvaćemo ga jela za poručivanje.

Povezivanje tabela

Ove povezujuće tabele se obično imenuju kombinovanjem tabele sa leve strane odnosa više prema više sa imenom tabele sa desne strane. Tabeli za povezivanje su potrebne samo dve kolone, Redni broj porudžbine i Redni broj jela. Za svaku stavku u porudžbini dodaćemo red za svako jelo.

Zatim, kada želimo da pozovemo informacije o porudžbinama kupaca, od baze podataka ćemo tražiti redove koji odgovaraju brojevima porudžbina i vratićemo listu jela, tačnije, Redne brojeve jela koji su bili deo svake porudžbine.

To može biti samo jedan, a može biti i pet, 10 ili 50. Na taj način naša tabela porudžbina ostaje lepa i čista, a istovremeno nam omogućava da zabeležimo detalje o tome šta je svaka porudžbina uključivala. Takođe, lako ćemo saznati u koliko porudžbina je uključeno određeno jelo.

Možemo kreirati i  druge veze “više prema više” koristeći povezujuće tabele za druga udruženja, na primer, ako želimo da pratimo više jela koja se sviđaju gostima. Tako bismo mogli da gostima napravimo sto sa jelima, ili da imamo spisak sastojaka ili alergena. Možemo tako i da napravimo tabelu sa sastojcima jela ili tabelu alergena u jelima, pa bismo te podatke mogli da imamo nadohvat ruke za štampanje detaljnih menija ili dodavanje upozorenja stavke na meniju za nekoga ko bi mogao biti alergičan na neki sastojak.

Takođe, možemo modelirati tabelu povezivanja događaja korisnika. Ako gost prisustvuje ili je zainteresovan da prisustvuje raznim događajima koji se nude tokom cele godine. Kao i prethodna tabela povezivanja, ovo bi uključivalo samo redni broj gosta i redni broj događaja sa jednim redom za svaki događaj kome gost planira da prisustvuje.

U izgradnji ovoga, moći ćemo i da dobijemo listu događaja za koje su određeni gosti zainteresovani da nam pomognu u planiranju. Veze “više prema više” prilično su česti, ali se zaista sastoje od odnosa jedan prema više sa dodatkom tabele za povezivanje.

Dok modelirate svoju bazu podataka, imajte na umu da ćete možda morati da dodate neke tabele za povezivanje da biste ispunili određene odnose. Zapamtite, dizajniranje baze podataka sa ER dijagramima je iterativni proces.
Ne morate to da uradite baš iz prvog pokušaja, jer nekad to i nije moguće zbog obima podataka.

Relacije unutar baze podataka i njihovo povezivanje


Odnosi jedan prema jedan (one-to-one)

-Postoji još jedna vrsta odnosa koja se zove jedan prema jedan. Ovo se ne koristi često, jer obično ako postoji samo jedan red koji je povezan samo sa jednim drugim redom, to sugeriše da bi dva reda trebala biti samo jedan red i jedna tabela. Naša baza podataka ovde nema ništa što zahteva odnos jedan prema jedan.

Ali stvarni primer odnosa jedan prema jedan uključuje sigurnost. Tabelu naših gostiju mogli bismo da podelimo u dve tabele, stavljajući samo ime i redni broj gosta u jednu tabelu, a njihove lične podatke u drugu.

Tada bismo imali odnos jedan-prema-jedan između tabela. Možemo odlučiti da zaštitimo lične podatke gostiju (poput njihovog rođendana ili e-mail adrese) od pogleda od strane naših zaposlenih, ostavljajući njihovo ime i ključ na raspolaganju za upotrebu u drugim vezama, poput štampanja kartica mesta ili traženja rezervacije.

Takođe bismo mogli da koristimo odnos jedan-prema-jedan ako bismo iz stola opreme dodeljivali neke vrste resursa, poput kecelja, kuvarske kape itd. Ako jednu stavku dodelimo jednoj osobi, nije moguće dodeliti je drugoj osobi. I jednoj osobi nije moglo biti dodeljeno više od jedne stavke. Odnosi jedan prema jedan označeni su linijom sa samo jednom krajnjom tačkom sa obe strane.

Neki alati DBMS -a će vam omogućiti da zaštitite pojedinačne kolone podataka. Dakle, u zavisnosti od vaše implementacije, izgradnja ovakvog odnosa možda neće biti potrebna za zaštitu informacija.
Svakako da ima smisla čuvati povezane informacije zajedno, ali različita ograničenja mogu zahtevati da razdvojite informacije. To je primer denormalizacije, o čemu ćemo pisati uskoro.

Pravila odnosa i referencijalni integritet

– Nakon što odlučimo kakve će biti naše veze, šta predstavljaju i kako povezuju podatke, vreme je da odlučimo da li ćemo ih primeniti. Baze podataka nam omogućavaju da imamo koristi od referencijalnog integriteta, što znači da će baza biti “svesna” odnosa i neće dozvoliti vama ili drugom korisniku da menja podatke na način koji krši taj odnos.

To nam pomaže da održimo doslednost baze podataka. Pogledajmo ponovo tabelu naših kupaca i našu tabelu jela. (Slika – TABELU BROJ 3) Kolona “Omiljeno jelo” nekog gosta je strani ključ iz tabele “Jelo”. To je zaista samo broj, ali bazi podataka možemo reći kada kreiramo ovu tabelu, da broj u ovom polju takođe mora postojati u polju u drugoj tabeli. Ne bi imalo smisla postaviti omiljeno jelo gosta na nešto što ne postoji.

Dakle, ako smo uneli gosta ili ažurirali njegov zapis i pokušali da unesemo nešto što ne postoji, baza podataka bi odbila unos ili promenu. Mogli bismo da izvršimo promenu tek nakon što je to jelo dodato u bazu podataka, ili promenimo unos tako da odražava nešto što se već nalazi u tabeli “Jelo”.
Ovaj referentni integritet pomaže u održavanju baze podataka doslednom i tačnom.

Ne želimo da brinemo o tome da li u tabelama imamo loših podataka. Korišćenje ovakvih pravila integriteta omogućava bazi podataka da održava stvari doslednima, umesto da to radimo sami.

Još jedna prednost referencijalnog integriteta je ta što ga možemo koristiti za brisanje zapisa ili sprečavanje brisanja zapisa. Ako bismo izbrisali zapis o gostu, moguće je da želimo da se porudžbine tih gostiju obrišu zajedno sa njima.
U zavisnosti od vaših ograničenja privatnosti ili poslovnih zahteva, ovo bi moglo biti nešto što morate da uradite.

To se može uraditi ručno, ali ova pravila nam omogućavaju da baza podataka izvrši kaskadno brisanje, pri čemu se povezani zapisi uklanjaju radi održavanja doslednosti. U suprotnom, kada se gost izbriše, njegove porudžbe bi se odnosile na nepostojećeg gosta.

Međutim, ovo nije nešto što želimo da uradimo sa svim našim podacima. Ako izbrišemo gosta, ne želimo da se njegovo omiljeno jelo ukloni sa naše tabele “Jelo”. To jelo je i dalje dostupno drugim gostima, a i dalje je na našem jelovniku. Zato je važno ne samo definisati odnose, već i odlučiti kako će ih primenjivati baza podataka. Doslednost je funkcija koju nudi baza podataka i morate odlučiti kako se primenjuje na vašu konkretnu situaciju.

Kako izgleda struktura relacione baze podataka

Dodaj komentar