Podatkovne povezave sorodstva v PHP

Recimo, da se soočamo z nalogo shranjevanja očetov in sinov. Naj ima vsak oče samo enega sina, sin pa lahko prav tako ima enega sina.

Ugotoviti moramo, kako bomo shranjevali podatke. Prva ideja, ki lahko pride na misel - narediti dve tabeli: parents za očete in sons za sinove. Nato povezati ti tabeli s kakšnim poljem: son_id ali parent_id.

Vendar ta ideja ni zelo dobra - saj lahko ista oseba hkrati je oče in sin - in jo bo treba shraniti v obeh tabelah, kar je neprijetno, zavzame več prostora in zlahka vodi do napak.

Boljša možnost - povezati tabelo samo s seboj: naredimo tabelo users, v njej bomo shranjevali vse uporabnike in vsakemu dodelili 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. Pridruževanje bomo naredili tabelo samo sebi, zato moramo izvesti njeno preimenovanje:

sqlLEFT JOIN users as sons

Zdaj lahko določimo povezavo glavne tabele in preimenovane:

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

Določimo zdaj 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 starim nadrejenim.

Задание 4

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