Datu radniecības saites Python
Pieņemsim, ka mums ir uzdevums glabāt tēvus un dēlus. Pieņemsim, ka katram tēvam var būt tikai viens dēls, un dēlam savukārt arī var būt viens dēls.
Jāizdomā, kā mēs glabāsim
datus. Pirmā ideja, kas var nākt
prātā - izveidot divas tabulas: parents
tēviem un sons dēliem. Pēc tam
savienot šīs tabulas ar kādu lauku:
son_id vai parent_id.
Tomēr šī ideja nav īsti laba - jo viens un tas pats cilvēks var vienlaikus būt gan tēvs, gan dēls - un nāksies viņu glabāt abās tabulās, kas ir neērti, aizņem vairāk vietas un viegli noved pie kļūdām.
Labāks variants ir saistīt tabulu
pati ar sevi: izveidosim tabulu users,
tajā glabāsim visus lietotājus un katram
izveidosim lauku son_id, kurā tiks
glabāts id dēls no šīs pašas tabulas:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Pieprasījumi
Tagad uzrakstīsim pieprasījumu, kas iegūs lietotāju kopā ar viņa dēlu.
Sākumā vienkārši iegūsim lietotājus:
SELECT
*
FROM
users
Tagad pievienosim (LEFT JOIN) lietotājiem viņu dēlus. Mēs savienosim tabulu pati ar sevi, tāpēc mums tā ir jāpārsauc:
LEFT JOIN users as sons
Tagad mēs varam norādīt saiti starp pamata tabulu un pārsaukto:
LEFT JOIN users as sons ON sons.id=users.son_id
Tagad norādīsim laukus:
SELECT
users.name as user_name, sons.name as son_name
Saliksim visu kopā un iegūsim šādu pieprasījumu:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktiskie uzdevumi
Pieņemsim, ka mums ir kategorijas. Katra kategorija var piederēt vecāku kategorijai, tā savukārt savai vecāku kategorijai un tā tālāk. Aprakstiet glabāšanas struktūru.
Uzrakstiet pieprasījumu, kas iegūs kategoriju kopā ar tās vecāku kategoriju.
Uzrakstiet pieprasījumu, kas iegūs kategoriju kopā ar tās vecāku un vectēvu kategoriju.
Uzrakstiet pieprasījumu, kas iegūs kategoriju kopā ar tās vecāku, vectēvu un vecvectēvu kategoriju.