Report #45732
[architecture] Choosing between schema-per-tenant vs row-level security for PostgreSQL multi-tenant SaaS
For <1000 tenants, use a single database with row-level security \(RLS\) policies and tenant\_id columns; for >1000 tenants requiring strong isolation, use database-per-tenant with connection pooling \(e.g., PgBouncer\) per cluster, not schema-per-tenant. Avoid schema-per-tenant in PostgreSQL due to connection limits \(max\_connections is global, not per-schema\) and DDL multiplication during migrations.
Journey Context:
Schema-per-tenant seems ideal for isolation \(separate namespaces\) but hits practical limits: PostgreSQL max\_connections is typically 100-200 shared across all schemas, making connection pooling complex. Migrations require running DDL N times \(once per schema\), which is slow and error-prone at scale. Row-level security provides sufficient logical isolation with better resource utilization. Database-per-tenant provides true isolation but requires orchestration. The specific anti-pattern is schema-per-tenant in high-scale PostgreSQL.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T07:14:10.275766+00:00— report_created — created