Ada yang pernah mengalami kesulitan untuk mengimplementasikan pengolahan data secara hirarki? Buat yang belum tahu apa yang dimaksud pengolahan data secara hirarki, dapat membaca referensi berikut:
– What are the options for storing hierarchical data in a relational database?
– Models for Hierarchical Data with SQL and PHP —> lihat slide ke-69 yang berjudul Choosing the Right Design
– The simplest(?) way to do tree-based queries in SQL
Setelah Anda membaca ketiga referensi tadi, maka kita bisa menyimpulkan bahwa cara yang paling efektif dan efisien adalah dengan menggunakan model Closure Table atau sering dikenal dengan istilah Bridge Table.
Sebagai Developer, sebenarnya kita sudah pernah mengimplementasikan data hirarki ini. Misalnya, kita mengelompokkan data berdasarkan Kategori. Nah, itu salah satu bentuk dari pengolahan data secara hirarki. Biasanya kita membuat field Kategori di tabel yang terkait.
Jika hanya satu level Kategori saja, tentu tidak masalah menggunakan cara itu. Permasalahan akan timbul ketika kita harus mengelola data Kategori yang tingkat kedalamannya bisa lebih dari satu, dua, atau tiga level. Kita akan mengalami kesulitan saat membuat Query ke Database.
Model seperti itu disebut dengan Adjacency List, dan ini adalah model yang paling umum dan paling sering kita gunakan selama ini. Disadari atau tidak. Untuk mengatasi permasalahan yang sering timbul di model ini, maka kita disarankan untuk menggunakan model Closure Table.
Model Closure Table menggunakan dua Table di Database. Table pertama untuk menyimpan data utama berupa Node (contoh: Komentar). Table kedua untuk menyimpan path atau lokasi atau relasi antar Node (biasanya disebut dengan Treepaths).
Dari sekian banyaknya model yang digunakan untuk mengelola data secara hirarki, model Closure Table memiliki paling banyak kelebihan dibandingkan model lainnya. Apa saja itu?
– Query Child, mudah membuat Query untuk mencari Node tertentu yang berperan sebagai Child,
– Query Subtree, mudah membuat Query untuk menampilkan beberapa Node Child secara hirarki berdasarkan Node Parent-nya,
– Delete Node, mudah membuat Query untuk menghapus salah satu Node beserta seluruh Node di bawahnya (jika ada),
– Insert Node, mudah membuat Query untuk menambahkan Node yang baru beserta seluruh relasi ke Node terkait lainnya,
– Move Subtree, mudah membuat Query untuk memindahkan satu Node beserta seluruh Node yang berada di bawahnya (jika ada),
– Referential Integrity, memiliki aturan untuk memastikan sebuah Node memiliki relasi ke Node lainnya, atau jika hanya ada satu Node, minimal untuk relasi ke dirinya sendiri.
Sebenarnya masih banyak artikel-artikel di luar sana yang membahas mengenai model atau cara/teknik untuk menangani data secara hirarki menggunakan Closure Table. Tapi sayangnya, dari semua artikel-artikel tersebut, hampir semuanya, atau bisa dikatakan, nyaris semuanya tidak ada menyediakan contoh aplikasi web yang mewakili beberapa operasi yang umum digunakan, seperti CRUD.
Semuanya hanya menampilkan contoh-contoh yang tidak lengkap. Kebanyakan hanya membahas bagaimana sintaks SQL untuk menambah, mengubah, memindahkan, atau menghapus data saja. Tapi tidak ada satupun yang menampilkan contoh nyata yang mengimplementasikan model Closure Table tadi.
Misalnya, bagaimana cara menampilkannya di halaman web sesuai urutan hirarkinya? Bagaimaana cara menyimpan data jika sebuah Node ditambah atau disisipkan di tengah-tengah? Bagaimana cara memindahkan sebuah Node (beserta semua Node yang berada di bawahnya, jika ada)? Bagaimana cara menjadikan sebuah Node menjadi Node Induk yang baru? Bagaimana cara menghapus sebuah Node (beserta semua Node yang berada di bawahnya, jika ada)?
Beruntunglah Anda jika menggunakan tools PHPMaker untuk membangun Aplikasi Web. Mengapa? Karena penanganan data secara hirarki ini dapat dihasilkan dengan sangat mudah dan cepat. Bahkan, kita cukup hanya menambahkan sedikit kode saja melalui beberapa server event. Selebihnya ditangani oleh PHPMaker.
Jadi, tidak perlu membuat Aplikasi Web dari awal. Kita hanya perlu fokus untuk mengimplementasikan logic untuk membaca dan menampilkan data secara hirarki, termasuk logic untuk menyimpan data yang bisa terdiri dari beberapa record sekaligus menggunakan model Closure Table.
Sebagai informasi tambahan, sebenarnya salah satu model lainnya yang bernama Nested Sets, sudah pernah saya implementasikan untuk menampilkan Breadcrumb Links di Aplikasi Web yang dihasilkan oleh Masino Extensions untuk PHPMaker. Model Nested Sets ini memang cocok digunakan untuk menampilkan Breadcrumb Links, apalagi lewat Stored Procedures.
Tapi sayangnya, model Nested Sets tidak cocok untuk digunakan dalam mengolah data Komentar. Mengapa? Karena di model ini hanya memiliki satu node yang berperan sebagai Top Parent (Node yang posisinya berada paling atas).
Sedangkan model Closure Table memiliki potensi yang sangat besar untuk dikembangkan, sehingga memungkinkan untuk membuat logic menyimpan lebih dari satu Node yang posisinya berada paling atas. Contoh sederhananya adalah pengelolaan data Komentar.
Oke, kita kembali ke topik. Supaya tidak penasaran seperti apa sih pengelolaan data secara hirarki menggunakan model Closure Table, model baru di samping model Nested Sets pada Aplikasi Web yang dihasilkan oleh PHPMaker 2020, silahkan klik di sini.
Dari demo tersebut, kita dapat menambah, memindahkan, menghapus, dan menampilkan data Komentar (Comments) secara hirarki menggunakan model Closure Table. Oleh karena itu, demo Aplikasi Web ini saya namakan dengan Closure Comment.
Banyak hal yang bisa Anda pelajari mengenai model Closure Table melalui file project PHPMaker dan file Database-nya. Semuanya diawali dengan dua buah kata yaitu: Betapa mudahnya … :
- Merancang Tables dan juga Database Views yang digunakan,
- Membaca data secara hirarki dan menampilkannya lewat kode HTML dan Custom File di project PHPMaker,
- Membuat function yang dapat memanggil dirinya sendiri (recursive function) di PHP untuk menampilkan data secara hirarki,
- Mengolah data yang terdiri dari beberapa record sekaligus saat sebuah Komentar Baru disimpan,
- Menjadikan beberapa Komentar sebagai Komentar Induk (jadi, tidak hanya satu Komentar saja yang dapat berperan sebagai Induk),
- Mengolah data yang terdiri dari beberapa record saat sebuah Komentar dibalas (Reply)
- Memindahkan sebuah Komentar (beserta seluruh Komentar yang berada di bawahnya; jika ada) ke bawah parent/induk Komentar lainnya yang berada di atasnya,
- Memindahkan sebuah Komentar (beserta seluruh Komentar yang berada di bawahnya; jika ada) menjadi sebuah Komentar Induk yang Baru,
- Menghapus sebuah Komentar (beserta seluruh Komentar yang berada di bawahnya; jika ada),
- Membuat logic untuk memperbarui tingkat kedalaman beberapa Komentar sekaligus jika suatu Komentar dipindahkan atau dihapus,
- Mengetahui Komentar-komentar mana saja yang berada di bawah dari sebuah Komentar yang posisinya berada di atas levelnya,
- Mencari data Ancestor (Induk/Parent) berdasarkan data Descendant (Anak/Child) tertentu.
- Mencari data Descendant (Anak/Child) berdasarkan data Ancestor (Induk/Parent) tertentu.
- Mengetahui Komentar-komentar mana saja yang posisinya berada paling atas (Top Parent Comment),
- Menampilkan jendela Modal Dialog berisi form untuk memindahkan atau menghapus Komentar yang terdapat di Tables lain melalui halaman Custom Files,
- Menggunakan Custom Field yang menampilkan berisi pilihan Komentar untuk membantu proses pemindahan Komentar,
- Membuat logic untuk menyaring (filter) Komentar-komentar mana saja yang dapat dipilih sebagai Komentar tujuan di Custom Field,
- Mencegah Pengguna Akhir untuk membuka form Edit yang berusaha ingin memindahkan Komentar paling atas,
- Mengoptimalkan penggunaan Database View yang dapat digunakan untuk memisahkan proses yang berbeda,
- Membuat dua business-logic yang berbeda untuk menambahkan Komentar dalam sebuah object Database View; satu untuk menambah Komentar Baru, dan yang satunya lagi untuk menambah/membalas (Reply) Komentar yang sudah ada,
- Membuat logic untuk menampilkan atau menyembunyikan Custom Field di form berdasarkan kondisi tertentu,
- Dan masih banyak lagi …
Satu lagi bukti bahwa PHPMaker dapat mengatasi hal-hal yang sebelumnya sama sekali tidak kita duga apakah dapat dilakukan lewat PHPMaker. Jangan lupa, kunjungi Demo of Closure Table via Web Application that Generated by PHPMaker 2020 2022 2023 (update terakhir 15 Maret 2023 menggunakan PHPMaker versi 2023.11).
ameisfine mengatakan
Semakin menarik. Terimakasih sharing ilmunya pak.
Dalam project sy adakah cara untuk dapat movable ‘sales detail’ jg pak? biasanya dalam nota cuma perlu edit urutan baris barang nya saja biar lebih enak dibaca.
Masino Sinaga mengatakan
Sama-sama.
“Movable sales detail”, maksudnya bagaimana ya?
Bagus mengatakan
Kalo buat aplikasi survey / kuesioner. Yang pertanyaan nya bisa bertingkat dan melompat sesuai pilihan jawaban sebelumnya. Apa muda pakai php maker.
Masino Sinaga mengatakan
Muda atau tua? Hehehe…
bagus mengatakan
kalo membuat semisal form survey / kuesioner yang pertanyaannya bertingkat tingkat dan melompat. seperti jika jawaban A maka langsung ke pertanyaan nomer 10. jika jawaban B pertanyaan langsung ke nomer 15. apa mudah membuat hal begini dengan phpmaker ? terimakasih
Masino Sinaga mengatakan
Mudah kalau Anda sudah menguasai fitur-fitur dasar PHPMaker itu sendiri.
Charly mengatakan
Mat Malam, Pak Masino. mohon bantuannya.
Apakah bisa PHPMaker Menangani Data Secara Hirarki dibuat menggunakan Views dengan hasil kira2 seperti dibawah ini:
PROGRAM KEGIATAN
1. PROGRAM AAA
2. KEGIATAN AAA
3. KEGIATAN AAA
4. PROGRAM BBB
5. KEGIATAN BBB
6. KEGIATAN BBB
7. PROGRAM CCC
8. KEGIATAN CCC
9. KEGIATAN CCC
Pak Masino, jika sudah ada tutorialnya mohon bantuannya. Makasih
Masino Sinaga mengatakan
Sudah coba fitur Master Detail?
Charly mengatakan
Maaf Pak Masino maksudnya tampilan di list view jadinya seperti nested table.
Kalo di list view phpmaker defaulnya tampilannya kira2 seperti ini:
PROGRAM
KEGIATAN
1
PROGRAM AA
KEGIATAN 111
2
PROGRAM AA
KEGIATAN 222
3
PROGRAM BB
KEGIATAN 333
4
PROGRAM BB
KEGIATAN 444
Nah maksud saya bisa gak di list view tampilannya kira2 jadi seperti ini :
PROGRAM
KEGIATAN
PROGRAM AA
1
KEGIATAN 111
2
KEGIATAN 222
PROGRAM BB
3
KEGIATAN 333
4
KEGIATAN 444
Charly mengatakan
Maaf Pak Masino,
tampilannya bukan seperti diatas
Masino Sinaga mengatakan
Kalau pakai PHPMaker 2021, Anda bisa menggunakan fitur Reports untuk menampilkan data yang di-groupping seperti itu.
Charly mengatakan
Makasih Pak Masino.