Relasi Data Hierarkis dalam Python

Misalkan kita dihadapkan pada tugas untuk menyimpan data ayah dan anak laki-laki. Asumsikan setiap ayah hanya dapat memiliki satu anak laki-laki, dan anak laki-laki tersebut pada gilirannya juga dapat memiliki satu anak laki-laki.

Kita perlu memikirkan cara menyimpan datanya. Ide pertama yang mungkin muncul adalah membuat dua tabel: parents untuk ayah dan sons untuk anak laki-laki. Kemudian menghubungkan tabel-tabel ini dengan bidang tertentu: son_id atau parent_id.

Namun, ide ini tidak terlalu baik - karena orang yang sama bisa sekaligus menjadi ayah dan anak laki-laki - dan kita harus menyimpannya di kedua tabel, yang mana hal ini tidak nyaman, memakan lebih banyak ruang, dan mudah menimbulkan kesalahan.

Opsi yang lebih baik adalah menghubungkan tabel tersebut dengan dirinya sendiri: mari buat tabel users, di dalamnya kita akan menyimpan semua pengguna dan untuk setiap pengguna kita buat bidang son_id, yang akan menyimpan id anak laki-laki dari tabel yang sama:

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

Query

Sekarang mari kita tulis query yang akan mengambil pengguna beserta anak laki-lakinya.

Pertama-tama, mari ambil pengguna saja:

sqlSELECT
  *
FROM
  users

Sekarang mari gabungkan (JOIN) dengan anak laki-laki mereka. Kita akan menggabungkan tabel dengan dirinya sendiri, oleh karena itu kita perlu melakukan pengubahan nama tabel:

sqlLEFT JOIN users as sons

Sekarang kita dapat menentukan hubungan antara tabel utama dan tabel yang telah diubah namanya:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Sekarang mari tentukan field-fieldnya:

sqlSELECT
  users.name as user_name, sons.name as son_name

Mari satukan semuanya dan kita dapatkan query berikut:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Tugas Praktis

Задание 1

Misalkan kita memiliki kategori. Setiap kategori dapat dimiliki oleh kategori induk, kategori induk tersebut pada gilirannya dimiliki oleh induknya sendiri, dan seterusnya. Jelaskan struktur penyimpanannya.

Задание 2

Tuliskan query yang akan mengambil sebuah kategori beserta kategori induknya.

Задание 3

Tuliskan query yang akan mengambil sebuah kategori beserta induk dan kakek/nenek (grandparent)-nya.

Задание 4

Tuliskan query yang akan mengambil sebuah kategori beserta induk, kakek/nenek (grandparent), dan orang tua dari kakek/nenek (great-grandparent)-nya.