Datas släktskapsrelationer i Python

Låt oss anta att vi har uppgiften att lagra fäder och söner. Låt varje far bara ha en son, och sonen i sin tur kan också ha en son.

Vi behöver komma på hur vi ska lagra data. Den första idén som kan komma till huvudet är att skapa två tabeller: parents för fäder och sons för söner. Sedan länka dessa tabeller med något fält: son_id eller parent_id.

Men det här är inte en särskilt bra idé - för samma person kan samtidigt vara både far och son - och vi skulle behöva lagra honom i båda tabellerna, vilket är obekvämt, tar upp mer plats och lätt leder till fel.

Ett bättre alternativ är att länka tabellen med sig själv: vi skapar en tabell users, där vi lagrar alla användare och ger varje användare ett fält son_id, där id för sonen från samma tabell kommer att lagras:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Förfrågningar

Låt oss nu skriva en förfrågan som hämtar en användare tillsammans med hans son.

Låt oss först bara hämta användarna:

sqlSELECT
  *
FROM
  users

Låt oss nu joina deras söner till användarna. Eftersom vi joinar tabellen med sig själv, måste vi byta namn på den:

sqlLEFT JOIN users as sons

Nu kan vi ange relationen mellan huvudtabellen och den omdöpta tabellen:

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

Låt oss nu ange fälten:

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

Sätter vi ihop allt får vi följande förfrågan:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Praktiska uppgifter

Задание 1

Låt oss anta att vi har kategorier. Varje kategori kan tillhöra en överordnad kategori, den i sin tur sin överordnade kategori och så vidare. Beskriv lagringsstrukturen.

Задание 2

Skriv en förfrågan som hämtar en kategori tillsammans med dess överordnade kategori.

Задание 3

Skriv en förfrågan som hämtar en kategori tillsammans med dess förälder och morförälder (eller farförälder).

Задание 4

Skriv en förfrågan som hämtar en kategori tillsammans med dess förälder, morförälder (eller farförälder) och "mormorsförälder" (eller "farfarsförälder").