Arquitetura
Multi-Tenant explicado com um projeto real
Estratégias de isolamento de dados e schema usadas no StockFlow com PostgreSQL e Prisma.
9 min de leitura
- SaaS
- Multi-Tenant
- Arquitetura
- PostgreSQL
O problema do SaaS multiempresa
No StockFlow, cada cliente (empresa) precisa ver apenas seus produtos, movimentações e usuários. Errar o isolamento significa vazamento de dados — inaceitável em produção.
Estratégia escolhida: shared database, shared schema
Optei por banco compartilhado com coluna tenant_id em todas as tabelas de domínio. É o equilíbrio ideal para o estágio atual do produto: custo controlado e migrations simples com Prisma.
- tenant_id em todas as queries
- Índices compostos (tenant_id, id)
- Middleware Prisma para filtro automático
Implementação com Prisma
Criei um middleware que injeta where: { tenantId } em findMany e valida ownership em update/delete. Isso reduz o risco de esquecer o filtro em uma query.
typescript
prisma.$use(async (params, next) => {
if (params.model && TENANT_MODELS.includes(params.model)) {
if (params.action === 'findMany') {
params.args.where = { ...params.args.where, tenantId };
}
}
return next(params);
});Aplicação em novos produtos
Os aprendizados de isolamento por tenant e LGPD por design podem ser reaproveitados em futuros produtos SaaS e EdTech.