Database
Arsitektur data BigStarter — PostgreSQL, multi-ORM (Drizzle & Prisma), query contract per modul, dan pemisahan zona browser/server.
Database
BigStarter memakai PostgreSQL sebagai satu-satunya database engine, dengan lapisan akses data berbasis multi-ORM: Drizzle dan Prisma sama-sama resmi didukung, dan satu ORM aktif pada satu waktu per project. Supabase client tetap dipakai untuk Auth, Storage, dan Realtime — tetapi tidak lagi untuk akses data.
Stack Model
Stack database dideklarasikan di config/database.ts:
export const databaseStack: DatabaseStack = {
engine: "postgresql", // postgresql | mysql | sqlite (planned)
orm: "drizzle", // drizzle | prisma | supabase (legacy)
host: "supabase" // supabase | neon | railway | generic | self-hosted
};Dari stack ini diturunkan capabilities (resolveDatabaseCapabilities) — misalnya ketersediaan transaksi dan metadata RLS — yang dipakai kode untuk menyesuaikan perilaku tanpa branching per request.
Arsitektur Akses Data
Semua akses data mengalir lewat query contract milik masing-masing modul:
Halaman / Client → oRPC (Hono) → Service modul → Query contract → Variant ORM → PostgreSQL- Contract (
modules/<modul>/server/queries/contract.ts) — interface netral-ORM berisi operasi domain (bukan bentuk query provider). - Variant (
drizzle.ts/prisma.ts) — implementasi contract; hanya satu yang di-bind diindex.tslewat satu baris import (build-time source selection, tanpa runtime branching). - Binder — setiap variant mengekspor
bindXQueries()yang menutup client singleton diinfrastructure/db/.
// modules/tasks/server/queries/index.ts — SATU baris binding per modul
import { bindTaskQueries } from "./drizzle";
export const taskQueries = bindTaskQueries();
export type { TaskQueries } from "./contract";Skema Database
| Skema | Isi | Pemilik |
|---|---|---|
public | Tabel global: profiles, tenants, memberships, plans, billing ledger, notifikasi, dsb. | Modul domain masing-masing |
tenant_shared | Data tenant mode SHARED: tasks, notes + keluarganya, api_keys | Modul tasks/notes/api-keys |
tenant_<subdomain> | Skema terisolasi per tenant (mode ISOLATED) | Dibuat runtime via RPC |
auth, storage, realtime | Milik provider (Supabase) — tidak pernah dikelola ORM | Supabase |
DDL kanonik hidup di tooling/supabase/migrations/*.sql (di-apply via supabase db push). File tabel Drizzle dan schema Prisma adalah mirror dari DDL itu — keduanya wajib diperbarui bersama setiap perubahan skema.
Batasan Zona (Penting)
- Kode client (browser) hanya boleh mengimpor zona
shared/modul. Index modul (modules/<modul>/index.ts) hanya me-re-exportshared/— me-re-export kode server dari index akan menyeret dependensi Node-only (pg) ke bundle browser. - Client memanggil data hanya lewat oRPC — tidak pernah query langsung.
- Operasi selalu di-scope oleh tenant di dalam query, dan otorisasi diperiksa di lapisan service/procedure sebelum query dijalankan.
Lanjutkan
- Setup & Koneksi —
DATABASE_URL, pooler Supabase, prisma generate - Menggunakan Database — pola pemakaian harian untuk developer
- Mengembangkan — menambah modul/tabel/kolom + testing
- Multi-ORM & Generator — switch ORM & generate project baru
- Model Keamanan — boundary keamanan, RLS, canonical ownership
