Merancang Arsitektur Database SaaS
Keputusan database yang buruk di minggu pertama Anda akan menghantui Anda selama bertahun-tahun.
Seorang pendiri SaaS membutuhkan skema yang menangani multi-tenancy, penagihan, dan pertumbuhan. Jika Anda salah langkah, Anda akan menulis ulang seluruh sistem Anda dalam enam bulan.
Berikut adalah cara membangun skema yang siap untuk produksi.
- Pilih Strategi Tenant Anda
Anda harus mengisolasi data antar pelanggan.
• Row-level (Shared DB): Kompleksitas rendah. Terbaik untuk sebagian besar startup. Gunakan filter WHERE organization_id = ? pada setiap query.
• Schema-level (Separate Schemas): Kompleksitas menengah. Bagus untuk kebutuhan regulasi.
• Database-level (Separate DBs): Kompleksitas tinggi. Terbaik untuk klien enterprise.
Untuk 90% produk baru, multi-tenancy tingkat baris (row-level) adalah pilihan yang tepat.
- Hierarki Entitas yang Benar
Jangan menagih pengguna secara langsung. Pengguna datang dan pergi. Organisasi tetap ada.
Hierarkinya harus terlihat seperti ini: User ── MemberOf ── Organization ── Subscription ── Invoice
• Users: Gunakan tabel ini hanya untuk identitas. Gunakan UUID untuk mencegah serangan. • Organizations: Ini adalah batas tenant Anda. Selalu hubungkan langganan (subscription) ke organisasi. • Memberships: Gunakan tabel join untuk menghubungkan pengguna ke organisasi. Simpan peran (roles) di sini, bukan di tabel user.
- Penagihan dan Langganan
Jangan pernah menggunakan boolean sederhana seperti is_active. Ini akan menciptakan data yang berantakan.
Gunakan state machine untuk langganan. Status umum meliputi: • trialing • active • past_due • canceled • expired • incomplete
Ini memungkinkan Anda menangani kegagalan pembayaran dan masa tenggang (grace period) tanpa perbaikan data manual.
- Uang dan Penagihan
Ikuti aturan ketat ini untuk menghindari kesalahan finansial:
• Jangan pernah menggunakan FLOAT atau REAL untuk uang. Gunakan integer untuk menyimpan sen. Sebagai contoh, $29.99 menjadi 2999.
• Gunakan tabel invoice_line_items. Anda membutuhkan ini untuk laporan pajak dan pengembalian dana (refund).
• Gunakan tabel usage_events jika Anda menagih berdasarkan seberapa banyak pelanggan menggunakan produk Anda.
- Tips Performa
• Indeks foreign key Anda. • Indeks kolom status Anda. • Indeks kolom timestamp Anda. • Hindari query N+1. Gunakan JOIN untuk mendapatkan data organisasi dan langganan dalam satu kali pengambilan.
Skema yang baik tidak terasa saat bekerja. Ia akan menjadi bencana saat gagal.
Bangunlah untuk organisasi. Gunakan state machine. Simpan uang sebagai integer.
Komunitas belajar opsional: https://t.me/GyaanSetuAi
