Родствени врски на податоци во 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
Сега ќе им се придружиме на корисниците нивните синови. Ќе ја придружиме табелата самата на себе, затоа треба да извршиме нејзино преименување:
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
Практични задачи
Да претпоставиме дека имаме категории. Секоја категорија може да припаѓа на родителска категорија, таа пак на своја родителска и така натаму. Опишете ја структурата за складирање.
Напишете барање кое ќе ја земе категоријата заедно со нејзината родителска категорија.
Напишете барање кое ќе ја земе категоријата заедно со нејзиниот родител и прародител.
Напишете барање кое ќе ја земе категоријата заедно со нејзиниот родител, прародител и прапрародител.