Релације података у Pythoneу
Претпоставимо да се налазимо пред задатком да чувамо очеве и синове. Претпоставимо да сваки отац може имати само једног сина, а син за узврат такође може имати једног сина.
Потребно је смислити како ћемо чувати
податке. Прва идеја која може пасти
на памет јесте направити две табеле: 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
Сада ћемо придружити (join) корисницима њихове синове. Придруживаћемо табелу саму собі, па је потребно извршити њено преименовање:
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
Практични задаци
Претпоставимо да имамо категорије. Свака категорија може припадати родитељској категорији, она за узврат својој родитељској и тако даље. Опишите структуру складиштења.
Напишите упит који ће извући категорију заједно са њеном родитељском категоријом.
Напишите упит који ће извући категорију заједно са њеним родитељем и претком (родитељем родитеља).
Напишите упит који ће извући категорију заједно са њеним родитељем, претком и претком претка.