dbt para times pequenos: como começar sem complicar
dbt parece exagero quando você é um time de uma pessoa. Não é, mas a forma como a maioria dos tutoriais introduz a ferramenta é. Aqui está o setup mínimo viável que cresce junto.

Metade das empresas pequenas com quem converso descarta o dbt como "a ferramenta que os times de analytics no nível de uma FAANG usam". A outra metade tenta adotar, segue um tutorial que joga doze pacotes na cara no primeiro dia, se assusta, e volta sem dizer nada a escrever views SQL direto no warehouse.
Os dois estão errados, mas o segundo grupo tem o instinto certo. O dbt compensa para praticamente qualquer time que roda mais de dez queries em produção, desde que você adote na medida do seu tamanho. Aqui está a versão que eu instalo em empresas pequenas: opinada, enxuta e feita para crescer junto com você, em vez de te obrigar a crescer pra acompanhar.
O que o dbt de fato resolve já no primeiro dia
Esquece o marketing e os tutoriais do YouTube. Logo no primeiro dia, o dbt resolve quatro coisas que você não tem quando escreve views SQL direto no warehouse:
- Controle de versão. Suas transformações ficam no git. Dá pra revisar mudanças, voltar atrás e ver quem colocou aquele CASE esquisito no modelo de receita seis meses atrás.
- Testes. Uma linha de YAML e o dbt avisa quando uma chave primária deixa de ser única, quando uma coluna começa a produzir nulls que não devia, ou quando uma foreign key sai do lugar.
- Documentação que não apodrece. Modelos e colunas são documentados ao lado do SQL que os define, então a doc só desatualiza quando você esquece de atualizar os dois.
- Um build repetível. Um comando reconstrói toda a pipeline analítica em ordem de dependência. Acabou o "acho que essa view depende daquela mas não tenho certeza".
Todo o resto que o dbt oferece, semantic layer, exposures, snapshots, o hub inteiro de pacotes da comunidade, é coisa que você vai usar quando crescer. Não tente abraçar tudo logo de cara.
O projeto dbt mínimo viável
Para um time de 1 a 5 pessoas com um único warehouse, esta é a menor estrutura de projeto que eu topo colocar em produção:
models/
staging/
stg_stripe__charges.sql
stg_stripe__customers.sql
stg_hubspot__deals.sql
marts/
fct_revenue.sql
dim_customers.sql
schema.ymlDuas camadas. Os modelos staging são 1:1 com as tabelas de origem: renomeie as colunas para uma convenção única, faça o cast dos tipos e pare por aí. Nada de regra de negócio. Os modelos marts são as tabelas que os Dashboards leem. Eles juntam os staging e aplicam as regras que de fato definem seus KPIs.
Repare no que ficou de fora: uma camada intermediate, macros customizadas, um pacote utils, exposures, snapshots, seeds. Tudo isso entra quando você tiver um motivo concreto: um join repetido quatro vezes, uma slowly-changing dimension que importa de verdade, o time de financeiro perguntando quando o modelo de receita rodou pela última vez. Adicionar antes da hora cria pastas com um arquivo só dentro, que é o contrário de organizar.
Os quatro testes que todo modelo precisa
Para cada modelo de mart, escreva isso no schema.yml:
- unique + not_null na chave primária. Se
fct_revenuetem uma linha por nota fiscal, o id da nota tem que ser único e nunca null. Isso pega uma porção enorme de bugs de pipeline. - teste de relationships em toda foreign key. Se
fct_revenue.customer_idreferenciadim_customers.customer_id, o dbt avisa no dia em que um cliente for deletado lá no upstream e sua fact table começar a ter linhas órfãs. - accepted_values em colunas tipo enum. Status, códigos de país, planos: se um valor novo aparecer, você quer ser avisado, não ver um número estranho surgir do nada no Dashboard.
- checagem de freshness em cada source. Uma linha no YAML de sources e o dbt derruba o run quando a tabela bruta de
chargesfica 24 horas sem atualizar.
Quatro testes, quinze minutos de YAML. Eles pegam 80% dos problemas silenciosos que fazem um time de dados parecer pouco confiável.
CI desde o primeiro dia (sim, sério)
Eu sei: vocês são um time de duas pessoas, não precisam de CI. Precisam sim. A única coisa que separa um projeto dbt que continua confiável de um que vira "o modelo que a gente não sabe se funciona" é rodar os testes automaticamente em cada PR.
No dbt Cloud é só um toggle: ative o Slim CI num job que roda em cada PR. Se você usa o dbt Core, um workflow de 30 linhas no GitHub Actions resolve a mesma coisa. De qualquer jeito, a regra é uma só: nenhum PR entra com teste vermelho. E essa regra é muito mais fácil de cravar no primeiro dia, com dois contribuidores, do que lá no dia duzentos, com vinte.
Uma semana pra colocar o dbt de pé já entrega o projeto em camadas, a convenção dos quatro testes, CI em cada PR e um runbook documentado que suas próximas contratações vão agradecer. Caro de arrumar depois, barato de fazer certo agora.
Montar do jeito certo logo de caraO que pular até você precisar de fato
Uma lista curta de coisas que os tutoriais vão mandar você fazer e que dá pra deixar de lado até ter um motivo:
- Snapshots. Úteis quando você realmente precisa acompanhar mudanças ao longo do tempo. Cedo demais quando você só quer os dados de ontem.
- Macros customizadas. Não escreva uma macro até ter copiado o mesmo SQL três vezes. Na terceira cópia é que você finalmente entende qual abstração faz sentido.
- O pacote dbt-utils. São 100 macros que você não vai usar. Coloque quando precisar de uma específica, não por precaução.
- A Semantic Layer. Vale a pena quando você tem várias ferramentas de BI brigando pela mesma métrica. Exagero quando uma analista só olha um Dashboard.
A versão do dbt que você adota no primeiro dia não é a que vai rodar daqui a dois anos. Tudo bem. A ideia é fixar o básico chato, controle de versão, modelos em camadas, testes, CI, e só adicionar complexidade quando uma dor concreta pedir.