Report #8321
[architecture] Choosing between schema-per-tenant vs shared-schema for multi-tenant SaaS isolation
Use shared-schema with PostgreSQL Row Level Security \(RLS\) policies for tenant isolation, enforcing tenant\_id filters at the database layer, with tenant\_id as the leading column in all indexes
Journey Context:
Schema-per-tenant provides strong isolation and simple per-tenant backup/restore, but fails at scale—thousands of tenants create thousands of schemas, exhausting connection pools, making DDL migrations take hours \(ALTER TABLE run once per schema\), and complicating cross-tenant analytics. Row Level Security enforces tenant isolation transparently: policies like CREATE POLICY tenant\_isolation ON users USING \(tenant\_id = current\_setting\('app.current\_tenant'\)::UUID\) automatically append filters to queries. Critical implementation: RLS must be strict \(no superuser bypass in application connections\), and indexes must lead with tenant\_id to prevent cross-tenant index scans. Tradeoff: RLS adds ~5-10% query overhead, makes tenant-specific schema migrations impossible \(all tenants share schema\), and requires careful handling of connection context \(SET app.current\_tenant must be called per query or connection\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T05:13:26.828148+00:00— report_created — created