Деректердің туыстық байланыстары Python-да

Бізде әкелер мен ұлдарын сақтау мәселесі тұрсын. Әр әкеде тек бір ұлы болуы мүмкін, ал ұлы өз кезегінде бір ұлы болуы мүмкін.

Біз деректерді қалай сақтайтынымызды ойластыруымыз керек. Алғашқы ойға келетін идея - екі кесте жасау: parents әкелер үшін және sons ұлдар үшін. Содан кейін бұл кестелерді қандай да бір өріспен байланыстыру: son_id немесе parent_id.

Алайда, бұл идея өте жақсы емес - өйткені бір адам бір уақытта әке де, ұл да болуы мүмкін - және оны екі кестеде де сақтауға тура келеді, бұл ыңғайсыз, көбірек орын алады және оңай қателіктерге әкеледі.

Жақсы нұсқа - кестені өзімен өзіне байланыстыру: users кестесін жасаймыз, онда барлық пайдаланушыларды сақтаймыз және әрқайсысына son_id өрісін жасаймыз, онда осы кестенің ұлының id сақталады:

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

Сұраулар

Енді пайдаланушыны оның ұлымен бірге алатын сұрау жазайық.

Алдымен пайдаланушыларды алайық:

sqlSELECT
  *
FROM
  users

Енді пайдаланушыларға олардың ұлдарын қосамыз. Біз кестені өзіне қосамыз, сондықтан оны қайта атау керек:

sqlLEFT JOIN users as sons

Енді негізгі кесте мен қайта аталған кесте арасындағы байланысты көрсете аламыз:

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

Енді өрістерді көрсетейік:

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

Барлығын жинап, келесі сұрау аламыз:

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

Практикалық тапсырмалар

Задание 1

Бізде санаттар бар делік. Әрбір санат аналық санатқа жатуы мүмкін, ол өз кезегінде өз аталық санатына және т.с.с. Сактау құрылымын сипаттаңыз.

Задание 2

Санатты оның аталық санатымен бірге алатын сұрау жазыңыз.

Задание 3

Санатты оның атасымен және әжесімен бірге алатын сұрау жазыңыз.

Задание 4

Санатты оның атасымен, әжесімен және бабасымен бірге алатын сұрау жазыңыз.