Радаводныя сувязі даных у 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
Практычныя задачы
Няхай у нас ёсць катэгорыі. Кожная катэгорыя можа належаць бацькоўскай катэгорыі, тая ў сваю чаргу сваёй бацькоўскай і так далей. Распішыце структуру захоўвання.
Напішыце запыт, які дастане катэгорыю разам з яе бацькоўскай катэгорыяй.
Напішыце запыт, які дастане катэгорыю разам з яе бацькам і дзедам.
Напішыце запыт, які дастане катэгорыю разам з яе бацькам, дзедам і прадзедам.