Pular para o conteudo principal

Onde o ORM te abraça e onde ele te enforca

Como usar ORM como ferramenta de produtividade sem cair em query escondida, abstração vazia e falsa sensação de que banco deixou de existir.

Andrews Ribeiro

Andrews Ribeiro

Founder & Engineer

O problema

ORM costuma entrar no projeto como alívio.

Você para de:

  • montar SQL repetitivo
  • mapear coluna na mão
  • escrever CRUD básico toda hora

Isso realmente ajuda.

O problema começa quando esse conforto vira cegueira.

O time passa a agir como se:

  • banco fosse detalhe
  • query não tivesse custo
  • relação carregasse “sozinha”
  • abstração resolvesse modelagem ruim

E é aí que o ORM começa a enforcar.

Não porque ORM seja ruim.

Mas porque ele facilita esquecer que por baixo ainda existe:

  • banco real
  • plano de execução real
  • lock real
  • volume real

Modelo mental

Pense assim:

ORM é um tradutor útil entre objetos e banco, não um escudo mágico contra problema de dados.

Essa frase separa bastante coisa.

Se você trata ORM como tradutor, ele ajuda:

  • reduz repetição
  • padroniza acesso
  • melhora ergonomia
  • acelera fluxo comum

Se você trata ORM como substituto de entendimento de banco, ele atrapalha:

  • esconde query cara
  • mascara cardinalidade
  • incentiva carregamento ingênuo
  • dá sensação falsa de portabilidade total

Então a pergunta certa não é:

  • “ORM é bom ou ruim?”

A pergunta certa é:

  • “em que camada de abstração este caso ainda está saudável?”

Quebrando o problema

Onde o ORM te abraça

ORM costuma funcionar muito bem quando o trabalho é previsível.

Exemplos:

  • CRUD comum
  • relacionamentos simples
  • validação e tipagem no acesso
  • filtros básicos
  • transações usuais do app

Nesses casos, ele evita um monte de boilerplate e mantém o time andando com consistência.

Também ajuda quando:

  • muita gente mexe no mesmo código
  • o domínio já tem modelo claro
  • o ganho de produtividade pesa mais do que microcontrole de query

Aqui o ORM é ferramenta boa.

Onde ele começa a enforcar

O enforcamento normalmente não vem num erro dramático.

Vem em pequenos sinais:

  • endpoint começa a ficar lento
  • log mostra consulta repetida demais
  • query cresce sem você perceber
  • agregação vira malabarismo
  • bulk update fica torto
  • transação fica confusa

Esse é o padrão:

o código parece elegante no nível da aplicação, mas o comportamento no banco piora.

N+1 é o tropeço mais clássico

Esse é provavelmente o caso mais conhecido.

Você busca uma lista e depois acessa relação item por item.

No código, parece inocente.

No banco, vira:

  • 1 query para a lista
  • mais 1 para cada item

Então uma das primeiras maturidades com ORM é perder a inocência sobre relação lazy ou navegação automática.

Se você não enxerga o custo do acesso, o ORM te seduz para um fluxo caro.

Query escondida é pior do que query explícita

Muita gente prefere ORM porque o código “fica limpo”.

Só que às vezes limpo para o código significa opaco para o comportamento.

Quando o SQL está escondido demais, fica mais difícil perceber:

  • quantas queries saíram
  • quanto dado veio
  • se houve join demais
  • se houve filtro insuficiente

Abstração boa não é a que esconde tudo.

É a que esconde sem roubar observabilidade.

Agregação e consulta específica às vezes pedem outro nível

ORM costuma brilhar em acesso orientado a entidade.

Mas quando a pergunta vira:

  • ranking
  • relatório
  • agregação por período
  • cálculo com group by
  • consulta muito específica para tela ou dashboard

ele pode começar a ficar torto.

Nessas horas, muitas vezes faz mais sentido:

  • usar query builder
  • escrever SQL manual
  • criar leitura especializada

Não porque o ORM fracassou.

Mas porque a pergunta deixou de ser “me dá entidade” e virou “me dá resposta analítica”.

Portabilidade total quase sempre é meia verdade

Outra armadilha comum é achar que ORM torna o banco intercambiável.

Na teoria, parece bonito.

Na prática, banco real tem:

  • tipos específicos
  • índices específicos
  • recursos nativos
  • comportamento de lock
  • diferenças de performance

Então o ORM até pode diminuir acoplamento em alguns pontos.

Mas não apaga o fato de que seu sistema roda em um banco concreto, com características concretas.

Bulk operation e escrita em massa costumam expor a abstração

Outro lugar onde o ORM costuma sofrer:

  • atualização em lote
  • insert massivo
  • migração de dado
  • backfill

Se você tenta resolver tudo no modo “uma entidade por vez”, o custo explode.

Nesses casos, normalmente compensa usar caminho mais direto e mais explícito.

Transação continua sendo problema seu

ORM pode oferecer API elegante para transação.

Ótimo.

Mas ele não decide por você:

  • o que entra dentro dela
  • onde está a invariável
  • qual lock está sendo segurado
  • se você deixou chamada externa ali dentro

Ou seja:

transação com ORM bonita por fora ainda pode estar ruim por dentro.

Exemplo simples

Imagine uma listagem de pedidos com nome do cliente e total de itens.

No código, alguém faz algo nessa linha:

const orders = await orm.order.findMany({
  where: { status: "paid" },
  take: 50,
})

for (const order of orders) {
  const customerName = order.customer.name
  const itemCount = order.items.length
}

Lendo rápido, isso parece elegante.

Só que pode esconder:

  • query para buscar pedidos
  • query para cada cliente
  • query para cada coleção de itens

Agora a página que parecia simples vira um festival de round-trip.

Uma correção possível pode ser:

  • eager loading criterioso
  • projeção dos campos necessários
  • agregação específica para itemCount

Ou até uma query manual se a tela pedir resposta mais especializada.

O ponto é:

você não corrige o problema defendendo a abstração.

Você corrige olhando o comportamento real.

Erros comuns

  • Falar de ORM como se ele eliminasse a necessidade de saber SQL.
  • Achar que código bonito no repositório significa query saudável.
  • Resolver tudo no modo entidade por entidade, até bulk operation.
  • Esconder performance ruim atrás de “depois o banco resolve”.
  • Forçar ORM em relatório, agregação ou consulta altamente específica.
  • Tratar portabilidade entre bancos como promessa garantida só porque existe ORM.

Como um senior pensa

Um senior normalmente usa ORM sem idolatrar nem demonizar.

Ele pensa mais ou menos assim:

  • “para o fluxo comum, ORM me deixa mais rápido e mais consistente”
  • “para esta consulta específica, eu quero controle maior”
  • “para esta operação em lote, eu não vou fingir que entidade por entidade é aceitável”

Ele também mantém duas preocupações ao mesmo tempo:

  • ergonomia do código
  • comportamento real no banco

Então ele olha:

  • query gerada
  • número de round-trips
  • tamanho do payload
  • impacto de transação
  • necessidade de índice

Em vez de defender a ferramenta, ele protege o sistema.

O que o entrevistador quer ver

Em entrevista, a resposta madura quase nunca é:

  • “eu adoro ORM”

Nem:

  • “ORM é horrível, só escrevo SQL na mão”

O avaliador normalmente quer ver equilíbrio.

Algo como:

  • saber onde ORM acelera o time
  • saber onde ele começa a esconder custo
  • saber quando descer um nível sem drama

Uma resposta forte costuma ter esta forma:

“Eu uso ORM com tranquilidade para o acesso comum, porque ele reduz repetição e melhora a consistência do código. Mas eu não trato isso como desculpa para ignorar banco. Quando começo a ver N+1, agregação estranha, bulk operation ou query muito específica, eu olho o SQL gerado e, se precisar, saio da abstração para recuperar controle.”

Isso passa uma mensagem boa:

você não está preso nem ao fanatismo da ferramenta nem ao purismo desnecessário.

ORM é ótimo para tirar trabalho mecânico do caminho. Péssimo para justificar cegueira sobre o banco.

Abstração madura não é a que esconde tudo. É a que deixa você descer um nível na hora certa.

Resumo rápido

O que vale manter na cabeça

Checklist de pratica

Use isto ao responder

Você concluiu este artigo

Próximo artigo SQL que realmente aparece em entrevista Artigo anterior Normalização vs pragmatismo: quando cada um

Continue explorando

Artigos relacionados