Տվյալների ազգակցական կապերը Python-ում
Ենթադրենք, մեր առջեւ խնդիր է դրված պահել հայրերին եւ որդիներին: Ենթադրենք, յուրաքանչյուր հայր կարող է ունենալ միայն մեկ որդի, իսկ որդին իր հերթին նույնպես կարող է ունենալ մեկ որդի:
Պետք է մտածել, թե ինչպես ենք պահելու
տվյալները: Առաջին գաղափարը, որ կարող է գալ
գլխին՝ ստեղծել երկու աղյուսակ՝ parents
հայրերի համար եւ sons որդիների համար: Ապա
կապել այս աղյուսակները ինչ-որ դաշտով՝
son_id կամ parent_id:
Սակայն, այս գաղափարը շատ լավ չէ, քանի որ նույն մարդը կարող է միաժամանակ լինել եւ հայր եւ որդի՝ եւ ստիպված կլինենք պահել նրան երկու աղյուսակներում էլ, ինչը անհարմար է, զբաղեցնում է ավելի շատ տեղ եւ հեշտությամբ հանգեցնում է սխալների:
Ավելի լավ տարբերակը՝ կապել աղյուսակը
ինքն իրեն՝ ստեղծենք users աղյուսակը,
դրանում կպահենք բոլոր օգտատերերին եւ յուրաքանչյուրին
կստեղծենք son_id դաշտ, որում կպահվի
նույն աղյուսակի որդու id-ն:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Հարցումներ
Այժմ գրենք հարցում, որը կդուրս բերի օգտատերին նրա որդու հետ միասին:
Սկսելու համար պարզապես դուրս բերենք օգտատերերին:
SELECT
*
FROM
users
Այժմ միացնենք (join) օգտատերերին նրանց որդիներին: Մենք աղյուսակը կմիացնենք ինքն իրեն, ուստի անհրաժեշտ է կատարել դրա վերանվանումը:
LEFT JOIN users as sons
Այժմ մենք կարող ենք նշել հիմնական աղյուսակի եւ վերանվանված աղյուսակի կապը:
LEFT JOIN users as sons ON sons.id=users.son_id
Այժմ նշենք դաշտերը.
SELECT
users.name as user_name, sons.name as son_name
Հավաքենք ամենը միասին եւ կստանանք հետեւյալ հարցումը.
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Գործնական առաջադրանքներ
Ենթադրենք ունենք կատեգորիաներ: Յուրաքանչյուր կատեգորիա կարող է պատկանել ծնողական կատեգորիային, որը իր հերթին կարող է պատկանել իր ծնողական կատեգորիային եւ այդպես շարունակ: Նկարագրեք պահպանման կառուցվածքը:
Գրեք հարցում, որը կդուրս բերի կատեգորիան նրա ծնողական կատեգորիայի հետ միասին:
Գրեք հարցում, որը կդուրս բերի կատեգորիան նրա ծնողի եւ պապի հետ միասին:
Գրեք հարցում, որը կդուրս բերի կատեգորիան նրա ծնողի, պապի եւ նախապապի հետ միասին: