Viviane.
Voltar ao blog
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.