Multi-tenancy em Laravel: Single DB vs Schema Separado vs Banco Separado
Multi-tenancy é um dos requisitos mais comuns em produtos SaaS — e também um dos que mais gera dúvidas arquiteturais. Neste post, vou analisar as três abordagens principais no contexto do Laravel, com trade-offs honestos para cada uma.
As Três Abordagens
1. Single Database (Coluna tenant_id)
A abordagem mais simples: todos os tenants compartilham o mesmo banco, e cada tabela tem uma coluna tenant_id que filtra os dados.
Schema::create('projects', function (Blueprint $table) {
$table->id();
$table->foreignId('tenant_id')->constrained();
$table->string('name');
$table->timestamps();
});
Vantagens:
- Implementação simples e manutenção fácil
- Migrations rodam uma vez para todos os tenants
- Queries cross-tenant são triviais (relatórios, analytics)
- Custo operacional baixo
Desvantagens:
- Risco de vazamento de dados se o
tenant_idfor esquecido em alguma query - Um tenant grande pode impactar performance dos demais
- Menos isolamento regulatório (problema em setores como saúde e financeiro)
Use quando: B2C com muitos tenants pequenos, equipe pequena, ou no início do produto para validar.
2. Schema Separado (PostgreSQL)
Cada tenant recebe seu próprio schema no PostgreSQL. As tabelas são idênticas, mas os dados ficam completamente isolados.
Vantagens:
- Isolamento real de dados sem overhead de banco separado
- Backups por tenant ficam mais simples
- Performance melhor para tenants grandes (índices menores)
Desvantagens:
- Migrations precisam rodar em cada schema (mais complexidade)
- Não funciona com MySQL (que não tem schemas reais)
- Queries cross-tenant são mais complexas
3. Banco Separado por Tenant
Cada tenant tem seu próprio banco de dados com suas próprias credenciais.
Vantagens:
- Isolamento máximo — ideal para compliance (HIPAA, LGPD setorial)
- Um tenant não impacta outro em hipótese alguma
- Personalização total por tenant (backup schedule, retenção de dados)
Desvantagens:
- Custo operacional alto — cada banco tem overhead de conexão e storage
- Migrations viram um processo de orquestração complexo
- Difícil de operar com muitos tenants (>100)
O que Usar em 2025?
Para a maioria dos SaaS B2B, single database com boas práticas (Global Scopes, Tenancy Middleware) é o ponto de partida certo. Só mude se tiver requisitos regulatórios ou de escala que justifiquem a complexidade adicional.
Pacotes como Tenancy for Laravel e Stancl/Tenancy abstraem muito do trabalho pesado das abordagens 2 e 3.
Posts relacionados
Ninguém lê o manual: ajuda na tela, tour guiado e um checklist que se marca sozinho
Tirar a fricção do cadastro foi o primeiro passo. O segundo é levar a pessoa até o primeir...
Os 5 commits sem glamour que fiz antes de ligar o tráfego pago
Antes de pagar por cada clique no Estoque Simples, arrumei a casa: um domínio só, scripts...
Esconder o menu não é controlar acesso: como fiz módulos que cada cliente liga e desliga
Oficina pequena não quer ver comissão, nota fiscal e portal do cliente no primeiro dia. De...