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:
| 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:
SELECT
*
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:
LEFT JOIN users as sons
Sada možemo da naznačimo vezu osnovne tabele i preimenovane:
LEFT JOIN users as sons ON sons.id=users.son_id
Naznačimo sada polja:
SELECT
users.name as user_name, sons.name as son_name
Sastavimo sve zajedno i dobićemo sledeći upit:
SELECT
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
Pretpostavimo da imamo kategorije. Svaka kategorija može pripadati roditeljskoj kategoriji, ta zauzvrat svojoj roditeljskoj i tako dalje. Opišite strukturu čuvanja.
Napišite upit koji će dohvatiti kategoriju zajedno sa njenom roditeljskom kategorijom.
Napišite upit koji će dohvatiti kategoriju zajedno sa njenim roditeljem i dedom/pradedom (pra-roditeljem).
Napišite upit koji će dohvatiti kategoriju zajedno sa njenim roditeljem, dedom/pradedom i čukadedom (pra-pra-roditeljem).