PostgreSQL ULID Extension: Panduan Instalasi dan Sintaks

PostgreSQL ULID Extension adalah modul ekstensi sumber terbuka (biasanya ditulis dalam Rust atau C) yang memungkinkan database PostgreSQL menghasilkan Universally Unique Lexicographically Sortable Identifier (ULID). ULID dirancang sebagai alternatif dari UUID v4 yang memiliki keunggulan utama berupa komponen waktu (timestamp) di awal string, sehingga nilai identifier dapat diurutkan secara kronologis secara alami tanpa mengorbankan keunikan global.

Penggunaan ULID pada kolom kunci primer (primary key) atau kolom identifikasi tabel memberikan performa indeks B-tree yang jauh lebih baik dibandingkan UUID acak, karena mengurangi masalah random page writes dan fragmentasi indeks pada penyimpanan disk. Ekstensi ini menyediakan fungsi bawaan untuk menghasilkan ULID langsung dari SQL, baik dalam bentuk teks standar 26 karakter maupun tipe data biner.

Perbandingan ULID, UUID v4, dan SERIAL

Pemilihan jenis primary key sangat memengaruhi kinerja penulisan (write performance) dan ukuran penyimpanan pada tabel berskala besar. Tabel berikut membandingkan karakteristik teknis antara ULID, UUID v4, dan tipe SERIAL konvensional.

Fitur ULID (Postgres Extension) UUID v4 SERIAL / BIGSERIAL
Urutan Waktu (Sortable) Ya (Lexicographically) Tidak (Acak) Ya (Auto-increment integer)
Distribusi Global / Unik Ya (Tanpa koordinasi pusat) Ya (Tanpa koordinasi pusat) Tidak (Bergantung pada urutan lokal server)
Format Penyimpanan 128-bit (Teks 26 karakter / Bytea) 128-bit (Teks 36 karakter / UUID) 32-bit atau 64-bit integer
Keamanan URL / Eksternal Aman (Base32 Crockford) Aman Rentan Enumerasi (Dapat ditebak ID berikutnya)
Performa Indeks B-Tree Tinggi (Append-mostly optimal) Rendah (Fragmentasi indeks tinggi) Tinggi

Instalasi PostgreSQL ULID Extension

Ekstensi yang paling umum digunakan adalah pg_ulid yang dikembangkan dengan Rust menggunakan pgrx. Berikut adalah tahapan teknis instalasi pada sistem berbasis Linux (Ubuntu/Debian) dengan PostgreSQL versi 15 atau 16.

1. Prasyarat Sistem

Pastikan Anda memiliki hak akses superuser (superuser database atau sudo di sistem operasi) dan paket pengembangan PostgreSQL telah terpasang.

sudo apt-get install build-essential postgresql-server-dev-15 cargo rustc

2. Kompilasi dan Instalasi Ekstensi

Unduh atau klon repositori resmi pg_ulid, kemudian lakukan kompilasi menggunakan perangkat pengembangan Rust pgrx.

git clone https://github.com/pgrx-developers/pg_ulid.git
cd pg_ulid
cargo pgrx init
cargo pgrx install --release

3. Mengaktifkan Ekstensi dalam Database

Setelah biner ekstensi berhasil disalin ke direktori ekstensi PostgreSQL, sambungkan ke database target melalui terminal psql dan jalankan perintah berikut:

CREATE EXTENSION IF NOT EXISTS ulid;

Contoh Penggunaan dalam SQL

Setelah ekstensi aktif, Anda dapat langsung memanggil fungsi-fungsi yang disediakan untuk menghasilkan atau menguraikan ULID.

-- Menghasilkan ULID baru dalam format teks
SELECT gen_random_ulid();

-- Contoh Output:
-- 01H4Z83J817KQX9W3Z2V8G7RTP

-- Membuat tabel dengan ULID sebagai Primary Key default
CREATE TABLE transaksi (
    id ULID PRIMARY KEY DEFAULT gen_random_ulid(),
    jumlah NUMERIC(12, 2) NOT NULL,
    dibuat_pada TIMESTAMPTZ DEFAULT clock_timestamp()
);

-- Memasukkan data baru tanpa mengisi kolom ID secara manual
INSERT INTO transaksi (jumlah) VALUES (150000.00);

-- Mengambil timestamp dari string ULID
SELECT ulid_timestamp('01H4Z83J817KQX9W3Z2V8G7RTP');

Troubleshooting Kendala Umum

Beberapa kendala sering ditemui saat proses instalasi atau penggunaan ekstensi ini di lingkungan produksi:

  • Error: extension "ulid" is not available: Pastikan paket biner ekstensi sudah di-install ke path PostgreSQL yang benar. Periksa direktori sharedir/extension dan pkglibdir menggunakan perintah pg_config.
  • Versi Pgrx Tidak Kompatibel: Sesuaikan versi alat bantu pgrx dengan versi mayor PostgreSQL yang Anda gunakan di server.
  • Tipe Data Kustom: Jika ekstensi menggunakan tipe data internal khusus, pastikan aplikasi klien (seperti ORM Prisma, TypeORM, atau GORM) dikonfigurasi untuk menangani tipe data string/text atau biner dengan benar agar tidak terjadi error type casting.