Podatkovne povezave v Pythonu
Recimo, da se soočamo z nalogo shranjevanja očetov in sinov. Naj ima vsak oče le enega sina, sin pa lahko prav tako ima enega sina.
Ugotoviti moramo, kako bomo shranjevali
podatke. Prva ideja, ki lahko pride
na misel, je narediti dve tabeli: parents
za očete in sons za sinove. Nato
povežemo ti tabeli z nekim poljem:
son_id ali parent_id.
Vendar ta ideja ni zelo dobra - saj lahko ista oseba hkrati biti oče in sin - in jo bo treba shraniti v obeh tabelah, kar je neprijetno, zavzema več prostora in zlahka vodi do napak.
Boljša možnost je povezati tabelo
samo s seboj: naredimo tabelo users,
v njej bomo shranjevali vse uporabnike in vsakemu
dodamo polje son_id, kjer bo
shranjen id sina iz iste tabele:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Poizvedbe
Zdaj napišimo poizvedbo, ki bo pridobila uporabnika skupaj z njegovim sinom.
Za začetek preprosto pridobimo uporabnike:
SELECT
*
FROM
users
Zdaj pridružimo uporabnikom njihove sinove. Tabelo bomo pridružili sami sebi, zato jo moramo preimenovati:
LEFT JOIN users as sons
Zdaj lahko določimo povezavo med osnovno tabelo in preimenovano:
LEFT JOIN users as sons ON sons.id=users.son_id
Zdaj določimo polja:
SELECT
users.name as user_name, sons.name as son_name
Vse skupaj sestavimo in dobimo naslednjo poizvedbo:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktične naloge
Recimo, da imamo kategorije. Vsaka kategorija lahko pripada nadrejeni kategoriji, ta pa lahko pripada svoji nadrejeni kategoriji in tako naprej. Opišite strukturo shranjevanja.
Napišite poizvedbo, ki bo pridobila kategorijo skupaj z njeno nadrejeno kategorijo.
Napišite poizvedbo, ki bo pridobila kategorijo skupaj z njenim nadrejenim in prednadrejenim.
Napišite poizvedbo, ki bo pridobila kategorijo skupaj z njenim nadrejenim, prednadrejenim in praprednadrejenim.