A escolha do padrão de multi-tenancy define custo de infraestrutura, velocidade de deploy e o que cabe no contrato de compliance. Três modelos dominam SaaS: coluna tenant_id em schema compartilhado, schema por tenant e banco por tenant. Cada um compra um nível de isolamento com um preço diferente.
Schema compartilhado com tenant_id
É o modelo de maior densidade e menor custo: todas as rows de todos os tenants nas mesmas tabelas, filtradas por tenant_id. Uma migration atualiza a base inteira de uma vez. O isolamento exige row-level security: políticas RLS do Postgres com current_setting('app.tenant_id') aplicam o filtro no engine, além da aplicação. O risco de noisy neighbor mora nos índices compartilhados e no connection pool, onde o tenant gigante disputa recursos com os pequenos.
Schema por tenant
Isolamento lógico mais forte e restore por tenant viável: pg_dump do schema do cliente afetado preserva os demais. O preço chega nas migrations: o script roda N vezes, e milhares de schemas transformam deploy de minutos em horas. Connection pooling sofre além de algumas centenas de tenants, porque cada schema multiplica entradas de catálogo e prepared statements no pool.
Banco por tenant
Isolamento máximo para comprador com exigência de compliance: dados separados em nível de armazenamento, e pricing tier com banco dedicado vira argumento comercial trivial no plano Enterprise. O custo de infraestrutura vai ao teto; opções gerenciadas (RDS, Neon) reduzem a dor operacional de patching, backup e failover de centenas de bancos.
O híbrido que quase todo SaaS termina construindo
Enterprise ganha banco dedicado, standard compartilha. Uma camada de routing lê a configuração de tenancy em cache (Redis) e direciona a conexão certa a cada request. O arranjo atende vendas sem obrigar o produto inteiro ao custo do banco exclusivo.
Como evitar vazamento entre tenants?
Todo caminho de query precisa de escopo de tenant. Middleware que extrai o tenant do JWT ou do subdomain e seta current_setting vence WHERE manual, que alguém esquece no endpoint novo. A suite automatizada roda em todo PR: tenta acessar dados cross-tenant e espera negação. Bug de isolamento é incidente de segurança com data marcada; trate cada falha desse teste como bloqueio de release.
Migração entre padrões
Começar compartilhado e fatiar depois custa semanas de backfill e reescrita de queries; começar isolado e consolidar custa ainda mais. Decida pelo comprador: pipeline de vendas puxando compliance pesado (saúde, financeiro) pede isolamento compatível com contrato enterprise desde o dia um.
Curtiu o conteúdo?
Construo produtos web e soluções com IA do jeito certo — arquitetura sólida, código sustentável e entrega real.
Vamos conversar