Релације података у Pythoneу

Претпоставимо да се налазимо пред задатком да чувамо очеве и синове. Претпоставимо да сваки отац може имати само једног сина, а син за узврат такође може имати једног сина.

Потребно је смислити како ћемо чувати податке. Прва идеја која може пасти на памет јесте направити две табеле: 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

Сада ћемо придружити (join) корисницима њихове синове. Придруживаћемо табелу саму собі, па је потребно извршити њено преименовање:

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

Напишите упит који ће извући категорију заједно са њеним родитељем, претком и претком претка.