Srodničke veze podataka u PHP

Pretpostavimo da smo suočeni sa zadatkom čuvanja očeva i sinova. Neka svaki otac može imati samo jednog sina, a sin zauzvrat takođe može imati jednog sina.

Potrebno je smisliti kako ćemo čuvati podatke. Prva ideja koja može pasti na pamet je napraviti dve tabele: parents za očeve i sons za sinove. Zatim povezati ove tabele nekim poljem: son_id ili parent_id.

Međutim, ova ideja nije baš dobra - jer ista osoba može istovremeno biti i otac i sin - i moralo bi se da čuva u obe tabele, a to je nepraktično, zauzima više mesta i lako vodi greškama.

Bolja varijanta je povezivanje tabele same sa sobom: napravićemo tabelu users, u joj ćemo čuvati sve korisnike i svakom ćemo napraviti polje son_id, u kojem će se čuvati id sina iz ove iste tabele:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Upiti

Sada napišimo upit koji će izvući korisnika zajedno sa njegovim sinom.

Za početak, hajde da jednostavno izvučemo korisnike:

sqlSELECT
  *
FROM
  users

Sada ćemo pridružiti korisnicima njihove sinove. Pridruživanje ćemo vršiti tabele same sa sobom, pa nam treba izvršiti njeno preimenovanje:

sqlLEFT JOIN users as sons

Sada možemo navesti vezu osnovne tabele i preimenovane:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Hajde da sada navedemo polja:

sqlSELECT
  users.name as user_name, sons.name as son_name

Sastavimo sve zajedno i dobićemo sledeći upit:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Praktični zadaci

Задание 1

Neka imamo kategorije. Svaka kategorija može pripadati roditeljskoj kategoriji, ona zauzvrat svojoj roditeljskoj i tako dalje. Opišite strukturu čuvanja.

Задание 2

Napišite upit koji će izvući kategoriju zajedno sa njenom roditeljskom kategorijom.

Задание 3

Napišite upit koji će izvući kategoriju zajedno sa njenim roditeljem i roditeljem roditelja.

Задание 4

Napišite upit koji će izvući kategoriju zajedno sa njenim roditeljem, roditeljem roditelja i roditeljem roditelja roditelja.