Daftar fitur saja tidak cukup untuk meyakinkan bahwa sebuah layak dipelajari bertahun-tahun; kita perlu melihat medan tempat fitur-fitur itu benar-benar dipakai. PostgreSQL adalah database general-purpose: dari aplikasi web startup sampai sistem inti lembaga keuangan memakai mesin yang sama. Chapter ini memetakan domain-domain penggunaan utamanya, fitur PostgreSQL yang menonjol di masing-masing domain, dan menutupnya dengan demonstrasi laporan analitik kecil yang bisa Anda jalankan langsung.

Aplikasi Web dan Mobile #

Pola penggunaan paling umum adalah OLTP (online transaction processing): banyak pengguna melakukan operasi baca-tulis pendek secara serentak — keranjang belanja, umpan pesan, data pesanan. Tiga kekuatan PostgreSQL pas untuk medan ini. Pertama, transaksi ACID menjamin pesanan tidak tersimpan setengah jalan. Kedua, MVCC membuat pembaca dan penulis hidup berdampingan tanpa saling mengunci — penting saat jam sibuk. Ketiga, atribut produk yang berubah-ubah bentuknya nyaman ditampung JSONB, seperti sudah kita coba di chapter perbandingan.

Skalanya nyata, bukan teori. Instagram adalah contoh yang sering dikutip dan terdokumentasi di tulisan engineering-nya: miliaran foto dan metadata pengguna ditangani di atas PostgreSQL. Apple juga tercatat dalam sejarahnya memakai PostgreSQL untuk layanan seperti App Store. Daftar pengguna besar lainnya — Reddit hingga banyak penyedia layanan cloud — menunjukkan bahwa database ini bukan pilihan “proyek kecil saja”.

Analitik dan Pelaporan #

Aplikasi web menyimpan data; analitik yang mengubahnya jadi keputusan. PostgreSQL unggul di sini karena SQL-nya kaya: window function untuk menghitung nilai berjalan dan peringkat, common table expression untuk query bertingkat yang terbaca, materialized view untuk laporan berat yang dihitung sekali lalu dipakai berulang, dan parallel query yang membagi kerja agregasi ke beberapa CPU.

Mari kita buktikan dengan laporan sederhana milik Toko Maju Jaya. File pertama menyiapkan tabel penjualan Januari 2026 dengan tanggal tetap:

CREATE TABLE penjualan (
    id     integer PRIMARY KEY,
    tanggal date NOT NULL,
    produk  text NOT NULL,
    jumlah  integer NOT NULL,
    harga   numeric(10, 2) NOT NULL
);

INSERT INTO penjualan (id, tanggal, produk, jumlah, harga) VALUES
    (1, DATE '2026-01-05', 'Buku Tulis', 10, 4500.00),
    (2, DATE '2026-01-05', 'Pulpen Hitam', 25, 3000.00),
    (3, DATE '2026-01-12', 'Kertas HVS A4', 3, 55000.00),
    (4, DATE '2026-01-12', 'Buku Tulis', 15, 4500.00),
    (5, DATE '2026-01-19', 'Stapler Besar', 2, 24000.00),
    (6, DATE '2026-01-19', 'Pulpen Hitam', 40, 3000.00),
    (7, DATE '2026-01-26', 'Buku Tulis', 20, 4500.00),
    (8, DATE '2026-01-26', 'Kertas HVS A4', 1, 55000.00);

Output yang Dihasilkan:

text
CREATE TABLE
INSERT 0 8

File kedua memuat dua query analitik: agregat penjualan per produk, lalu running total harian memakai window function — pola yang muncul di hampir semua dashboard keuangan:

SELECT produk,
       sum(jumlah) AS total_unit,
       sum(jumlah * harga) AS total_rp
FROM penjualan
WHERE tanggal BETWEEN DATE '2026-01-01' AND DATE '2026-01-31'
GROUP BY produk
ORDER BY total_rp DESC, produk;

SELECT tanggal, produk, jumlah * harga AS nilai,
       sum(jumlah * harga) OVER (ORDER BY tanggal, id) AS total_berjalan
FROM penjualan
ORDER BY tanggal, id;

Output yang Dihasilkan:

text
    produk     | total_unit | total_rp  
---------------+------------+-----------
 Kertas HVS A4 |          4 | 220000.00
 Buku Tulis    |         45 | 202500.00
 Pulpen Hitam  |         65 | 195000.00
 Stapler Besar |          2 |  48000.00
(4 rows)

  tanggal   |    produk     |   nilai   | total_berjalan 
------------+---------------+-----------+----------------
 2026-01-05 | Buku Tulis    |  45000.00 |       45000.00
 2026-01-05 | Pulpen Hitam  |  75000.00 |      120000.00
 2026-01-12 | Kertas HVS A4 | 165000.00 |      285000.00
 2026-01-12 | Buku Tulis    |  67500.00 |      352500.00
 2026-01-19 | Stapler Besar |  48000.00 |      400500.00
 2026-01-19 | Pulpen Hitam  | 120000.00 |      520500.00
 2026-01-26 | Buku Tulis    |  90000.00 |      610500.00
 2026-01-26 | Kertas HVS A4 |  55000.00 |      665500.00
(8 rows)

Perhatikan bagian-bagian kuncinya:

  1. WHERE tanggal BETWEEN DATE '2026-01-01' AND ...: rentang laporan ditulis sebagai literal tanggal tetap, bukan current_date — kebiasaan yang membuat laporan bisa diulang dengan hasil identik.
  2. GROUP BY produk + sum(jumlah * harga): agregasi klasik — total unit dan total rupiah per produk dalam satu query.
  3. sum(...) OVER (ORDER BY tanggal, id): window function. OVER membuat sum berjalan di jendela baris — dari awal sampai baris saat ini — sehingga kolom total_berjalan terisi nilai kumulatif 45000, 120000, 285000, dan seterusnya. Dua ORDER BY (di dalam OVER dan di query) sengaja memakai kolom yang sama agar hasil deterministik.

Geospasial dengan PostGIS #

Data berlokasi — armada pengiriman, titik cabang, area layanan — butuh query seperti “toko terdekat dari pelanggan ini” atau “apakah alamat ini berada di zona banjir”. Extension PostGIS menambahkan tipe data geometri, ratusan function spasial, dan index GiST sehingga query jarak dan irisan area berjalan cepat pada jutaan titik. PostGIS begitu matang sampai menjadi standar de facto GIS open source, dipakai instansi pemerintah, perusahaan logistik, hingga aplikasi peta. Kemampuan ini murni buah arsitektur extension PostgreSQL: fitur spasial menempel di server tanpa mengubah intinya.

Keuangan dan Sistem Kritis #

Domain keuangan menuntut dua hal yang menjadi darah daging PostgreSQL: perhitungan eksak dan transaksi yang tidak bisa ditawar. Tipe numeric menghitung rupiah tanpa galat pembulatan biner — 0.1 + 0.2 tidak akan menjadi 0.30000000000000004. Jaminan ACID memastikan mutasi rekening terjadi sepenuhnya atau tidak sama sekali, sementara point-in-time recovery dari WAL membuat database bisa “di-rewind” ke detik sebelum insiden. Fitur seperti row-level security menambah lapisan kontrol akses per baris — satu salah konfigurasi aplikasi tidak otomatis membuka data seluruh nasabah.

Timeseries, IoT, dan Pencarian Teks #

Sensor dan telemetri menghasilkan data bergaris waktu berton-ton per hari. PostgreSQL menopang pola ini dengan table partitioning (tabel besar dipecah per rentang tanggal, misalnya per bulan), index BRIN yang ramping untuk kolom yang nilainya naik seiring waktu, dan tipe range. Untuk kebutuhan ekstrem ada extension pihak ketiga seperti TimescaleDB yang dibangun di atas PostgreSQL. Di jalur lain, full-text search bawaan — lengkap dengan kamus dan stemming — menghidupi fitur pencarian di dalam aplikasi tanpa harus memasang mesin pencari terpisah.

Peta Ringkas Domain dan Fiturnya #

DomainFitur PostgreSQL yang menonjol
Aplikasi web / mobileTransaksi ACID, MVCC, JSONB, driver resmi di hampir semua bahasa
Analitik dan pelaporanWindow function, CTE, materialized view, parallel query
GeospasialPostGIS, index GiST
Keuangan dan sistem kritisnumeric eksak, ACID, WAL dan point-in-time recovery, row-level security
Timeseries / IoTPartitioning, index BRIN, tipe range
Pencarian teksFull-text search bawaan dengan stemming dan ranking

Kini terjawab sudah di mana PostgreSQL dipakai. Satu topik penutup section ini menjawab dengan aturan apa: lisensi yang memayungi PostgreSQL dan ekosistem perkakas di sekelilingnya — chapter Lisensi dan Ekosistem PostgreSQL.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

buat-penjualan.sql

Unduh berkas
sql
CREATE TABLE penjualan (
    id     integer PRIMARY KEY,
    tanggal date NOT NULL,
    produk  text NOT NULL,
    jumlah  integer NOT NULL,
    harga   numeric(10, 2) NOT NULL
);

INSERT INTO penjualan (id, tanggal, produk, jumlah, harga) VALUES
    (1, DATE '2026-01-05', 'Buku Tulis', 10, 4500.00),
    (2, DATE '2026-01-05', 'Pulpen Hitam', 25, 3000.00),
    (3, DATE '2026-01-12', 'Kertas HVS A4', 3, 55000.00),
    (4, DATE '2026-01-12', 'Buku Tulis', 15, 4500.00),
    (5, DATE '2026-01-19', 'Stapler Besar', 2, 24000.00),
    (6, DATE '2026-01-19', 'Pulpen Hitam', 40, 3000.00),
    (7, DATE '2026-01-26', 'Buku Tulis', 20, 4500.00),
    (8, DATE '2026-01-26', 'Kertas HVS A4', 1, 55000.00);

laporan-penjualan.sql

Unduh berkas
sql
SELECT produk,
       sum(jumlah) AS total_unit,
       sum(jumlah * harga) AS total_rp
FROM penjualan
WHERE tanggal BETWEEN DATE '2026-01-01' AND DATE '2026-01-31'
GROUP BY produk
ORDER BY total_rp DESC, produk;

SELECT tanggal, produk, jumlah * harga AS nilai,
       sum(jumlah * harga) OVER (ORDER BY tanggal, id) AS total_berjalan
FROM penjualan
ORDER BY tanggal, id;