Родствени връзки на данни в 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

Напишете заявка, която извлича категория заедно с нейния родител, прародител и прапрародител.