BigStarter
Database

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 di index.ts lewat satu baris import (build-time source selection, tanpa runtime branching).
  • Binder — setiap variant mengekspor bindXQueries() yang menutup client singleton di infrastructure/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

SkemaIsiPemilik
publicTabel global: profiles, tenants, memberships, plans, billing ledger, notifikasi, dsb.Modul domain masing-masing
tenant_sharedData tenant mode SHARED: tasks, notes + keluarganya, api_keysModul tasks/notes/api-keys
tenant_<subdomain>Skema terisolasi per tenant (mode ISOLATED)Dibuat runtime via RPC
auth, storage, realtimeMilik provider (Supabase) — tidak pernah dikelola ORMSupabase

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-export shared/ — 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