Adatkapcsolatok rokoni viszonyai Pythonban
Tegyük fel, hogy az a feladatunk, hogy apákat és fiúkat tároljunk. Tegyük fel, hogy minden apának csak egy fia lehet, a fiúnak pedig viszont szintén lehet egy fia.
Ki kell találnunk, hogyan fogjuk tárolni az
adatokat. Az első ötlet, ami eszünkbe juthat -
két táblát készíteni: parents
az apáknak és sons a fiúknak. Majd
összekapcsolni ezeket a táblákat valamilyen mezővel:
son_id vagy parent_id.
Ez az ötlet azonban nem túl jó - hiszen ugyanaz a személy lehet egyszerre apa és fiú - és mindkét táblában tárolnunk kellene, ami kényelmetlen, több helyet foglal és könnyen hibákhoz vezet.
Egy jobb megoldás - összekapcsolni a táblát
önmagával: készítsünk egy users táblát,
ebben tároljuk az összes felhasználót és mindenkinek
adjunk egy son_id mezőt, amiben a
fiú id-ja lesz tárolva ugyanebből a táblából:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Lekérdezések
Most írjunk egy lekérdezést, amely kihozza a felhasználót a fiával együtt.
Kezdetként egyszerűen hozzuk ki a felhasználókat:
SELECT
*
FROM
users
Most csatoljunk (JOIN) hozzájuk a fiaikat. Önmagához fogjuk csatolni a táblát, ezért át kell neveznünk:
LEFT JOIN users as sons
Most megadhatjuk az alap tábla és az átnevezett tábla közötti kapcsolatot:
LEFT JOIN users as sons ON sons.id=users.son_id
Most adjuk meg a mezőket:
SELECT
users.name as user_name, sons.name as son_name
Rakjuk össze az egészet, és a következő lekérdezést kapjuk:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Gyakorlati feladatok
Tegyük fel, hogy vannak kategóriáink. Minden kategória tartozhat egy szülő kategóriához, az pedig viszont a saját szülő kategóriájához és így tovább. Írd le a tárolás szerkezetét.
Írj egy lekérdezést, amely kikéri a kategóriát a szülő kategóriájával együtt.
Írj egy lekérdezést, amely kikéri a kategóriát a szülőjével és a nagyszülőjével együtt.
Írj egy lekérdezést, amely kikéri a kategóriát a szülőjével, a nagyszülőjével és a dédszülőjével együtt.