Skip to content

Arquitetura final ​

Este é o desenho que o projeto entrega ao fim da E4. Ele parte de uma regra: a pesquisadora usa um app só, com três abas, e não precisa saber o que roda por trás. Todo o resto existe para alimentar essas três abas e para cumprir o que a disciplina pede em cada entrega.

ou clique numa parte do desenho
Postgres 16papéis e GRANTLakehouseem disco localApp da pesquisadoraStreamlitDados abertosZIP do mês, desde 2002Python · src/douOrquestradormensal, retry, backfillDagster (opção nula: cron + make)Atos do DOUtexto + linktabela atoCuradoriatipologia, órgãosinsert-onlyBusca do RAGtexto + filtrostsvector · portuguêsAlertasETL reversoscript PythonSilver, em Deltaatos + curadoriadeltalake · CDC por slot lógicoGoldfatos, SCD, métricas, testesdbt-core + dbt-duckdbPerguntarassistente, cita o atoSDK anthropicRevisaralertas, reclassificargrava na curadoriaPainelvitalidadelê as métricas do dbtAPI do Claudeescreve a respostaCatálogo e linhagemdbt docs, no sitemensaldisparaCDC
Como ler

Contorno sólido: já existe. Tracejado: entra na E3 e na E4. Verde: dado do DOU. Roxo: o que a pesquisadora decide. Coral: o assistente. Passe o mouse para ver as ligações de cada parte.

Clique numa parte para ver o que ela faz, a ferramenta e o porquê, ou percorra o caminho do dado passo a passo. O mesmo desenho, estático, está em arquitetura-final.svg.

Como o dado anda ​

  1. Entrada. Uma vez por mês, o ingestor em Python baixa o ZIP da Imprensa Nacional e grava cada ato no Postgres, com o texto e o link da publicação.
  2. Curadoria. A tipologia e a identidade dos conselhos ficam no mesmo Postgres, sem nada ser sobrescrito (ADR 0001).
  3. Análise. As mudanças vão por CDC para a silver em Delta. O dbt, rodando no DuckDB, monta a gold: fatos, dimensões com histórico e as métricas de vitalidade.
  4. Volta para quem decide. As métricas viram alertas, gravados de volta no Postgres. É o ETL reverso: a pesquisadora vê o alerta na aba Revisar e reclassifica se precisar.
  5. Perguntas. O texto dos atos é indexado pela busca textual do próprio Postgres, em português. A aba Perguntar acha os atos e pede a resposta à API do Claude, citando cada um.

O RAG lê só o Postgres. O lakehouse fica fora do caminho das perguntas, então uma falha na parte analítica não derruba o assistente.

Ferramentas ​

ParteFerramentaSituaçãoPor que essa
Infra e comandosDocker Compose + make✅ já temtudo sobe com um comando
IngestãoPython (src/dou, biblioteca padrão + psycopg)✅ já tema migração do Go para Python
OLTP e curadoriaPostgreSQL 16✅ já temADR 0002
CDCslot de replicação lógica do Postgres✅ já temADR 0007, sem Kafka
SilverDelta Lake, pela biblioteca deltalake✅ já temADR 0006
Motor analíticoDuckDB✅ já temlê o Delta direto, sem servidor
Gold e testes de dadosdbt-core + dbt-duckdb🆕 E3modelos em SQL versionados, com testes de esquema, unicidade e integridade
Camada semânticamétricas definidas no dbt🆕 E4uma definição só, usada pelo painel e pelos alertas
OrquestraçãoDagster, com a opção nula cron + make🆕 E3partições mensais dão o backfill e o retry por configuração
ETL reversoscript Python, disparado pelo orquestrador🆕 E4lê a gold e grava os alertas no Postgres
Busca do RAGbusca textual do Postgres (tsvector, em português)🆕já vem no banco: sem extensão, sem modelo de embedding, sem conta a mais
Respostas do RAGAPI do Claude, pelo SDK anthropic🆕escreve a resposta a partir dos trechos achados
App da pesquisadoraStreamlit🆕um app Python, com as três abas
Catálogo e linhagemdbt docs, publicado no site🆕 E4o grafo vai da fonte até o painel e os alertas
Controle de acessopapéis e GRANT do Postgres, com RLS se precisar🆕 E4o app só lê e escreve o que precisa
CI e documentaçãoGitHub Actions + VitePress✅ já tem

São quatro peças novas de verdade: dbt, Dagster, Streamlit e o SDK do Claude. O resto é configuração do que já existe.

O que fica de fora, e por quê ​

  • Airflow. Pede vários containers para um job por mês. O diário de 25/09 registra a restrição do briefing: quem mantém isso rodando é a pesquisadora, então vale o mais simples de operar.
  • Kafka e Debezium. O ADR 0007 trocou os dois pelo slot lógico.
  • Spark e Iceberg. Não se justificam neste volume. O Delta já entregue cobre o formato aberto.
  • LangChain e LlamaIndex. O RAG aqui é uma consulta SQL e uma chamada à API. Um framework esconderia isso e traria dependências.
  • Busca vetorial. A API do Claude não gera embeddings, e vetores pediriam mais um modelo e mais uma conta. A busca textual do Postgres acha palavras, não sentido; o Claude pode reescrever a pergunta em termos de busca antes da consulta.

Decisões em aberto ​

Cada uma vira um ADR, com a opção nula tratada a sério e medida.

  • Orquestrador. Dagster cumpre retry e backfill por configuração, mas é mais um serviço. Com cron + make, os dois viram código nosso.
  • Camada semântica. As métricas no próprio dbt ou uma tabela de métricas escrita à mão.

O que cada entrega cobre ​

EntregaExigênciaOnde está no desenho
E1 ✅OLTP com integridade e decisões registradasPostgres: atos e curadoria
E2 ✅ingestão em lote, CDC, formato aberto, dado atrasadodados abertos, slot lógico, silver em Delta
E3fato, dimensões e SCD em camadasgold no dbt
E3testes de dadostestes do dbt
E3orquestração com retry e backfillorquestrador
E3EXPLAIN antes e depois, frescor e SLAgold e índices do Postgres
E3painelaba Painel
E4camada semânticamétricas no dbt
E4ETL reverso para quem agealertas e aba Revisar
E4catálogo e linhagem da fonte ao consumodbt docs
E4LGPD e controle de acesso por linha e colunapapéis do Postgres
Produtoa pesquisadora pergunta e confere a fonteaba Perguntar, busca textual do Postgres, API do Claude

Projeto Integrado de Banco de Dados 2 — FCTE/UnB, 2026/2.