<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Paulo Junior</title>
    <description>The latest articles on DEV Community by Paulo Junior (@paulojr_r).</description>
    <link>https://dev.to/paulojr_r</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3773031%2Fb3eef539-0918-4762-9464-e16c9219a1a2.jpg</url>
      <title>DEV Community: Paulo Junior</title>
      <link>https://dev.to/paulojr_r</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paulojr_r"/>
    <language>en</language>
    <item>
      <title>D3.js não deveria saber de onde vêm os dados</title>
      <dc:creator>Paulo Junior</dc:creator>
      <pubDate>Sat, 14 Feb 2026 18:14:20 +0000</pubDate>
      <link>https://dev.to/paulojr_r/d3js-nao-deveria-saber-de-onde-vem-os-dados-39ao</link>
      <guid>https://dev.to/paulojr_r/d3js-nao-deveria-saber-de-onde-vem-os-dados-39ao</guid>
      <description>&lt;h2&gt;
  
  
  Introdução — o problema real (não é o D3)
&lt;/h2&gt;

&lt;p&gt;Quando começamos a trabalhar com visualização de dados, é comum pensar que o maior desafio está no front-end, especialmente na escolha da biblioteca ou na construção dos gráficos.&lt;/p&gt;

&lt;p&gt;Esse problema apareceu numa reunião de trabalho onde a normalização no front-end foi uma escolha inicial, motivada pela simplicidade de implementação. No entanto, ao analisar a escalabilidade e a reutilização da solução, tornou-se evidente que essa abordagem deslocava responsabilidades para o lugar errado do sistema.&lt;/p&gt;

&lt;p&gt;Mas, ao longo deste projeto, percebi algo desconfortável:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O problema raramente é o D3.js.&lt;br&gt;
O problema é o formato do dado que chega até ele.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Este artigo mostra como criar um pipeline de dados capaz de consumir &lt;strong&gt;CSV, JSON e XML&lt;/strong&gt;, normalizar tudo em um &lt;strong&gt;modelo único&lt;/strong&gt; e alimentar o &lt;strong&gt;mesmo gráfico D3&lt;/strong&gt; — sem que ele soubesse (ou precisasse saber) de onde os dados vieram. Para isso, trabalhei com dois cenários diferentes, comparando abordagens e avaliando se essa escolha valia a pena. Vou apresentar ambas as estratégias, incluindo os esquemas e as problemáticas de um cenário onde toda a responsabilidade fica a cargo do front-end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abordagem A —  A Normalização no Front-end
&lt;/h2&gt;

&lt;p&gt;A primeira abordagem seguiu o caminho mais comum em projetos com D3.js. comumente em projetos pequenos não costumam ter preocupação com escalabilidade — e, por serem muitas vezes acadêmicos, a maioria dos programadores escolhe esse caminho por parecer mais simples. Porém, ao considerar questões de segurança e escalabilidade, essa escolha se mostra ineficaz. &lt;/p&gt;

&lt;h3&gt;
  
  
  Como funciona
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O front-end identifica o formato dos dados&lt;/li&gt;
&lt;li&gt;Para cada formato, usa um loader diferente (&lt;code&gt;csv&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;fetch&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Após o carregamento, os dados são normalizados no próprio front-end&lt;/li&gt;
&lt;li&gt;O D3 consome o modelo normalizado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fluxo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight abap"&gt;&lt;code&gt;&lt;span class="n"&gt;Fonte&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;Leitor&lt;/span&gt; &lt;span class="n"&gt;por&lt;/span&gt; &lt;span class="n"&gt;formato&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CSV&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;XML&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;Normaliza&lt;/span&gt;&lt;span class="err"&gt;çã&lt;/span&gt;&lt;span class="n"&gt;ono&lt;/span&gt; &lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;Modelo&lt;/span&gt; &lt;span class="err"&gt;ú&lt;/span&gt;&lt;span class="n"&gt;nico&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;D3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa abordagem funciona bem porque é simples, rápida de implementar e ideal para protótipos e projetos pequenos. Além disso, não exige banco de dados, o que reduz a complexidade inicial e permite validar ideias rapidamente.&lt;/p&gt;

&lt;p&gt;Aqui entra &lt;strong&gt;código curto&lt;/strong&gt;, tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// CSV&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;csvData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/data.csv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// JSON&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/data.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// XML&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xmlText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;awaitfetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/data.xml&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;newDOMParser&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;parseFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xmlText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/xml&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois o normalizador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;newDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas, com o avanço do projeto, algumas limitações se tornaram evidentes: o front-end passa a conhecer detalhes da origem dos dados, há duplicação de lógica de normalização, o código começa a crescer com condicionais por formato, o gráfico fica acoplado às fontes de dados, e a solução não escala bem para grandes volumes. Ou seja: &lt;strong&gt;funciona&lt;/strong&gt;, mas começa a ficar frágil. Essas limitações motivaram a busca por uma alternativa onde a responsabilidade pela organização dos dados fosse deslocada para uma camada mais adequada do sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abordagem B — Pipeline de dados no banco
&lt;/h2&gt;

&lt;p&gt;Na segunda abordagem, a responsabilidade pela normalização dos dados foi deslocada para o banco de dados, por meio de uma pipeline de ETL, eliminando do front-end a necessidade de lidar com múltiplos formatos de origem. Com isso, a aplicação cliente passou a consumir apenas um modelo de dados único e consistente, enquanto o D3.js foi utilizado exclusivamente para sua finalidade principal: a visualização. A ideia central dessa abordagem é que o D3.js não deveria saber se os dados vieram de um arquivo CSV, JSON ou XML, mas apenas receber informações já estruturadas no formato correto para renderização.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é ETL
&lt;/h2&gt;

&lt;p&gt;O processo de &lt;strong&gt;ETL (Extract, Transform, Load)&lt;/strong&gt; é amplamente definido como uma metodologia para coletar dados de múltiplas fontes, aplicar transformações (limpeza, padronização, enriquecimento) e carregar em um repositório unificado preparado para análise ou consultas eficientes. (AWS, 2026)&lt;/p&gt;

&lt;p&gt;Segundo a documentação da Microsoft, ETL &lt;strong&gt;consolida dados de diversas fontes em um destino unificado&lt;/strong&gt; e aplica transformações com base em regras de negócio antes de disponibilizá-los para consumidores posteriores.&lt;/p&gt;

&lt;p&gt;A literatura acadêmica moderna também formaliza a necessidade de padrões de integração de dados que garantam consistência, governança, observabilidade e qualidade dos dados ao longo do pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como funciona
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O backend identifica a fonte e o formato dos dados&lt;/li&gt;
&lt;li&gt;Cada formato é ingerido por um processo de extração específico (CSV, JSON, XML, API)&lt;/li&gt;
&lt;li&gt;Os dados são armazenados em &lt;em&gt;staging tables&lt;/em&gt; sem validação rígida&lt;/li&gt;
&lt;li&gt;A normalização ocorre no banco de dados, por meio de transformações e views&lt;/li&gt;
&lt;li&gt;O front-end consome um modelo único já normalizado&lt;/li&gt;
&lt;li&gt;O D3 utiliza esses dados apenas para visualização&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Embora os exemplos apresentados a seguir utilizem banco de dados relacional, a abordagem não é dependente exclusivamente de SQL. O mesmo padrão arquitetural pode ser implementado em bancos NoSQL, utilizando coleções de staging e mecanismos de transformação como aggregation pipelines. O princípio central não está na tecnologia escolhida, mas na separação clara entre dados crus e modelo final consumível pela aplicação.&lt;/p&gt;

&lt;p&gt;O pipeline ficou assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight abap"&gt;&lt;code&gt;&lt;span class="n"&gt;Fontes&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CSV&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;XML&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;Staging&lt;/span&gt; &lt;span class="k"&gt;Tables&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;banco&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;Normaliza&lt;/span&gt;&lt;span class="err"&gt;çã&lt;/span&gt;&lt;span class="k"&gt;o&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;Modelo&lt;/span&gt; &lt;span class="err"&gt;ú&lt;/span&gt;&lt;span class="n"&gt;nico&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;simples&lt;/span&gt;
   &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="n"&gt;D3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nessa abordagem, cada fonte de dados alimenta uma &lt;em&gt;staging table&lt;/em&gt; que aceita os dados exatamente como eles são, com tipagem flexível e sem validações rígidas, cujo objetivo não é corrigir ou interpretar os dados, mas apenas capturá-los. Essa etapa cria uma separação clara entre dados crus e dados confiáveis. A partir dessas tabelas intermediárias, o banco de dados assume a responsabilidade pela normalização, utilizando &lt;em&gt;views&lt;/em&gt; ou transformações para padronizar campos,  aplicar tipagem correta, unificar estruturas e gerar um único modelo de dados consistente. &lt;/p&gt;

&lt;p&gt;Exemplo de tabela de staging para CSV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;staging_csv&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses dados ainda não estão prontos para análise ou visualização.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transformação para o modelo final
&lt;/h2&gt;

&lt;p&gt;Após a carga inicial, os dados são transformados e inseridos em uma tabela final, já tipada e otimizada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transformação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;DATE&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging_csv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse ponto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Datas são datas&lt;/li&gt;
&lt;li&gt;Valores são numéricos&lt;/li&gt;
&lt;li&gt;O modelo é consistente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa estrutura é típica de pipelines de ETL que convertem dados brutos de formatos heterogêneos em um modelo relacional consistente preparado para análise. &lt;/p&gt;




&lt;h2&gt;
  
  
  Indexação e otimização
&lt;/h2&gt;

&lt;p&gt;Como os dados agora estão em um banco relacional, é possível aplicar índices e otimizações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_metrics_dateON&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_metrics_nameON&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essas otimizações seriam impossíveis ou custosas no front-end. &lt;/p&gt;

&lt;h2&gt;
  
  
  Front-end simplificado
&lt;/h2&gt;

&lt;p&gt;Com a pipeline pronta, o front-end passa a consumir apenas um endpoint padronizado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;awaitfetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/metrics&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O D3 agora trabalha exclusivamente com o modelo final:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;selectAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O D3 &lt;strong&gt;não sabe&lt;/strong&gt; — e não precisa saber — se os dados vieram de CSV, JSON ou XML.&lt;/p&gt;

&lt;p&gt;Com esse contrato bem definido, o papel do front-end torna-se simples e bem delimitado: consumir dados já normalizados em JSON, desenhar os gráficos e lidar com a interação do usuário. O front-end deixa de parsear formatos, converter tipos ou decidir a semântica dos dados, e o D3.js passa a atuar apenas como um consumidor de dados prontos para visualização.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparação entre as abordagens
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critério&lt;/th&gt;
&lt;th&gt;Normalização no Front&lt;/th&gt;
&lt;th&gt;Pipeline de Dados&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Acoplamento&lt;/td&gt;
&lt;td&gt;Alto&lt;/td&gt;
&lt;td&gt;Baixo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalabilidade&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reuso de dados&lt;/td&gt;
&lt;td&gt;Difícil&lt;/td&gt;
&lt;td&gt;Fácil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Cliente&lt;/td&gt;
&lt;td&gt;Servidor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tipagem forte&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D3 focado em visualização&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance no Servidor: Um Custo ou Uma Estratégia?
&lt;/h2&gt;

&lt;p&gt;Como a tabela acima mostra, na abordagem com pipeline de dados, a performance — ou melhor, o custo computacional — fica concentrado no servidor. Pode parecer até contraditório eu defender essa segunda abordagem como a melhor escolha na reunião que tive na empresa. E foi justamente esse ponto que gerou debate. Em conversa com meu professor, surgiu a provocação clássica: &lt;em&gt;“Se eu sou empresário e quero reduzir custo, por que eu colocaria mais carga no servidor?”&lt;/em&gt; Faz sentido. Grande parte da evolução do front-end moderno — React, SPAs, renderização no cliente — nasceu da ideia de empurrar processamento para o usuário e aliviar a infraestrutura.&lt;/p&gt;

&lt;p&gt;A questão é que nem todo custo é igual. Quando você centraliza a transformação no servidor, ganha controle, segurança dos dados, previsibilidade e capacidade real de otimização (índices, cache, escalabilidade). Quando leva isso para o cliente, você distribui não só processamento, mas também complexidade e inconsistência. Cada usuário vira um “mini processador de ETL” rodando em ambientes que você não controla. Funciona bem no seu notebook. Pode travar no celular do usuário.&lt;/p&gt;

&lt;p&gt;E tem mais: no nosso caso, o processamento nem fica 100% concentrado na cloud. A arquitetura prevê um runner rodando na própria infraestrutura do cliente, com mensageria para orquestrar os eventos e cache para acelerar os resultados. Ou seja, não é “jogar CPU na nuvem”, é distribuir processamento de forma consciente e desacoplada. A cloud coordena. O runner executa. O sistema respira.&lt;/p&gt;

&lt;p&gt;No fim, o que ficou claro para mim — tanto na reunião quanto na conversa com o professor — é que esse “custo a mais” no servidor pode ser irrisório diante das vantagens arquiteturais. Você troca economia bruta de CPU por estabilidade, reuso de dados, menor acoplamento e melhor experiência do usuário. Em sistemas pequenos talvez não faça tanta diferença. Mas em cenários reais, com volume e crescimento, essa escolha deixa de ser apenas técnica e passa a ser estratégica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A normalização de dados no front-end não é conceitualmente incorreta e pode ser adequada para protótipos, demonstrações e aplicações de pequena escala, onde simplicidade e rapidez são fatores prioritários. Entretanto, sob a perspectiva da arquitetura de dados, a adoção de uma pipeline estruturada de ETL apresenta vantagens relevantes, como a separação clara de responsabilidades entre as camadas do sistema, maior manutenibilidade, melhor desempenho em cenários de maior volume de dados e o aproveitamento de recursos avançados do banco de dados, incluindo tipagem forte, indexação e agregações otimizadas. Além disso, ao concentrar as transformações no backend, reduzem-se riscos de segurança associados à exposição de regras de negócio, validações sensíveis e dados crus no ambiente do navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências Bibliográficas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS.&lt;/strong&gt; O que é ETL? Extração, Transformação e Carga. Amazon Web Services, 2026. Disponível em: &lt;a href="https://aws.amazon.com/pt/what-is/etl/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://aws.amazon.com/pt/what-is/etl/&lt;/a&gt;. Acesso em: 12 fev. 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MICROSOFT.&lt;/strong&gt; ETL (extração, transformação e carregamento). Microsoft Learn, 2025. Disponível em: &lt;a href="https://learn.microsoft.com/pt-br/azure/architecture/data-guide/relational-data/etl?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://learn.microsoft.com/pt-br/azure/architecture/data-guide/relational-data/etl&lt;/a&gt;. Acesso em: 12 fev. 2026.&lt;br&gt;
Alura. O que é um pipeline de dados ?. Disponível em:  &lt;a href="https://www.alura.com.br/artigos/o-que-pipeline-dados" rel="noopener noreferrer"&gt;https://www.alura.com.br/artigos/o-que-pipeline-dados&lt;/a&gt;. Acesso em: 12 fev. 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RUCCO, C.; SAAD, M.; LONGO, A.&lt;/strong&gt; Formalizing ETLT and ELTL Design Patterns and Proposing Enhanced Variants: A Systematic Framework for Modern Data Engineering. arXiv, 2025. Disponível em: &lt;a href="https://arxiv.org/abs/2511.03393?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2511.03393&lt;/a&gt;. Acesso em: 12 fev. 2026.&lt;/p&gt;

</description>
      <category>d3js</category>
      <category>cicd</category>
      <category>etl</category>
      <category>sql</category>
    </item>
  </channel>
</rss>
