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:
| 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:
SELECT
*
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:
LEFT JOIN users as sons
Nu kan vi ange relationen mellan huvudtabellen och den omdöpta tabellen:
LEFT JOIN users as sons ON sons.id=users.son_id
Låt oss nu ange fälten:
SELECT
users.name as user_name, sons.name as son_name
Sätter vi ihop allt får vi följande förfrågan:
SELECT
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
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.
Skriv en förfrågan som hämtar en kategori tillsammans med dess överordnade kategori.
Skriv en förfrågan som hämtar en kategori tillsammans med dess förälder och morförälder (eller farförälder).
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").