Mengelola uang pribadi jarang gagal karena kurang data — justru karena datanya tercecer: mutasi rekening di satu aplikasi, struk belanja di dompet, ingatan tentang tagihan di kepala. Pada proyek ini kita menyatukan semuanya menjadi satu database keuangan pribadi yang utuh: akun tempat uang berada, transaksi harian yang divalidasi database, kategori hierarkis untuk mengelompokkan pengeluaran, anggaran bulanan yang bisa memburu pelanggaran, dan laporan arus kas serta posisi keuangan yang layak dibandingkan bulan demi bulan. Seperti proyek perpustakaan sebelumnya, semuanya dibangun dari cerita kebutuhan nyata penggunanya — kali ini Budi, karyawan yang baru mulai mencatat keuangannya secara disiplin.

Yang Akan Kita Bangun #

Kebutuhan Budi sederhana tapi menuntut disiplin data. Ia ingin tahu saldo setiap akun kapan pun tanpa membuka aplikasi bank, ingin pengeluaran bulan ini dibandingkan dengan anggarannya sebelum akhir bulan tiba, dan ingin melihat tren tahunan per kategori. Database berikut menjawabnya:

  • Tabel akun untuk kas, rekening bank, dan dompet digital — masing-masing dengan saldo awal yang menjadi titik hitung.
  • Transaksi dengan kolom tipe plus jumlah selalu positif, bukan jumlah bertanda; pilihan desain ini dijelaskan dan dibandingkan di Bagian 1.
  • Kecocokan tipe transaksi dengan jenis kategori diikat composite foreign key — pemasukan yang diklaim di kategori pengeluaran mustahil tersimpan.
  • Kategori hierarkis dua tingkat lewat self-join: makan menaungi makan di luar dan makan di rumah; pengeluaran bisa digulung ke kategori utamanya.
  • Anggaran bulanan per kategori dengan deteksi pelanggaran lewat HAVING.
  • Laporan arus kas bulanan dengan generate_series dan FILTER, posisi keuangan kumulatif dengan window function, dan tren year-over-year antar kategori.
  • Seluruh nilai uang memakai numeric(14,2) — presisi exact, tanpa risiko pembulatan floating point.

Data contoh deterministik membentang 18 bulan (Januari 2025 sampai Juni 2026) dengan angka rupiah yang realistis, sehingga setiap output dapat Anda cocokkan persis dengan eksekusi sendiri.

Skema Database #

Kebutuhan itu diterjemahkan menjadi empat tabel. Diagram berikut memperlihatkan relasinya:

Notasi ||--o{ dibaca “satu ke nol-atau-banyak”: satu akun menampung banyak transaksi, satu kategori bisa dipakai berulang kali. Relasi paling menarik justru yang mengarah ke kategori sendiri — panah kategori ||--o{ kategori adalah relasi induk-anak yang membentuk pohon kategori dua tingkat. Perhatikan juga pasangan (kategori_id, tipe) pada transaksi: keduanya bersama-sama merujuk (id, jenis) di kategori — trik composite foreign key yang menjadi penjaga konsistensi utama proyek ini.

Prasyarat #

Proyek ini menyusun ulang materi yang sudah dipelajari, bukan memperkenalkan fitur baru. Pastikan Anda nyaman dengan chapter berikut:

Tidak ada extension atau tool tambahan; cukup psql dan PostgreSQL 17 yang terpasang sejak Instalasi PostgreSQL .

Peta Bagian #

Proyek dikerjakan dalam empat bagian berurutan. Setiap bagian menghasilkan database yang benar-benar bekerja pada tahapnya:

BagianFokus
Bagian 1: Perancangan SkemaDari cerita kebutuhan ke empat tabel: pilihan numeric untuk uang, tipe enum vs jumlah bertanda, composite foreign key, dan uji skema
Bagian 2: Pencatatan Pemasukan dan PengeluaranRegister transaksi harian: validasi jumlah dan tipe, koreksi deskripsi, dan saldo berjalan per akun dengan window function
Bagian 3: Kategori dan AnggaranPohon kategori dengan self-join, penggulungan pengeluaran dengan ROLLUP, anggaran bulanan, dan deteksi pelanggaran
Bagian 4: Laporan KeuanganArus kas bulanan dengan generate_series dan FILTER, laba-rugi sederhana, posisi keuangan kumulatif, dan tren year-over-year

Setiap bagian mandiri: berkas SQL-nya membangun ulang tabel yang dibutuhkan di awal, sehingga Anda bisa masuk dari bagian mana pun tanpa membawa bekas eksekusi bagian sebelumnya.

Cara Mengikuti Proyek #

Kerjakan tiap bagian sambil mengetik ulang atau menyalin berkas SQL-nya, lalu jalankan dengan psql seperti biasa:

bash
psql -X -f bagian/perancangan-skema/tabel-dasar.sql -d keuangan_pribadi

Aturan mainnya sama dengan seluruh Course: setiap blok kode pada bagian-bagian berikut adalah berkas nyata yang dieksekusi sungguhan, dan blok Output yang Dihasilkan di bawahnya adalah hasil eksekusi tersebut, bukan tulisan tangan. Tanggal dan jumlah sengaja dipaku (misalnya DATE '2026-03-01' dan gaji Rp9.200.000) agar hasil Anda identik dengan hasil di halaman.

Selain berkas per bagian, halaman overview ini juga membawa artefak lengkap hasil akhir proyek pada bagian Berkas Sumber di bawah halaman ini: database/skema.sql (skema final dengan seluruh constraint dan index), database/isi-data.sql (riwayat 18 bulan penuh), queries/ (empat query laporan siap pakai: arus kas bulanan, anggaran vs actual, posisi keuangan, dan tren year-over-year), serta tests/ (dua berkas uji LULUS/GAGAL). Setelah menyelesaikan keempat bagian, terapkan keduanya ke database kosong, jalankan berkas uji, lalu bandingkan hasilnya dengan laporan Anda sendiri.

Skema adalah fondasi semuanya — dan keputusan terpenting proyek keuangan justru diambil di sana. Mari kita mulai dari Bagian 1.

Referensi #