Príbuzenské vzťahy dát v Pythone
Predpokladajme, že stojíme pred úlohou ukladať otcov a synov. Nech každý otec môže mať len jedného syna a syn na druhú stranu tiež môže mať jedného syna.
Musíme vymyslieť, ako budeme ukladať
dáta. Prvá myšlienka, ktorá môže napadnúť
- vytvoriť dve tabuľky: parents
pre otcov a sons pre synov. Potom
prepojiť tieto tabuľky nejakým poľom:
son_id alebo parent_id.
Avšak, táto myšlienka nie je veľmi dobrá - veď ta istá osoba môže byť súčasne aj otcom aj synom - a bude treba ju uložiť v oboch tabuľkách, čo je nepohodlné, zaberá viac miesta a ľahko vedie k chybám.
Lepšia možnosť - prepojiť tabuľku
samu so sebou: vytvoríme tabuľku users,
v nej budeme ukladať všetkých používateľov a každému
urobíme pole son_id, v ktorom bude
uložené id syna z tej istej tabuľky:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Dopytovanie
Poďme teraz napísať dopyt, ktorý načíta používateľa spolu s jeho synom.
Na začiatok jednoducho načítajme používateľov:
SELECT
*
FROM
users
Teraz pridáme JOIN na ich synov. Budeme spájať tabuľku samu so sebou, preto je potrebné vykonať jej premenovanie:
LEFT JOIN users as sons
Teraz môžeme určiť prepojenie hlavnej tabuľky a premenovanej:
LEFT JOIN users as sons ON sons.id=users.son_id
Teraz určme polia:
SELECT
users.name as user_name, sons.name as son_name
Poďme to všetko pospájať a získame nasledujúci dopyt:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktické úlohy
Predpokladajme, že máme kategórie. Každá kategória môže patriť do nadradenej kategórie, ktorá môže patriť do svojej nadradenej kategórie a tak ďalej. Popíšte štruktúru ukladania.
Napíšte dopyt, ktorý načíta kategóriu spolu s jej nadradenou kategóriou.
Napíšte dopyt, ktorý načíta kategóriu spolu s jej nadradenou kategóriou a nadradenou kategóriou nadradenej kategórie.
Napíšte dopyt, ktorý načíta kategóriu spolu s jej nadradenou kategóriou, nadradenou kategóriou nadradenej kategórie a nadradenou kategóriou nadradenej kategórie nadradenej kategórie.