მონაცემთა ნათესაური კავშირები 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

დაწერეთ მოთხოვნა, რომელიც ამოიღებს კატეგორიას მის მშობელთან, ბაბუასთან და პრაპრაბაბუასთან ერთად.