Relacijska baza podataka

**Relaciona baza podataka** je poseban tip baze podataka kod kojeg se organizacija podataka zasniva na relacionom modelu. Podaci se u ovakvim bazama organizuju u skup relacija između kojih se definišu određene veze. Relacija se definiše kao skup n-torki sa istim atributima, definisanih nad istim domenima iz kojih mogu da uzimaju vrednosti. U relacionim bazama podataka, svaka relacija mora da ima definisan primarni ključ, koji predstavlja atribut pomoću kojeg se jedinstveno identifikuje svaka n-torka. Relacija opciono može da poseduje i spoljni ključ, preko kojeg ostvaruje vezu sa drugim relacijama.

Upravljanje ovakvim bazama podataka se realizuje preko sistema za upravljanje relacionim bazama podataka. Među najpopularnijim takvim sistemima danas su: Microsoft SQL Server, Oracle Database, MySQL i drugi. Većina tih sistema koristi upitni jezik SQL za manipulaciju podacima.

## Kratak istorijat
Pojam relacionog modela počinje da se javlja sedamdesetih godina prošlog veka, a za njegovog osnivača se smatra Edgar Kod. On je bio rukovodilac u jednom od sektora IBM-a, zaduženog za proizvodnju računarskih hard diskova. U to vreme, baze podataka su se zasnivale na navigacionom modelu, kojeg je Edgar Kod smatrao neefikasnim, pre svega zbog slabih mogućnosti pretraživanja podataka u njima. Stoga je, 1970. godine, objavio veliki broj kratkih dela o relacionom modelu organizacije podataka, koja su predstavljala uvod u njegovo prvo veliko delo te tematike „Relacioni model za organizaciju velike količine podataka“. U tom delu je predstavio model, po kojem bi se podaci skladištili u tabele umesto u povezane liste, koje su predstavljale osnovu navigacionog modela. Navigacioni model je bio neefikasan i prilikom čuvanja podataka u kojima bi neki slog morao biti ostavljen prazan. Relacioni model bi to rešavao smeštanjem podataka u određeni broj normalizovanih tabela, s ‘tim da bi se ti opcioni podaci koji ne moraju imati vrednost smeštali van glavne tabele. Takođe, Kod je u svom delu naveo i velike prednosti relacionog modela u odnosu na navigacioni, koje se odnose na smeštanje, brisanje i čitanje podataka iz baze, jer ne bi postojala potreba za konstantnim prepravljanjem lnkova i pokazivača u čvorovima navigacionog modela. Za manipulaciju podacima u ovakvim bazama, Kod je predložio jezik koji se kasnije razvio u SQL.
IBM je kasnije, na osnovu Kodove knjige, razvio prve sisteme za upravljanje relacionim bazama podataka, PRTV i IBM Business Systems 12.

## Relacija

Svaka relacija može bez ikakvih problema da se predstavi u tabelarnom obliku, ali i pored toga, relacija i tabela nisu isto. To je iz razloga što je kod tabela bitan redosled redova i kolona, dok kod relacija nije bitan redosled atributa i n-torki. Na primer, tabela 1 ima kolone sa redosledom: ime, prezime, jmbg. Tabela 2 ima kolone sa redosledom: jmbg, prezime, ime. Te dve tabele se ne smatraju istim, bez obzira što imaju iste nazive kolona. I pored toga što relacija i tabela nisu sinonimi, danas se uglavnom svaka relacija naziva tabelom, tj. njeni elementi se poistovećuju sa elementima koji čine jednu tabelu. Iz tog razloga su u sledećoj tabeli dati pojmovi iz relacionog i tabelarnog modela koji se odnose na isto.

### Osnovni pojmovi
* **[[N-torka]]** se definiše kao uređeni skup od „n“ elemenata. Na primer, ovaj podskup celih brojeva predstavlja jednu petorku:
  (4,3,6,2,1)

* **Atribut** predstavlja ime kojim se u relacionom modelu, identifikuje svaki od elemenata jedne n-torke. U donjem primeru **atributi** su "student", "status" i "prosek" a **elementi n-torke** su "Marko", "Budžet" i "8.2".

  **(Student**: "Marko", **Status**: "Budžet", **Prosek**: 8.2**)**

* **[[Relacija (matematika)|Relacija]]** se definiše kao skup n-torki koji imaju iste atribute kojima su identifikovani njihovi elementi, i koji uzimaju vrednosti iz istih domena. Primer relacije:
  **(Student**: "Marko", **Status**: "Budžet", **Prosek**: 8.2**)**
  **(Student**: "Jovan", **Status**: "Budžet", **Prosek**: 9.1**)**
  **(Student**: "Bojan", **Status**: "Samof", **Prosek**: 7.8**)**
U relacionim bazama podataka postoje dve vrste relacija: bazne i izvedene. **Bazne relacije** su relacije koje se već nalaze u bazi podataka, tj. skladištene su na hard disku ili nekom drugom medijumu za čuvanje podataka. **Izvedene relacije**(ili pogledi) su relacije koje se dobijaju čitanjem i kombinovanjem podataka iz jedne ili više baznih relacija postavljanjem uslova upitnim jezikom, o kojem će biti reči kasnije.

* **Domen** predstavlja skup vrednosti koje može da ima konkretni element n-torke. Domeni mogu biti **semantički** i **predefinisani**. Predefinisani domeni već postoje u jeziku baze podataka i neki primeri tih domena su *Integer* koji predstavlja skup celih brojeva, *Float* koji predstavlja skup realnih brojeva, *DateTime* za predstavljanje datuma i vremena u različitim formatima, i drugi. Semantičke domene definiše sam korisnik.

## Primarni ključ

U svakoj relaciji mora da postoji jedan ili više atributa zajedno, čije vrednosti jedinstveno identifikuju svaku n-torku u toj relaciji. Taj atribut, ili grupa atributa se naziva primarnim ključem relacije. U slučaju kada jedan atribut jedinstveno identifikuje svaku n-torku u relaciji imamo **prost primarni ključ**, a ako je identifikuju dva ili više atributa, onda je u pitanju **složeni primarni ključ**. Primarni ključ je dakle skup od **K** elemenata neke relacije, koji moraju da zadovoljavaju sledeća dva uslova: osobinu jedinstvenosti i osobinu neredudantnosti. Osobina jedinstvenosti podrazumeva da ne mogu da postoje bilo koje dve n-torke sa istom vrednošću atributa „K“. Osobina neredudantnosti podrazumeva da ako se izostavi bilo koji atribut iz **K**, gubi se osobina jedinstvenosti. U donjem primeru, atribut "Šifra" predstavlja prost primarni ključ relacije.
  **(''Šifra***: 432, *'Student**: "Marko", **Status**: "Budžet", **Prosek**: 8.2**)**</big>
  <big>**(*Šifra***: 436, **Student**: "Jovan", **Status**: "Budžet", **Prosek**: 9.1**)**</big>
  <big>**(*Šifra***: 527, **Student**: "Bojan", **Status**: "Samof", **Prosek**: 7.8**)**</big>

== Spoljni ključ ==

Spoljni ključ predstavlja atribut (ili grupu atributa) neke [[Relacija (matematika)|relacije]] R1, koji u njoj nije [[primarni ključ]], ali jeste u nekoj drugoj relaciji R2. S tim u vezi, relacija R1 se povezuje sa relacijom R2 preko spoljnog ključa. Da bi veza između te dve relacije bila ispravna, moraju se zadovoljiti pravila [[Referencijalni integritet|**referencijalnog integriteta**]]. Ukratko, pod referencijalnim integritetom se podrazumeva da sve vrednosti koje uzima atribut koji predstavlja spoljni ključ, moraju da postoje i u relaciji u kojoj je taj atribut [[primarni ključ]]. U primeru koji sledi, atribut "ŠifraSmera" predstavlja spoljni ključ u prvoj relaciji, i u ovom slučaju su zadovoljena pravila [[Referencijalni integritet|referencijalnog integriteta]].


<br />
== Manipulisanje nad podacima u relacionom modelu ==
Formalizmi za manipulisanje [[Podatak|podacima]], koji su sastavni deo [[Relacioni model|relacionog modela]] su : [[relaciona algebra]] i [[relacioni račun]]. [[upitni jezik|Upitni jezici]] koji su u sastavu konkretnog [[Sistem za upravljanje relacionim bazama podataka|sistema za upravljanje relacionim bazama podataka]] se zasnivaju na jednom od ova dva formalizma, ili na njihovoj kombinaciji.

=== Relaciona algebra ===
Prema [[Edgar Frank Kod|Kodovoj]] definiciji, [[relaciona algebra|relacionu algebru]] čini devet operacija nad relacijama, kojima se može pristupiti svakom podatku u datoj relaciji. Skup nekih [[relacija (baza podataka)|relacija]], i operacija koje se nad njima izvršavaju se naziva izraz relacione algebre, i njegov rezultat je uvek relacija. Operacije relacione algebre predstavljaju operacije analogne skupovnim operacijama [[unija skupova|unije]], [[Presek (teorija skupova)|preseka]], [[razlika (teorija skupova)|razlike]] i [[Dekartov proizvod|Dekartovog proizvoda]]. U njih još spadaju i specifične relacione operacije koje se dele u dve grupe: [[Unarna operacija|unarne]] i [[Binarna operacija|binarne]]. Unarne operacije se izvršavaju nad samo jednom relacijom, i u njih spadaju: [[projekcija (psihologija)|projekcija]] i restrikcija. U binarne operacije spadaju: prirodno spajanje, slobodno spajanje i relaciono deljenje.
<br />
==== Projekcija ====
Uzmimo npr. neku [[relacija (baza podataka)|relaciju]] **R** sa njenim atributima **{A1, A2, …, An}**. Neka **X** predstavlja [[podskup]] skupa atributa **{A1, A2, …, An}**, a **Y** [[razlika (teorija skupova)|razliku]] između [[skup]]a **X** i skupa
**{A1, A2, …, An}**. Tada se relacija **R** može predstaviti kao **R(X,Y)**. Dakle, rezultat projekcije relacije **R** na skup atributa **X** je relacija koja uključuje samo atribute iz skupa **X**.

<math>R[X]=\{x \vert x \in X \land \exists y \in Y, (x,y) \in R(X,Y)\}</math>
<br />
==== Restrikcija ====
Operacijom restrikcije se biraju [[n-torka|n-torke]] u celosti koje zadovoljavaju logički izraz naveden u oznaci operacije. Argumenti logičkog izraza mogu biti: poređenje vrednosti dva atributa zadate relacije i poređenje vrednosti jednog atributa zadate relacije sa nekom [[Konstanta|konstantom]]. Operacije logičkog izraza su logičke operacije: **AND**, **OR**, **NOT**. Neka je, npr., **θ** relacijska operacija iz skupa **{,≤,≥,≠}**, i neka su **{Ai, Aj}** atributi neke relacije **R** koji su definisani nad istim [[Domen (matematika)|domenom]]. Restrikcija se tada predstavlja sledećim izrazom:

<math>R[A_i\;\ominus\;A_j]=\{x \vert x \in R \land x[A_i]\;\ominus\;x[A_j]\}</math>
<br />
==== Relaciona unija, presek, razlika i Dekartov proizvod ====
**Relacionom unijom** se sve [[n-torka|n-torke]] iz dve odabrane relacije predstavljaju jednom relacijom, pod uslovom da su n-torke u tim relacijama iste vrste(npr. n-torke u obema relacijama predstavljaju knjige). Predstavlja se sledećim izrazom:

<math>R \cup S=\{x \vert x \in R \text{ ili } x \in S\}</math>

Pod istim uslovima se realizuju i **presek** i **razlika**. 
<br />
**Dekartov proizvod** relacija **R1** i **R2** koje imaju **n1** i **n2** atributa se definiše kao relacija **R1xR2** sa **n1+n2** atributa, što praktično znači da su samo na atribute prve [[relacija (baza podataka)|relacije]] dopisani atributi druge relacije.

==== Slobodno spajanje ====
Operacija slobodnog spajanja koja se primenjuje na dve relacije **R** i **S** koje imaju **m** i **n** atributa, daje kao rezultat relaciju sa **m+n** atributa. Neka je **θ** relacijska operacija iz [[skup]]a **{,≤,≥,≠}**. Tada se operacija slobodnog spajanja relacija **R** i **S** po atributima **Ai** i **Bj** realizuje po sledećoj formuli:

<math>R[A_i \ominus B_j]S=\{(r,s) \vert r \in R \land s \in S \land r[A_i] \ominus s[B_j]\}</math>
<br />
==== Prirodno spajanje ====
Pod prirodnim spajanjem se podrazumeva spajanje po jednakosti, i može se izvesti po jednakosti pojedinačnih atributa dve [[relacija (baza podataka)|relacije]], ili po jednakosti [[podskup]]ova određenih atributa. Neka imamo relacije **R** i **S** sa skupovima atributa **{A1, A2, …, An}** i **{B1, B2, …, Bm}**. Neka je **X** [[podskup]] atributa relacije **R**, a **Y** [[podskup]] atributa relacije **S**. Neka je **Z** [[razlika (teorija skupova)|razlika]] između **X** i skupa atributa prve relacije **R**, a **W** razlika između **Y** i skupa atributa druge relacije **S**. Relacije **R** i **S** se tada mogu predstaviti kao **R[X,Z]** i **S[Y,W]**. Tada se operacija spajanja relacija **R** i **S** po skupovima atributa **X**,**Y** definiše na sledeći način:

<math>R[X*Y]S=\{(z,x,w)\vert(z,x) \in R \land (y,w) \in S \land x=y\}</math>
<br />
==== Relaciono deljenje ====
Operacija [[Deljenje|deljenja]] relacije **R(X; Y)** po zadatom [[skup]]u atributa **Y** drugom relacijom **T** daje rezultat koji se sastoji od projekcija [[n-torka|n-torki]] relacije **R** na atribute **X** i to samo onih projekcija n-torke koje se [[Dekartov proizvod|dekartovski]] pomnožene sa svakom vrstom relacije **T** sadrže u relaciji **R**. Neka je **R** relacija sa atributima **{A1, A2, …, An}**, **Y** [[podskup]] skupa **{A1, A2, …, An}**, a **X = {A1, A2, …, An} \ Y**. Neka relacija **T(Z1, Z2, ..., Zk)** ima isti broj atributa kao skup **Y** pri čemu su parovi odgovarajućih atributa definisani nad istim [[Domen (matematika)|domenima]]. Operacija deljenja relacije **R** po skupu atributa **Y** sa relacijom **T** definiše kao:

<math>R[Y \div Z]T=\{x \vert x \in R[X] \land \{x\} \times T(Z) \subseteq R(X,Y)\}</math>
<br />
=== Relacioni račun ===
**Relacioni račun** je drugi formalizam za manipulisanje [[Podatak|podacima]]. [[Relaciona algebra]] daje skup operacija za **izgradnju relacije rezultata**, a [[relacioni račun]] pruža [[notacija|notaciju]] za **opisivanje svojstava te relacije rezultata**. Relacioni račun se bazira na [[logika prvog reda|predikatskom računu]] prvog reda. [[Edgar Frank Kod|Edgar Kod]] je dao dve varijante: **relacioni račun n-torki** i **relacioni račun domena**. 
<br />
==== Relacioni račun n-torki ====
Relacioni račun n-torki predstavlja formalizam za izradu **izraza relacionog računa**. Najvažnije njegovo svojstvo je **n-torna promenljiva**. To je [[Promjenljiva (programiranje)|promenljiva]] koja je vezana za određenu relaciju, i kao vrednosti uzima samo njene [[n-torka|n-torke]]. Relacija za koju je vezana n-torna promenljiva se naziva **dijapazon n-torne promeljive**.

Izraz relacionog računa n-torki je oblika **{ (t1,t2,…,tk) : f }**, pri čemu važi sledeće:
# **t1**,**t2**,…,**tk** su n-torne promenljive, i njihov skup se naziva „**ciljna lista**“.
# **f** je formula, odnosno kvalifikacioni izraz koji se gradi od „**atoma**“ i operacija na sl. način:
## **Slobodne promenljive** u formuli **f** su one koje se nalaze u ciljnoj listi.
## Ako je **R** relacija a **s** n-torna promenljiva vezana za nju, to vezivanje se označava sa **R(S)**
## Ako su **S** i **U** n-torne promenljive, **a** [[konstanta]], **θ** operacija poređenja **{,≤,≥,≠}** onda oznaka „**S[i] θ U[j]**“ označava poređenje i-te promenljive komponente **S** sa j-tom promenljivom komponente **U**, i naziva se **atom poređenja**.
## Svaki atom je formula. Sve n-torne promenljive atoma su slobodne promenljive u toj formuli. 
## Ako su **f** i **g** formule, onda su formule i: **f AND g**, **f OR g** i **NOT f**, **(Es)(f)** i **(Es)(f)**. Pojavljivanje promenljive je vezano u **(Es)(f)** i **(Es)(f)**.
<br />
**Primer:** Imamo relacije: **P** koja predstavlja pesmu, **I** koja predstavlja izvođača i **KI** koja definiše koji izvođač izvodi koju pesmu. Neka su **r**, **s**, **t** imena n-tornih promenljivih, i **P(r)**, **I(t)**, **KI(s)** atomi njihovih pripadnosti relacijama. Označimo sa **r[i]** **i**-ti atribut promenljive **r**. Tada su primeri izraza [[relacioni račun|relacionog računa]]:

**fr[2] : K(r)g** (nazivi svih pesama)

**fr[2] : K(r) AND r[3] =’ROCK’g** (naslovi svih rok pesama)
<br />
<br />
==== Relacioni račun domena ====

Kod relacionog računa [[Domen (matematika)|domena]], promenljiva je definisana nad [[Domen (matematika)|domenom]] atributa(domenska promenljiva), a ne nad [[relacija (baza podataka)|relacijom]]. Izraz relacionog računa domena ima sledeći oblik:
<br />
**{X1, X2, …, XK | f}**

Pri čemu važi:
# x<sub>1</sub>, x<sub>2</sub>, … , x<sub>k</sub> su domenske promenljive.
# **F** je formula relacionog računa domena čije su slobodne promenljive x<sub>1</sub>, x<sub>2</sub>, … ,x<sub>k</sub>. Ta formula se definiše na isti način kao i kod relacionog računa n-torki, sa malo modifikovanim oblikom.
## Ako je **R** relacija stepena **n**, a **y1**, **y2**, … , **yn** konstante ili domenske promenljive nad domenima atributa relacije, onda je **R(y1, y2, … ,yn)** atom. Vrednosti **yi** moraju biti izabrane tako da **y1**, **y2**, …, **yn** predstavlja n-torku relacije **R**.
## Ako su **x**, **y** domenske promenljive, **„a“** konstanta, a **θ** operacija poređenja, onda su **x θ a**, **x θ y** atomi. NJihovo značenje je da par vrednosti **x**,**y** mora biti izabran tako da je poređenje **θ''' tačno. 

## Upitni jezici
Upitni jezici su namenjeni za komunikaciju sa relacionom bazom podataka, tj. za kreiranje relacionih šema i ažuriranje i čitanje podataka iz relacija. Mogu se najopštije klasifikovati na: jezike dobijene nadgradnjom proceduralnih programskih jezika, jezike zasnovane na relacionom računu domena ili n-torki, jezike zasnovane na relacionoj algebri i jezike koji se zasnivaju na kombinaciji relacione algebre i relacionog računa. Najzastupljeniji upitni jezik danas je SQL(Structured Query Language), razvijen 80-ih godina prošlog veka od strane istraživačke IBM laboratorije u San Hozeu u Kaliforniji. Podržavaju ga gotovo svi sistemi za upravljanje relacionim bazama podataka. I pored njegove velike rasprostranjenosti, veliki značaj se pridaje i upitnom jeziku QUEL(QUEry Language), koji je razvijen takođe u Kaliforniji, na univerzitetu u Berkliju.

### Structured Query Language (SQL)

SQL predstavlja poslednju fazu razvoja upitnih jezika od strane istraživačke IBM laboratorije. NJegovi prethodnici razvijeni od strane te IBM laboratorije su bili upitni jezici SQUARE i SEQUEL. SQL standard je objavljen 1989. godine i odmah je bio široko prihvaćen na tržištu. Neki od bitnih svojstava su mu: jezik za definisanje podataka(Data Definition Language), jezik za manipulaciju podacima(Data Manipulation Language), spoljašnje i unutrašnje spajanje, kaskadno ažuriranje i brisanje, skupovne operacije (unija, presek i razlika) spajanje itd. Prikazaćemo neke najosnovnije pojmove vezane za ovaj upitni jezik.

#### Jezik za definisanje podataka (Data Definition Language)

Ovaj deo upitnog jezika služi za kreiranje i ažuriranje objekata koji čine relacionu bazu podataka, a tu spadaju bazne relacije, relacione šeme, semantički domeni, indeksi itd.

Generički DDL upit za kreiranje bazne relacije(tabele):

     CREATE TABLE  
     (  [not null], 
        [not null], 
      ...
     )

Generički DDL upit za kreiranje semantičkog domena:

     CREATE DOMAIN  [AS] 
     [DEFAULT ]
     upitnog jezika služi za manipulaciju podacima u bazi, tj. za prikazivanje, brisanje, ubacivanje i ažuriranje podataka. S tim u vezi, sastoji se od četiri osnovne komande: SELECT, INSERT, UPDATE, DELETE.

Generički upit za čitanje podataka iz baze, koji se oslanja na operacije restrikcije i projekcije iz relacione algebre.

     SELECT 
     FROM 
     WHERE 

Generički upit za ubacivanje podataka u bazu:

     INSERT INTO naziv_tabele
     VALUES (vrednost_atr1, vrednost_atr2,. .. )

Generički upit za brisanje podataka iz baze:

     DELETE FROM naziv_tabele
     WHERE [kriterijum selekcije n-torki]

Generički upit za ažuriranje podataka u bazi:

     UPDATE naziv_tabele
     SET(atribut1, atribut2, ...)=(nove vrednosti)
     WHERE [kriterijum selekcije n-torki]

Operatori unije, preseka i razlike
Ove operacije se oslanjaju na istoimene operacije u relacionoj algebri. Primer preseka:

     SELECT atribut_1
     FROM tabela_1
     EXCEPT 
     SELECT atribut_2 
     FROM tabela_2;

## Sistemi za upravljanje relacionim bazama podataka

Prema podacima američke kompanije za istraživanje Gartner, pet vodećih proizvođača sistema za upravljanje relacionim bazama podataka u 2011. godini po prihodu su bili: Oracle, IBM, Microsoft, SAP i Teradata. 
Trenutno, tri najzastupljenija besplatna sistema za upravljanje relacionim bazama podataka su: MySQL, PostgreSQL, i SQLite.
Po istraživanju iste kompanije u 2008. godini je procenat korišćenja sistema za upravljanje relacionim bazama na veb-sajtova bio sledeći:

* Oracle Database - 70%
* Microsoft SQL Server - 68%
* MySQL (Oracle Corporation) - 50%
* IBM DB2 - 39%
* IBM Informix - 18%
* SAP Sybase Adaptive Server Enterprise - 15%
* Sybase IQ - 14%
* Teradata - 11%

Udeo na tržištu proizvođača sistema za upravljanje relacionim bazama podataka 2012. godine je bio:

* Oracle - 48,8 %
* IBM - 20,2 %
* Microsoft - 17%
* SAP Sybase - 4,6 %
* Teradata - 3,7 %
* Ostali - 5,8 %

## Reference

## Literatura
* Gordana Pavlović-Lažetić - Uvod u relacione baze podataka.
* Hugh Darwen - An introduction to relational database theory --. .
* Branislav Lazarević, Zoran Marjanović, Nenad Aničić, Slađan Babarogić - Baze podataka --. .

## Povezano
* Model objekti-veze
* IDEF1X
* ANSI-SPARC arhitektura
* Normalizacija baza podataka
* Transakcija