PostgreSQL JSONB: menyimpan data semi-terstruktur
Simpan data yang strukturnya berubah-ubah tanpa kehilangan kemampuan query dan indeks.
Kapan JSONB masuk akal
Beberapa data, seperti preferensi pengguna atau metadata dari layanan pihak ketiga, sering berubah struktur seiring waktu. Menambah kolom baru setiap kali struktur berubah bisa merepotkan. JSONB menyimpan data semi-terstruktur ini dalam satu kolom yang tetap bisa di-query.
Membuat kolom JSONB
CREATE TABLE preferensi_pengguna (
id BIGSERIAL PRIMARY KEY,
pengguna_id BIGINT NOT NULL,
data JSONB NOT NULL DEFAULT '{}'
);
INSERT INTO preferensi_pengguna (pengguna_id, data)
VALUES (1, '{"tema": "gelap", "notifikasi": {"email": true, "push": false}}');
Mengambil nilai dari JSONB
SELECT
pengguna_id,
data->>'tema' AS tema,
data->'notifikasi'->>'email' AS notif_email
FROM preferensi_pengguna
WHERE data->>'tema' = 'gelap';
Operator ->> mengembalikan nilai sebagai teks, sedangkan -> mengembalikan nilai sebagai JSON sehingga bisa ditelusuri lebih dalam.
Membuat indeks untuk pencarian JSONB
CREATE INDEX idx_preferensi_data ON preferensi_pengguna USING GIN (data);
Indeks GIN mempercepat pencarian dengan operator @> yang memeriksa apakah suatu JSONB mengandung struktur tertentu.
SELECT * FROM preferensi_pengguna
WHERE data @> '{"tema": "gelap"}';
JSONB bukan pengganti kolom biasa
Kolom yang sering dipakai untuk filter, join, atau perlu constraint yang ketat sebaiknya tetap berupa kolom biasa. Gunakan JSONB untuk data tambahan yang jarang dijadikan syarat pencarian utama.
Latihan
Tambahkan indeks pada path tertentu saja, misalnya (data->>'tema'), lalu bandingkan rencana query dengan indeks GIN pada seluruh kolom.
