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:
| 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:
SELECT
*
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:
LEFT JOIN users as sons
Sekarang kita dapat menentukan hubungan antara tabel utama dan tabel yang telah diubah namanya:
LEFT JOIN users as sons ON sons.id=users.son_id
Sekarang mari tentukan field-fieldnya:
SELECT
users.name as user_name, sons.name as son_name
Mari satukan semuanya dan kita dapatkan query berikut:
SELECT
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
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.
Tuliskan query yang akan mengambil sebuah kategori beserta kategori induknya.
Tuliskan query yang akan mengambil sebuah kategori beserta induk dan kakek/nenek (grandparent)-nya.
Tuliskan query yang akan mengambil sebuah kategori beserta induk, kakek/nenek (grandparent), dan orang tua dari kakek/nenek (great-grandparent)-nya.