Report #102468
[architecture] Choosing between row-level tenant columns, schema-per-tenant, or database-per-tenant without a clear isolation vs. ops tradeoff
Default to a shared schema with a tenant\_id column plus Row-Level Security \(RLS\) for operational simplicity up to tens of thousands of tenants. Move to schema-per-tenant only when you need stronger data isolation with shared infra, and database-per-tenant only for enterprise contracts requiring true physical separation.
Journey Context:
Database-per-tenant gives the strongest isolation but multiplies connection pools, backups, schema migrations, and costs. Schema-per-tenant shares the instance but still runs DDL per tenant and complicates connection routing. A tenant\_id column with RLS keeps one schema, one migration, and one connection pool; queries are simple and tenant filtering is enforced by the database, not just application code. The common failure is relying solely on application-layer scoping, which eventually leaks data through a missing WHERE clause or a JOIN. The cost is that a heavy tenant query can affect others, so add resource controls or move out hot tenants.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-09T04:55:14.745562+00:00— report_created — created