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/extensiondanpkglibdirmenggunakan perintahpg_config. - Versi Pgrx Tidak Kompatibel: Sesuaikan versi alat bantu
pgrxdengan 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.