Деректердің туыстық байланыстары Python-да
Бізде әкелер мен ұлдарын сақтау мәселесі тұрсын. Әр әкеде тек бір ұлы болуы мүмкін, ал ұлы өз кезегінде бір ұлы болуы мүмкін.
Біз деректерді қалай сақтайтынымызды ойластыруымыз керек.
Алғашқы ойға келетін идея - екі кесте жасау: parents
әкелер үшін және sons ұлдар үшін. Содан кейін
бұл кестелерді қандай да бір өріспен байланыстыру:
son_id немесе parent_id.
Алайда, бұл идея өте жақсы емес - өйткені бір адам бір уақытта әке де, ұл да болуы мүмкін - және оны екі кестеде де сақтауға тура келеді, бұл ыңғайсыз, көбірек орын алады және оңай қателіктерге әкеледі.
Жақсы нұсқа - кестені өзімен
өзіне байланыстыру: users кестесін жасаймыз,
онда барлық пайдаланушыларды сақтаймыз және әрқайсысына
son_id өрісін жасаймыз, онда осы кестенің
ұлының id сақталады:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Сұраулар
Енді пайдаланушыны оның ұлымен бірге алатын сұрау жазайық.
Алдымен пайдаланушыларды алайық:
SELECT
*
FROM
users
Енді пайдаланушыларға олардың ұлдарын қосамыз. Біз кестені өзіне қосамыз, сондықтан оны қайта атау керек:
LEFT JOIN users as sons
Енді негізгі кесте мен қайта аталған кесте арасындағы байланысты көрсете аламыз:
LEFT JOIN users as sons ON sons.id=users.son_id
Енді өрістерді көрсетейік:
SELECT
users.name as user_name, sons.name as son_name
Барлығын жинап, келесі сұрау аламыз:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Практикалық тапсырмалар
Бізде санаттар бар делік. Әрбір санат аналық санатқа жатуы мүмкін, ол өз кезегінде өз аталық санатына және т.с.с. Сактау құрылымын сипаттаңыз.
Санатты оның аталық санатымен бірге алатын сұрау жазыңыз.
Санатты оның атасымен және әжесімен бірге алатын сұрау жазыңыз.
Санатты оның атасымен, әжесімен және бабасымен бірге алатын сұрау жазыңыз.