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:
| 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:
SELECT
*
FROM
users
Dabar prijungkime prie vartotojų jų sūnus. Prijungti mes lentelę patys prie savęs, taigi mums reikia atlikti jos pervadinimą:
LEFT JOIN users as sons
Dabar galime nurodyti pagrindinės lentelės ir pervadintos lentelės ryšį:
LEFT JOIN users as sons ON sons.id=users.son_id
Dabar nurodykime laukus:
SELECT
users.name as user_name, sons.name as son_name
Sujunkime viską kartu ir gausime tokią užklausą:
SELECT
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
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ą.
Parašykite užklausą, kuri gaus kategoriją kartu su jos tėvine kategorija.
Parašykite užklausą, kuri gaus kategoriją kartu su jos tėvu ir seneliu.
Parašykite užklausą, kuri gaus kategoriją kartu su jos tėvu, seneliu ir proseneliu.