Dataforbindelser i Python
Lad os antage, at vi står over for opgaven med at gemme fædre og sønner. Lad hver far kun have én søn, og sønnen til gengæld også kun have én søn.
Vi skal finde på, hvordan vi vil gemme
dataene. Den første idé, der måske falder os
ind, er at lave to tabeller: parents
for fædre og sons for sønner. Derefter
forbinde disse tabeller med et eller andet felt:
son_id eller parent_id.
Dog er denne idé ikke særlig god - for samme person kan samtidigt være både far og søn - og vi bliver nødt til at gemme ham i begge tabeller, hvilket er upraktisk, optager mere plads og leder let til fejl.
En bedre mulighed er at forbinde tabellen
med sig selv: lad os lave en tabel users,
hvori vi gemmer alle brugere, og give hver
et felt son_id, hvor der vil blive
gemt id på sønnen fra den samme tabel:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Forespørgsler
Lad os nu skrive en forespørgsel, som henter brugeren sammen med hans søn.
Lad os starte med bare at hente brugerne:
SELECT
*
FROM
users
Lad os nu join deres sønner til brugerne. Vi vil joine tabellen med sig selv, så vi er nødt til at udføre en omdøbning af den:
LEFT JOIN users as sons
Nu kan vi angive forbindelsen mellem hovedtabellen og den omdøbte tabel:
LEFT JOIN users as sons ON sons.id=users.son_id
Lad os nu angive felterne:
SELECT
users.name as user_name, sons.name as son_name
Lad os samle alt og få følgende forespørgsel:
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 opgaver
Antag, at vi har kategorier. Hver kategori kan tilhøre en overordnet kategori, som til gengæld kan tilhøre sin egen overordnede kategori og så videre. Beskriv lagringsstrukturen.
Skriv en forespørgsel, som henter kategorien sammen med dens overordnede kategori.
Skriv en forespørgsel, som henter kategorien sammen med dens forælder og bedsteforælder.
Skriv en forespørgsel, som henter kategorien sammen med dens forælder, bedsteforælder og oldemor/-fader.