Datas slektskapsrelasjoner i Python
La oss anta at vi står overfor oppgaven med å lagre fedre og sønner. La hver far ha bare én sønn, og sønnen i sin tur kan også ha én sønn.
Vi må finne ut hvordan vi skal lagre
dataene. Den første ideen som kan komme
til hjernen er å lage to tabeller: parents
for fedre og sons for sønner. Deretter
koble disse tabellene med et eller annet felt:
son_id eller parent_id.
Imidlertid er ikke denne ideen veldig god - for samme person kan samtidig være både far og sønn - og vi må lagre ham i begge tabellene, noe som er upraktisk, tar opp mer plass og leder lett til feil.
Et bedre alternativ er å koble tabellen
til seg selv: la oss lage en tabell users,
der vi lagrer alle brukerne og gir hver
et felt son_id, hvor
id til sønnen fra samme tabell vil bli lagret:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Spørringer
La oss nå skrive en spørring som henter brukeren sammen med sønnen hans.
La oss først bare hente brukerne:
SELECT
*
FROM
users
La oss nå joine med sønnene deres. Vi skal joine tabellen med seg selv, derfor må vi utføre omdøping av den:
LEFT JOIN users as sons
Nå kan vi spesifisere sammenhengen mellom hovedtabellen og den omdøpte tabellen:
LEFT JOIN users as sons ON sons.id=users.son_id
La oss nå spesifisere feltene:
SELECT
users.name as user_name, sons.name as son_name
La oss sette alt sammen og få følgende spørring:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktiske oppgaver
La oss si at vi har kategorier. Hver kategori kan tilhøre en overordnet kategori, og den kan i sin tur tilhøre sin overordnete kategori, og så videre. Beskriv lagringsstrukturen.
Skriv en spørring som henter kategorien sammen med dens overordnede kategori.
Skriv en spørring som henter kategorien sammen med dens overordnede kategori og besteforelderkategori.
Skriv en spørring som henter kategorien sammen med dens overordnede kategori, besteforelderkategori og oldeforelderkategori.