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
akununtuk 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:
makanmenaungimakan di luardanmakan di rumah; pengeluaran bisa digulung ke kategori utamanya. - Anggaran bulanan per kategori dengan deteksi pelanggaran lewat
HAVING. - Laporan arus kas bulanan dengan
generate_seriesdanFILTER, 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:
- Tipe Data: Numeric dan Decimal untuk uang, Enum untuk tipe arus kas, dan Date dan Time untuk tanggal transaksi.
- Table Design: Check Constraint , Foreign Key , dan Primary Key — fondasi seluruh validasi di Bagian 1.
- Manipulasi Data: INSERT dan RETURNING Clause untuk alur pencatatan di Bagian 2.
- Joins: Self Join untuk hierarki kategori dan INNER JOIN untuk hampir semua laporan.
- Agregasi Data: FILTER pada Aggregate serta ROLLUP dan CUBE untuk laporan Bagian 3 dan 4.
- Window Functions: Running Total untuk saldo berjalan dan posisi kumulatif.
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:
| Bagian | Fokus |
|---|---|
| Bagian 1: Perancangan Skema | Dari 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 Pengeluaran | Register transaksi harian: validasi jumlah dan tipe, koreksi deskripsi, dan saldo berjalan per akun dengan window function |
| Bagian 3: Kategori dan Anggaran | Pohon kategori dengan self-join, penggulungan pengeluaran dengan ROLLUP, anggaran bulanan, dan deteksi pelanggaran |
| Bagian 4: Laporan Keuangan | Arus 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:
psql -X -f bagian/perancangan-skema/tabel-dasar.sql -d keuangan_pribadiAturan 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 #
- Tipe numeric untuk nilai exact
- Aggregate FILTER clause
- Window functions
- Set returning functions: generate_series
Rancang tabel akun, kategori, transaksi, dan anggaran dengan tipe numeric.
Buka → # Bagian 2: Pencatatan Pemasukan dan PengeluaranCatat transaksi harian dengan validasi tanggal, jumlah, dan kategori.
Buka → # Bagian 3: Kategori dan AnggaranKelola kategori hierarkis dan anggaran bulanan dengan cek pelanggaran.
Buka → # Bagian 4: Laporan KeuanganSusun laporan arus kas bulanan dan posisi keuangan kumulatif.
Buka →