Mencoba postgres ltree

Sudah cukup umum untuk menggunakan self-refrerencing foreign key untuk membuat hirarki (tree) di dalam relational database. Kita memerlukan suatu cara untuk mengakses hirarki tersebut dengan mudah. Cara-cara yang penulis ketahui antara lain:

  • Jika menggunakan postgres, bisa menggunakan query rekursif.
  • Tabel closure. Kita cukup menggunakan query “biasa”, bukan rekursif. Perlu dicatat bahwa kita perlu menjaga closure table tetap up-to-date dengan setiap perubahan di table utama.

Beberapa versi terakhir, postgres menyertakan tipe data ltree. Kita bisa menambahkan kolom bertipe ini langsung pada table hirarki. Tipe data ini querynya mirip dengan regex, yaitu pencocokan pola string. Mari kita coba.

Pertama kita buat dulu database baru yang memiliki ekstensi ltree.

CREATE DATABASE treant;
CREATE EXTENSION ltree; -- on the database above

Lalu buat tabel beserta data-datanya. Demi keringkasan, kita hanya akan membuat tipe data ltree saja di tabel tersebut tanpa parent_id dan sebagainya.

CREATE TABLE test (path ltree);
INSERT INTO test VALUES ('Politics');
INSERT INTO test VALUES ('Politics.Local');
INSERT INTO test VALUES ('Politics.Local.Elections');
INSERT INTO test VALUES ('Politics.International');
INSERT INTO test VALUES ('Politics.International.Africa');
INSERT INTO test VALUES ('Politics.International.Europe');
INSERT INTO test VALUES ('Politics.International.US');
  • Query rekursif. Ini lebih sulit dari pilihan lainnya, tetapi tidak ada kompleksitas tambahan karena segalanya terkandung di dalam self-referencing foreign-key (parent_id, etc).
  • Tabel closure. Masih menggunakan SQL query, tetapi lebih mudah dari opsi pertama. Butuh maintain tabel closure nya agar selalu terupdate.
  • ltree. Opsi yang paling mudah untuk melakukan query pada hirarki. Juga perlu menjaga agar path tiap row selalu terupdate.
Jika pembaca ada yang sudah berpengalaman dengan SQL, tentu opsi pertama bisa menjadi pilihan.