Relații de înrudire a datelor în Python
Să presupunem că avem sarcina de a stoca tați și fii. Să presupunem că fiecare tată poate avea doar un singur fiu, iar fiul la rândul său poate avea și el un singur fiu.
Trebuie să ne gândim cum vom stoca
datele. Prima idee care ne poate veni
în minte - să facem două tabele: parents
pentru tați și sons pentru fii. Apoi
să legăm aceste tabele printr-un câmp oarecare:
son_id sau parent_id.
Cu toate acestea, aceasta nu este o idee foarte bună - pentru că aceeași persoană poate fi simultan și tată și fiu - și va trebui să o stocăm în ambele tabele, ceea ce este incomod, ocupă mai mult spațiu și duce ușor la erori.
O variantă mai bună - să legăm tabelul
cu el însuși: vom face un tabel users,
în el vom stoca toți utilizatorii și fiecăruia
îi vom face un câmp son_id, în care va fi
stocat id-ul fiului din același tabel:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Interogări
Haideți acum să scriem o interogare care va extrage utilizatorul împreună cu fiul său.
Pentru început, haideți să extragem utilizatorii:
SELECT
*
FROM
users
Acum să facem JOIN cu fiii lor. Vom face JOIN tabelului cu el însuși, de aceea trebuie să-i facem redenumire:
LEFT JOIN users as sons
Acum putem specifica legătura dintre tabelul principal și tabelul redenumit:
LEFT JOIN users as sons ON sons.id=users.son_id
Să specificăm acum câmpurile:
SELECT
users.name as user_name, sons.name as son_name
Să punem totul laolaltă și vom obține următoarea interogare:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Sarcini practice
Să presupunem că avem categorii. Fiecare categorie poate aparține unei categorii părinte, aceasta la rândul ei propriului său părinte și așa mai departe. Descrieți structura de stocare.
Scrieți o interogare care va extrage categoria împreună cu categoria sa părinte.
Scrieți o interogare care va extrage categoria împreună cu părintele și bunicul său.
Scrieți o interogare care va extrage categoria împreună cu părintele, bunicul și străbunicul său.