⊗pyPmDOFR 126 of 129 menu

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:

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").

idbnenpthu