Izraz „relacioni“ koji koristimo kad govorimo o bazama podataka odnosi se na veze koje postoje između tabela. Oni koji tek počnu da se bave bazama podataka veoma često ne mogu odmah da uoče razliku između baza podataka i tabelarnih proračuna. Uspevaju da vide tabele ispunjene podacima i shvataju da im baze podataka omogućavaju da organizuju i izvlače podatke na drugačije načine, ali ne uspevaju da prepoznaju značaj relacije između podataka zbog čega se tehnologija relacionih baza podataka tako zove.
Relacija vam omogućavaju da opišete veze između različitih tabela baza podataka na izuzetno moćan način. Te relacije mogu da se iskoriste za obavljanje naprednih međutabelarnih upita, koji su poznati kao JOINS, odnosno skup rezultata koji je dobijen povezivanjem informacija iz dve tabela.
Tipovi relacija u okviru baze podataka
Postoje tri različita tipa relacija u okviru baze podataka. Svaka relacija je dobila naziv prema broju redova u tabeli koji bi mogli da uđu u relaciju i svaki od ova tri tipa relacija pojavljuje se između dve tabele.
Relacije „jedan prema jedan“ se javljaju kad se svaki unos u prvoj tabeli uklapa sa jednim i samo jednim zapisom u drugoj tabeli. Relacije „jedan prema jedan“ se retko kad koriste jer je često mnogo jednostavnije staviti sve informacije u jednu tabelu. Neki kreatori baza podataka koriste prednosti ove relacije pri stvaranju tabela koje sadrže podskup podataka iz druge tabele.
Relacije „jedan prema više“ su najčešći tip relacija koji se koristi u bazama podataka. Javlja se onda kad se jedan zapis iz Tabele A uklapa sa jednim ili više zapisa iz Tabele B, ali se, pri tom, svaki zapis iz Tabele B uklapa samo sa jednim zapisom iz Tabele A. Na primer, relacija između tabele Teachers (Nastavnici) i tabele Students (Učenici) u bazi podataka osnovne škole predstavljao bi tip „jedan prema više“ jer svaki učenik ima samo jednog nastavnika, ali svaki nastavnik ima veliki broj učenika. Takav tip relacije „jedan prema više“ onemogućava pojavu dupliranja podataka.
Relacije „više prema više“ javljaju se kad se svaki zapis u Tabeli A poklapa sa jednim ili više zapisa u Tabeli B, a svaki zapis u Tabeli B poklapa se sa jednim ili više zapisa u Tabeli A. Na primer, relacije između tabele Teachers (Nastavnici) i tabele Courses (Predmeti) u osnovnoj školi verovatno će biti tipa „više prema više“ jer svaki nastavnik može da podučava više od jednog predmeta, a više od jednog nastavnika može da podučava jedan predmet.
Rekurzivne relacije: Poseban slučaj
Rekurzivne relacije se pojavljuju kad imamo samo jednu tabelu. Da bi se objasnio taj tip relacije obično se koristi primer tabele Employees (Zaposleni) koja sadrži informacije o šefu svakog radnika. Svaki šef je takođe radnik i ima svog šefa. U tom slučaju govorimo o rekurzivnoj relaciji „jedan prema više“ jer svaki radnik ima jednog šefa, a svaki šef može da ima više od jednog radnika.
Uspostavljanje relacija pomoću stranog ključa
Relacije između tabela uspostavljate pomoću definisanja stranog ključa. Taj ključ pokazuje relacionoj bazi podataka kakav odnos treba uspostaviti između tabela. U mnogim slučajevima, Tabela A sadrži primarne ključeve koji se referenciraju na Tabelu B.
Hajde ponovo da razmotrimo primer tabela Teachers (Nastavnici) i Students (Učenici). Tabela Teachers sadrži samo identifikacioni broj, ime i kolonu u kojoj se nalazi naziv predmeta (Course):
Teachers
InstructorID Teacher_Name Course
001 John Doe English
002 Jane Schmoe Math
Tabela Students obuhvata identifikacioni broj, ime i kolonu u kojoj se nalazi strani ključ (Teacher_FK).
Students
StudentID Student_Name Teacher_FK
0200 Lowell Smith 001
0201 Brian Short 001
0202 Corky Mendez 002
0203 Monica Jones 001
Kolona Teacher_FK u tabeli Students referencira vrednost primarnog ključa nastavnika u tabeli Teachers. Veoma često kreatori baza podataka koriste „PK“ (primary key – primarni ključ) ili „FK“ (foreign key – strani ključ) u nazivu tabele da bi lako prepoznali kolonu primarnog ili stranog ključa. Obratite pažnju da ove dve tabele ilustruju relaciju „jedan prema više“ između nastavnika i učenika.
Relacije i referencijalni integritet
Kad ste tabeli dodali strani ključ, možete da kreirate ograničenje baze podataka koje uspostavlja referencijalni integritet između dve tabele, a to, s druge strane, održava relaciju između dve tabele nepromenljivom. Kad jedna tabela ima strani ključ druge tabele, koncept referencijalnog integriteta kaže da svaka vrednost stranog ključa u Tabeli B mora da se odnosi na postojeći zapis u Tabeli A.
Uspostavljanje relacija
U zavisnosti od toga kako ste kreirali bazu podataka, relacije između tabela možete uspostaviti na različite načine. Program Access kompanije „Majkrosoft“ vam obezbeđuje čarobnjaka koji vam jednostavno omogućava da povežete tabele i istovremeno vam nameće referencijalni integritet.
Ako pište neposredno u SQL-u, prvo ćete kreirati tabelu Teachers (Nastavnici) i kolonu ID ćete postaviti kao primarni ključ.
CREATE TABLE Teachers (
InstructorID INT AUTO_INCREMENT PRIMARY KEY,
Teacher_Name VARCHAR(100),
Course VARCHAR(100)
);
Kad kreirate tabelu Students (Učenici), postavljate kolonu Teacher_FK kao strani ključ koja se referencira na kolonu InstruktorID u tabeli Teachers.
CREATE TABLE Students (
StudentID INT AUTO_INCREMENT PRIMARY KEY,
Student_Name VARCHAR(100), Teacher_FK INT,
FOREIGN KEY (Teacher_FK) REFERENCES Teachers(InstructorID) )
);
Korišćenje relacija za spajanje tabela
Kad ste kreirali jednu ili više relacija u bazi podataka, možete iskoristiti njihove mogućnosti koristeći upite JOIN u SQL-u da biste kombinovali informacije iz većeg broja tabela. Najuobičajeniji tip povezivanja (JOIN) je SQL-ov INNER JOIN ili jednostavno povezivanje. Taj tip povezivanja prikazuje sve zapise koji zadovoljavaju povezan uslov iz većeg broja tabela. Na primer, uslov JOIN će prikazati Student_Name, Teacher_Name, i Course gde strani ključ u tabeli Student odgovara primarnom ključu u tabeli Teachers:
SELECT Students.Student_Name, Teachers.Teacher_Name, Teachers.Course
FROM Students
INNER JOIN Teachers
ON Students.Teacher_FK=Teachers.InstructorID;
Takav izraz kreira tabelu koja izgleda ovako:
Returned Table from the SQL Join Statement
Student_Name Teacher_Name Course
Lowell Smith John Doe English
Brian Short John Doe English
Corky Mendez Jane Schmoe Math
Monica Jones John Doe English