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:
| 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. Pridruževanje bomo naredili tabelo samo sebi, zato moramo izvesti njeno preimenovanje:
LEFT JOIN users as sons
Zdaj lahko določimo povezavo glavne tabele in preimenovane:
LEFT JOIN users as sons ON sons.id=users.son_id
Določimo zdaj 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 starim nadrejenim.
Napišite poizvedbo, ki bo pridobila kategorijo skupaj z njenim nadrejenim, starim nadrejenim in prababico.