Rodne veze podataka u Python-u

Pretpostavimo da je pred nama zadatak da čuvamo očeve i sinove. 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 - 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 biti istovremeno i otac i sin - i moraćemo da je čuvamo u obe tabele, a to je nezgodno, zauzima više mesta i lako vodi do grešaka.

Bolja opcija je da povežemo tabelu samu sa sobom: napravićemo tabelu users, u njoj ćemo čuvati sve korisnike i svakom ćemo napraviti polje son_id, u kome će biti čuvan id sina iz ove iste tabele:

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

Upiti

Hajde sada da napišemo upit koji će dohvatiti korisnika zajedno sa njegovim sinom.

Za početak hajde jednostavno da dohvatimo korisnike:

sqlSELECT
  *
FROM
  users

Sada ćemo da spojimo (join) sa korisnicima njihove sinove. Spojićemo tabelu samu sa sobom, pa zato moramo da izvršimo njeno preimenovanje:

sqlLEFT JOIN users as sons

Sada možemo da naznačimo vezu osnovne tabele i preimenovane:

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

Naznačimo sada 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

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

Задание 2

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

Задание 3

Napišite upit koji će dohvatiti kategoriju zajedno sa njenim roditeljem i dedom/pradedom (pra-roditeljem).

Задание 4

Napišite upit koji će dohvatiti kategoriju zajedno sa njenim roditeljem, dedom/pradedom i čukadedom (pra-pra-roditeljem).