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:

users
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:

sqlSELECT
  *
FROM
  users

Acum să facem JOIN cu fiii lor. Vom face JOIN tabelului cu el însuși, de aceea trebuie să-i facem redenumire:

sqlLEFT JOIN users as sons

Acum putem specifica legătura dintre tabelul principal și tabelul redenumit:

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

Să specificăm acum câmpurile:

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

Să punem totul laolaltă și vom obține următoarea interogare:

sqlSELECT
  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

Задание 1

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.

Задание 2

Scrieți o interogare care va extrage categoria împreună cu categoria sa părinte.

Задание 3

Scrieți o interogare care va extrage categoria împreună cu părintele și bunicul său.

Задание 4

Scrieți o interogare care va extrage categoria împreună cu părintele, bunicul și străbunicul său.