Родственные связи података у PHP-у

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

Потребно је да смислимо како ћемо чувати податке. Прва идеја која може пасти на памет - направити две табеле: parents за очеве и sons за синове. Затим повезати ове табеле неким пољем: son_id или parent_id.

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

Боља варијанта је повезивање табеле саме са собом: направимо табелу users, у њој ћемо чувати све кориснике и сваком направити поље son_id, у коме ће се чувати id сина из исте табеле:

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

Упити

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

За почеткa хајде да просто извучемо кориснике:

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

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