
If you are building a SaaS product, one early decision quietly shapes your cost, security, and scaling for years: how you isolate one customer’s data from another. Pick wrong and you face expensive migrations or a breach that exposes tenant A’s records to tenant B. This article explains the three main isolation models, when each fits, and the mistakes that cause pain later.
What “data isolation” actually means in multi-tenancy
Multi-tenancy means many customers (tenants) share one running application. Isolation is about how their data is separated underneath that shared app. It is not one switch. It is a spectrum from fully shared tables to fully separate databases. The core tension is always the same: stronger isolation improves security and per-tenant control but raises cost and operational effort. Weaker isolation is cheaper and simpler to scale but concentrates risk.
The three common models
Pooled (shared schema)
All tenants share the same tables. Every row carries a tenant_id column, and every query filters on it. This is the cheapest and most scalable model because one schema serves thousands of tenants. The danger is obvious: a single missing WHERE clause leaks data across tenants. It also makes per-tenant backup, restore, or deletion harder.
Bridge (shared database, separate schemas)
Each tenant gets its own schema inside a shared database. You get cleaner separation and easier per-tenant operations than pooled, without paying for a full database per customer. The cost is schema sprawl: migrations must run across many schemas, and connection or metadata limits appear as tenant count grows into the thousands.
Silo (separate database per tenant)
Each tenant has a dedicated database or instance. This gives the strongest isolation, simplest compliance story, and easy per-tenant performance tuning. It is also the most expensive and operationally heavy. It suits regulated industries or high-value enterprise contracts, not a free tier with 50,000 signups.
Trade-offs at a glance
| Factor | Pooled | Bridge | Silo |
| Cost per tenant | Lowest | Medium | Highest |
| Isolation strength | Weakest | Medium | Strongest |
| Scales to many tenants | Best | Limited | Hardest |
| Per-tenant backup/delete | Hard | Easier | Trivial |
| Migration effort | One schema | Many schemas | Many databases |
A real scenario
A B2B analytics startup began pooled to move fast. It worked well until an enterprise prospect demanded data residency and isolated backups. Rather than rebuild everything, the team went hybrid: small and mid-market tenants stayed pooled, while enterprise tenants were provisioned in silo databases. This mixed approach is common and often the right end state. You do not have to pick one model for every customer.
Common mistakes and how to fix them
Relying only on application code to filter tenant_id. One bug leaks data. Fix it by enforcing isolation at the database layer too, for example with row-level security policies, so a missing filter fails closed instead of exposing rows.
Treating the choice as permanent. Teams agonize over the “forever” decision. In practice most successful SaaS products evolve toward a hybrid. Design your data access layer so the isolation model is an abstraction, not hard-coded assumptions.
Ignoring the noisy-neighbor problem. In pooled setups, one heavy tenant can degrade everyone. Add per-tenant rate limits and monitor query cost by tenant early.
Forgetting deletion and export. Privacy requests and contract exits require clean per-tenant delete and export. This is painful to retrofit in pooled models, so build it in from day one.
Action checklist
- Classify tenants by value and compliance needs before choosing a model.
- Default to pooled for self-serve and low-cost tiers unless regulation says otherwise.
- Enforce tenant filtering at the database layer, not just in code.
- Add a tenant_id to every table and index it from the first migration.
- Build per-tenant export and hard-delete early.
- Instrument query cost and load per tenant to catch noisy neighbors.
- Keep isolation logic behind an abstraction so you can go hybrid later.
Conclusion and next step
There is no universally correct model, only the right fit for your tenant mix and risk profile. Start simple, isolate at the database layer, and design for a hybrid future. Your next step: map your current or expected tenants against the table above and decide which tiers, if any, justify stronger isolation.
FAQ
Can I start pooled and move to silo later?
Yes, and many teams do. The key is building a data access abstraction and per-tenant export early so migrating a specific tenant is a manageable job, not a rewrite.
Does row-level security replace application checks?
No. Treat it as defense in depth. Application-level filtering is your primary control; database-level policies are the safety net that fails closed when code has a bug.
How many tenants can a pooled model handle?
Far more than bridge or silo, often into the tens of thousands, because you are not multiplying schemas or databases. The real limits are usually data volume per table and noisy-neighbor load, both manageable with indexing and rate limits.
Is hybrid too complex for a small team?
It adds provisioning work, so avoid it until a real customer requirement forces it. When an enterprise deal demands isolation, hybrid is usually cheaper than rebuilding your whole data model.
References
- AWS SaaS Lens and SaaS Tenant Isolation guidance (AWS Well-Architected).
- PostgreSQL documentation on Row Security Policies.