Report #71812
[architecture] Choosing between row-level security, schema-per-tenant, or database-per-tenant for SaaS multi-tenancy
Use shared-table with PostgreSQL Row-Level Security \(RLS\) for thousands of small tenants \(enforce via 'SET app.current\_tenant' in connection context\); use schema-per-tenant for hundreds of large tenants requiring strong isolation; avoid database-per-tenant due to connection pool exhaustion. Never rely solely on application-level WHERE clauses for isolation.
Journey Context:
Three models: \(1\) Shared table \+ RLS: Best density, but RLS adds ~5-10% query overhead and requires careful policy writing \(bypass if superuser\). Risk: Policy bypass bugs are catastrophic. \(2\) Schema-per-tenant: Strong isolation, separate migrations, but connection pooling becomes complex \(search\_path management\). Good for compliance \(GDPR right to be forgotten = DROP SCHEMA\). \(3\) DB-per-tenant: Ultimate isolation but connection pools die at scale \(>100 tenants\). Common mistake: Application-level filtering without RLS - vulnerable to injection bugs. Hybrid approaches exist \(shard by tenant ID\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T03:07:24.033978+00:00— report_created — created