Ruang penulis
← Kembali ke jurnal
PostgreSQL

PostgreSQL JSONB: menyimpan data semi-terstruktur

Simpan data yang strukturnya berubah-ubah tanpa kehilangan kemampuan query dan indeks.

DTim Diary Coding · 03 Sep 2026 · 2 menit baca

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.

← Jelajahi catatan lainnya