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:

users
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:

sqlSELECT
  *
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:

sqlLEFT JOIN users as sons

Nu kan vi angive forbindelsen mellem hovedtabellen og den omdøbte tabel:

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

Lad os nu angive felterne:

sqlSELECT
  users.name as user_name, sons.name as son_name

Lad os samle alt og få følgende forespørgsel:

sqlSELECT
  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

Задание 1

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.

Задание 2

Skriv en forespørgsel, som henter kategorien sammen med dens overordnede kategori.

Задание 3

Skriv en forespørgsel, som henter kategorien sammen med dens forælder og bedsteforælder.

Задание 4

Skriv en forespørgsel, som henter kategorien sammen med dens forælder, bedsteforælder og oldemor/-fader.