View: Menyimpan Query Rumit Sebagai Tabel Virtual
CREATE VIEW untuk menyederhanakan query panjang dan membatasi akses data, serta pengantar materialized view di PostgreSQL.
Analogi: VIEW itu seperti kacamata dengan filter: data aslinya tidak berubah, tetapi kamu melihatnya lewat sudut pandang tertentu. Atau seperti jalan pintas (shortcut) di desktop yang menyimpan query panjang dengan nama pendek.
Masalah: query panjang yang diulang-ulang
Laporan "pesanan beserta nama pelanggan dan total belanja" membutuhkan tiga tabel, JOIN, dan GROUP BY. Kalau tiap orang menulis ulang, hasilnya bisa beda-beda dan penuh salah ketik. Solusinya: simpan sekali sebagai view.
Analogi: view itu seperti jendela yang menampilkan sebagian rumah. Isinya tidak disalin: kamu hanya melihat data asli lewat "kaca" tertentu.
Membuat view
CREATE VIEW v_ringkasan_pesanan AS
SELECT p.id AS pesanan_id,
pl.nama AS pelanggan,
p.tanggal,
p.status,
SUM(d.jumlah * d.harga_satuan) AS total
FROM pesanan p
JOIN pelanggan pl ON pl.id = p.pelanggan_id
JOIN detail_pesanan d ON d.pesanan_id = p.id
GROUP BY p.id, pl.nama, p.tanggal, p.status;
Setelah dibuat, pakai seperti tabel biasa:
SELECT * FROM v_ringkasan_pesanan WHERE status = 'lunas' ORDER BY pesanan_id;
Setiap kali dipanggil, Postgres menjalankan query di balik view dan datanya selalu terbaru.
Manfaat view
- Menyederhanakan: query rumit cukup ditulis sekali.
- Konsisten: semua orang memakai definisi "total" yang sama.
- Keamanan: beri akses ke view yang menyembunyikan kolom sensitif (misalnya gaji, kata sandi) tanpa membuka tabel aslinya.
Mengubah dan menghapus view
CREATE OR REPLACE VIEW v_ringkasan_pesanan AS ...; -- ganti definisi
DROP VIEW v_ringkasan_pesanan; -- hapus view (data asli aman)
Materialized view: view yang menyimpan hasil
View biasa menghitung ulang setiap dipanggil. Kalau perhitungannya berat (laporan besar), PostgreSQL punya materialized view: hasilnya disimpan seperti tabel dan diperbarui hanya saat kamu minta.
CREATE MATERIALIZED VIEW laporan_bulanan AS SELECT ...;
REFRESH MATERIALIZED VIEW laporan_bulanan; -- perbarui isinya
| View | Materialized view | |
|---|---|---|
| Menyimpan data? | Tidak, hanya definisi query | Ya, hasil disalin |
| Data selalu terbaru? | Ya | Tidak, sampai di-REFRESH |
| Kecepatan | Sama dengan query aslinya | Sangat cepat dibaca |
| Cocok untuk | Penyederhanaan, keamanan | Laporan berat, dashboard |
Catatan simulator: latihan memakai view biasa. Materialized view dibahas sebagai pengetahuan.
Kasus nyata: laporan penjualan yang dipakai banyak tim
Tim finance, marketing, dan gudang semua butuh daftar penjualan lengkap. Daripada masing-masing menulis ulang JOIN yang panjang (dan berpotensi salah), buat satu view:
CREATE VIEW v_penjualan AS
SELECT p.id AS no_pesanan, p.tanggal, pl.nama AS pelanggan,
b.judul, d.jumlah, d.jumlah * d.harga_satuan AS subtotal
FROM pesanan p
JOIN pelanggan pl ON pl.id = p.pelanggan_id
JOIN detail_pesanan d ON d.pesanan_id = p.id
JOIN buku b ON b.id = d.buku_id;
SELECT * FROM v_penjualan WHERE tanggal >= CURRENT_DATE - 7;
Kesalahan yang sering terjadi
- Mengira view menyimpan data sendiri. View biasa hanya menyimpan query; hasilnya dihitung ulang setiap dipanggil.
- Menumpuk view di atas view sampai sulit dilacak dan lambat.
- Lupa bahwa
MATERIALIZED VIEWmenyimpan hasil dan harus di-REFRESHagar datanya segar.