Duomenų giminystės ryšiai Python

Tarkime, kad prieš mus yra užduotis saugoti tėvus ir sūnus. Tarkime, kad kiekvienas tėvas gali turėti tik vieną sūnų, o sūnus savo ruožtu taip pat gali turėti vieną sūnų.

Reikia sugalvoti, kaip saugosime duomenis. Pirma mintis, kuri gali ateiti į galvą – sukurti dvi lenteles: parents tėvams ir sons sūnums. Tada susieti šias lenteles kokiu nors lauku: son_id arba parent_id.

Tačiau ši idėja nėra labai gera – juk tas pats žmogus gali vienu metu būti ir tėvu, ir sūnumi – ir teks jį saugoti abiejose lentelėse, o tai nepatogu, užima daugiau vietos ir lengvai sukelia klaidų.

Geresnis variantas – susieti lentelę pats su savimi: sukurkime lentelę users, joje saugosime visus vartotojus ir kiekvienam sukursime lauką son_id, kuriame bus saugomas id sūnaus iš tos pačios lentelės:

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

Užklausos

Dabar parašykime užklausą, kuri gaus vartotoją kartu su jo sūnumi.

Pirmiausia tiesiog gaukime vartotojus:

sqlSELECT
  *
FROM
  users

Dabar prijungkime prie vartotojų jų sūnus. Prijungti mes lentelę patys prie savęs, taigi mums reikia atlikti jos pervadinimą:

sqlLEFT JOIN users as sons

Dabar galime nurodyti pagrindinės lentelės ir pervadintos lentelės ryšį:

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

Dabar nurodykime laukus:

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

Sujunkime viską kartu ir gausime tokią užklausą:

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

Praktinės užduotys

Задание 1

Tarkime, kad turime kategorijas. Kiekviena kategorija gali priklausyti tėvinė kategorijai, ta savo ruožtu savo tėvinei kategorijai ir taip toliau. Aprašykite saugojimo struktūrą.

Задание 2

Parašykite užklausą, kuri gaus kategoriją kartu su jos tėvine kategorija.

Задание 3

Parašykite užklausą, kuri gaus kategoriją kartu su jos tėvu ir seneliu.

Задание 4

Parašykite užklausą, kuri gaus kategoriją kartu su jos tėvu, seneliu ir proseneliu.