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:

users
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:

sqlSELECT
  *
FROM
  users

Zdaj pridružimo uporabnikom njihove sinove. Tabelo bomo pridružili sami sebi, zato jo moramo preimenovati:

sqlLEFT JOIN users as sons

Zdaj lahko določimo povezavo med osnovno tabelo in preimenovano:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Zdaj določimo polja:

sqlSELECT
  users.name as user_name, sons.name as son_name

Vse skupaj sestavimo in dobimo naslednjo poizvedbo:

sqlSELECT
  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

Задание 1

Recimo, da imamo kategorije. Vsaka kategorija lahko pripada nadrejeni kategoriji, ta pa lahko pripada svoji nadrejeni kategoriji in tako naprej. Opišite strukturo shranjevanja.

Задание 2

Napišite poizvedbo, ki bo pridobila kategorijo skupaj z njeno nadrejeno kategorijo.

Задание 3

Napišite poizvedbo, ki bo pridobila kategorijo skupaj z njenim nadrejenim in prednadrejenim.

Задание 4

Napišite poizvedbo, ki bo pridobila kategorijo skupaj z njenim nadrejenim, prednadrejenim in praprednadrejenim.