<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivo de Modelagem de Dados - Data Universe</title>
	<atom:link href="https://datauniverse.com.br/category/modelagem-de-dados/feed/" rel="self" type="application/rss+xml" />
	<link>https://datauniverse.com.br/category/modelagem-de-dados/</link>
	<description>Conteúdos sobre as áreas de Data Science, Data Analytics, Estatística e Probabilidade, Inteligência Artificial e Machine Learning.</description>
	<lastBuildDate>Fri, 10 Apr 2026 02:20:22 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://datauniverse.com.br/wp-content/uploads/2026/01/cropped-data-universe-logo-icon-32x32.png</url>
	<title>Arquivo de Modelagem de Dados - Data Universe</title>
	<link>https://datauniverse.com.br/category/modelagem-de-dados/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Slowly Changing Dimensions (SCD)</title>
		<link>https://datauniverse.com.br/slowly-changing-dimensions-scd/</link>
					<comments>https://datauniverse.com.br/slowly-changing-dimensions-scd/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Fri, 10 Apr 2026 02:14:56 +0000</pubDate>
				<category><![CDATA[Modelagem de Dados]]></category>
		<guid isPermaLink="false">https://datauniverse.com.br/?p=3048</guid>

					<description><![CDATA[<p>No mundo do Data Warehousing e da modelagem analítica (como o Star Schema de Ralph Kimball), nós dividimos os dados em duas categorias principais: Fatos (os eventos numéricos, como uma venda) e Dimensões (o contexto descritivo, como o Cliente, o Produto ou a Loja). Enquanto os Fatos acontecem a todo momento (milhares de vendas por [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/slowly-changing-dimensions-scd/">Slowly Changing Dimensions (SCD)</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>No mundo do Data Warehousing e da modelagem analítica (como o <em>Star Schema</em> de Ralph Kimball), nós dividimos os dados em duas categorias principais: <strong>Fatos</strong> (os eventos numéricos, como uma venda) e <strong>Dimensões</strong> (o contexto descritivo, como o Cliente, o Produto ou a Loja).</p>



<p>Enquanto os Fatos acontecem a todo momento (milhares de vendas por minuto), as Dimensões mudam lentamente. Um cliente não muda de nome ou de endereço todos os dias. Porém, quando essa mudança acontece, a Engenharia de Dados precisa decidir como lidar com ela.</p>



<p>Se o João morava em São Paulo em 2025 e se mudou para o Rio de Janeiro em 2026, a venda que ele fez em 2025 deve ser contabilizada para SP ou para o RJ?</p>



<p>É para resolver esse problema de rastreamento histórico que existem as <strong>Slowly Changing Dimensions (SCD)</strong>, ou Dimensões de Alteração Lenta. Os três tipos principais são o SCD Tipo 1, Tipo 2 e Tipo 3.</p>



<figure class="wp-block-image size-large zoooom"><img fetchpriority="high" decoding="async" width="1024" height="386" src="https://datauniverse.com.br/wp-content/uploads/2026/04/image-1024x386.png" alt="" class="wp-image-3049" srcset="https://datauniverse.com.br/wp-content/uploads/2026/04/image-1024x386.png 1024w, https://datauniverse.com.br/wp-content/uploads/2026/04/image-300x113.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/04/image-768x290.png 768w, https://datauniverse.com.br/wp-content/uploads/2026/04/image-1536x579.png 1536w, https://datauniverse.com.br/wp-content/uploads/2026/04/image-2048x772.png 2048w, https://datauniverse.com.br/wp-content/uploads/2026/04/image-scaled.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">SCD Tipo 1: Substituição Direta (O Esquecimento)</h2>



<p>O SCD Tipo 1 é a abordagem mais simples. Quando um dado muda no sistema de origem, você simplesmente <strong>sobrescreve</strong> o dado antigo no seu banco analítico.</p>



<ul class="wp-block-list">
<li><strong>Objetivo:</strong> Ter sempre a informação mais atualizada possível.</li>



<li><strong>O que acontece com o histórico:</strong> Ele é <strong>perdido para sempre</strong>.</li>



<li><strong>Quando usar:</strong> Quando a mudança for uma correção de erro (ex: nome digitado errado) ou quando o histórico daquela informação não tiver nenhuma importância para as regras de negócio da empresa.</li>
</ul>



<p><strong>Exemplo Prático:</strong></p>



<p>A cliente &#8220;Ana&#8221; atualiza seu número de telefone no cadastro.</p>



<p><em>Tabela Antes:</em></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Cliente</strong></td><td><strong>Nome</strong></td><td><strong>Telefone</strong></td></tr></thead><tbody><tr><td>15</td><td>Ana Silva</td><td>(11) 9999-0000</td></tr></tbody></table></figure>



<p><em>Tabela Depois (SCD 1 aplicado):</em></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Cliente</strong></td><td><strong>Nome</strong></td><td><strong>Telefone</strong></td></tr></thead><tbody><tr><td>15</td><td>Ana Silva</td><td>(21) 8888-1111</td></tr></tbody></table></figure>



<p><em>Note que não há como saber qual era o telefone antigo da Ana.</em></p>



<h2 class="wp-block-heading">SCD Tipo 2: Versionamento (A Máquina do Tempo)</h2>



<p>O SCD Tipo 2 é o <strong>padrão ouro</strong> da Engenharia de Dados corporativa. Quando um atributo muda, você <strong>não apaga nada</strong>. Em vez disso, você &#8220;encerra&#8221; a validade do registro antigo e insere uma <strong>nova linha</strong> na tabela com o dado atualizado.</p>



<p>Para que isso funcione, a tabela ganha novas colunas de controle, geralmente: <code>Data_Inicio</code>, <code>Data_Fim</code> e <code>Status_Atual</code> (Ativo/Inativo), além de uma <em>Surrogate Key</em> (Chave Artificial) para diferenciar as versões da mesma pessoa.</p>



<ul class="wp-block-list">
<li><strong>Objetivo:</strong> Manter o histórico completo e preciso de todas as mudanças.</li>



<li><strong>O que acontece com o histórico:</strong> É totalmente preservado. Relatórios do passado puxarão os dados exatamente como eram na época.</li>



<li><strong>Quando usar:</strong> Quando o rastreamento histórico for essencial para auditoria, relatórios financeiros ou análises temporais (ex: mudança de cargo de um funcionário, mudança de endereço de um cliente).</li>
</ul>



<p><strong>Exemplo Prático:</strong></p>



<p>O cliente &#8220;Carlos&#8221; morava em São Paulo, mas no dia 09/04/2026 ele se mudou para o Rio de Janeiro.</p>



<p><em>Tabela Antes:</em></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>SK_Cliente</strong></td><td><strong>ID_Cliente</strong></td><td><strong>Nome</strong></td><td><strong>Estado</strong></td><td><strong>Data_Inicio</strong></td><td><strong>Data_Fim</strong></td><td><strong>Ativo</strong></td></tr></thead><tbody><tr><td>1001</td><td>42</td><td>Carlos</td><td>SP</td><td>2022-01-01</td><td>NULL</td><td>Sim</td></tr></tbody></table></figure>



<p><em>Tabela Depois (SCD 2 aplicado):</em></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>SK_Cliente</strong></td><td><strong>ID_Cliente</strong></td><td><strong>Nome</strong></td><td><strong>Estado</strong></td><td><strong>Data_Inicio</strong></td><td><strong>Data_Fim</strong></td><td><strong>Ativo</strong></td></tr></thead><tbody><tr><td>1001</td><td>42</td><td>Carlos</td><td>SP</td><td>2022-01-01</td><td>2026-04-09</td><td>Não</td></tr><tr><td>1002</td><td>42</td><td>Carlos</td><td>RJ</td><td>2026-04-09</td><td>NULL</td><td>Sim</td></tr></tbody></table></figure>



<p><em>Se o analista pedir as vendas do Carlos em 2025, o sistema fará um JOIN com a linha <code>SK_Cliente 1001</code> (SP). Se pedir as vendas de hoje, usará a linha <code>1002</code> (RJ).</em></p>



<h2 class="wp-block-heading">SCD Tipo 3: Nova Coluna (A História Parcial)</h2>



<p>O SCD Tipo 3 é um meio-termo. Ele mantém o histórico, mas apenas da <strong>versão imediatamente anterior</strong>. Em vez de adicionar uma nova linha (como no Tipo 2), você adiciona uma <strong>nova coluna</strong> à tabela atual para guardar o valor antigo.</p>



<ul class="wp-block-list">
<li><strong>Objetivo:</strong> Permitir a comparação rápida entre o estado atual e o estado anterior sem aumentar o número de linhas da tabela.</li>



<li><strong>O que acontece com o histórico:</strong> Você retém apenas 1 nível de passado. Se o dado mudar uma terceira vez, o histórico mais antigo é sobrescrito e perdido.</li>



<li><strong>Quando usar:</strong> É muito raro hoje em dia. Geralmente usado em casos muito específicos de vendas, como quando um representante muda de território e você quer ver os resultados dele tanto na &#8220;Região Atual&#8221; quanto na &#8220;Região Anterior&#8221; em uma mesma linha do relatório.</li>
</ul>



<p><strong>Exemplo Prático:</strong></p>



<p>A vendedora &#8220;Mariana&#8221; cobria a região &#8220;Sul&#8221;, mas foi transferida para a região &#8220;Sudeste&#8221;.</p>



<p><em>Tabela Antes:</em></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Vendedor</strong></td><td><strong>Nome</strong></td><td><strong>Regiao_Atual</strong></td><td><strong>Regiao_Anterior</strong></td></tr></thead><tbody><tr><td>77</td><td>Mariana</td><td>Sul</td><td>NULL</td></tr></tbody></table></figure>



<p><em>Tabela Depois (SCD 3 aplicado):</em></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Vendedor</strong></td><td><strong>Nome</strong></td><td><strong>Regiao_Atual</strong></td><td><strong>Regiao_Anterior</strong></td></tr></thead><tbody><tr><td>77</td><td>Mariana</td><td>Sudeste</td><td>Sul</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Quadro Resumo para Decisão de Arquitetura</h2>



<p>Para resumir as diferenças de forma prática na hora de desenhar a modelagem do seu Data Warehouse:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Característica</strong></td><td><strong>SCD Tipo 1 (Sobrescrever)</strong></td><td><strong>SCD Tipo 2 (Nova Linha)</strong></td><td><strong>SCD Tipo 3 (Nova Coluna)</strong></td></tr></thead><tbody><tr><td><strong>Mantém Histórico?</strong></td><td>Não.</td><td>Sim, histórico completo.</td><td>Sim, mas apenas o último valor.</td></tr><tr><td><strong>Crescimento da Tabela</strong></td><td>Nenhuma linha nova é adicionada.</td><td>A tabela cresce verticalmente (novas linhas).</td><td>A tabela cresce horizontalmente (novas colunas).</td></tr><tr><td><strong>Complexidade de Engenharia</strong></td><td>Muito baixa. Um simples <code>UPDATE</code>.</td><td>Alta. Exige chaves artificiais e controle rigoroso de datas.</td><td>Média. Exige alteração na estrutura (DDL) do banco.</td></tr><tr><td><strong>Cenário Ideal</strong></td><td>Correção de erros ortográficos ou dados irrelevantes (ex: hobby do cliente).</td><td>Rastreamento oficial de negócio (ex: Endereço para faturamento, cargo atual).</td><td>Comparação simples &#8220;antes x depois&#8221; (ex: Reestruturação de território de vendas).</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">O Fluxo Lógico (A Engenharia por trás)</h2>



<p>Para aplicar o SCD Tipo 2, o seu pipeline de dados não pode simplesmente &#8220;sobrescrever&#8221; a tabela. Ele precisa realizar uma operação de <strong>Upsert</strong> (Update + Insert) complexa seguindo estes passos:</p>



<ol start="1" class="wp-block-list">
<li><strong>Comparação:</strong> O pipeline lê os dados que acabaram de chegar da fonte e compara com o que já está no seu Data Warehouse.</li>



<li><strong>Identificação de Mudança:</strong> Para saber se algo mudou sem comparar coluna por coluna, os engenheiros costumam usar uma <strong>Hash Diff</strong> (uma assinatura digital da linha). Se o Hash da fonte for diferente do Hash do destino, algo mudou.</li>



<li><strong>Fechamento do Passado:</strong> O script executa um <code>UPDATE</code> na linha antiga do banco de dados, preenchendo a <code>data_fim</code> com o horário atual e alterando o status para <code>Inativo</code>.</li>



<li><strong>Abertura do Futuro:</strong> O script executa um <code>INSERT</code> de uma nova linha com os dados atualizados, <code>data_inicio</code> como agora e <code>data_fim</code> como nula (ou uma data infinita como 9999-12-31).</li>
</ol>



<h3 class="wp-block-heading">Ferramentas Práticas</h3>



<h4 class="wp-block-heading"><strong>Usando dbt (Snapshots)</strong></h4>



<p>O dbt é a ferramenta favorita para isso hoje. Ele tem uma funcionalidade nativa chamada <code>snapshots</code>. Você apenas define qual é a chave única e qual coluna indica a atualização, e o dbt gera toda a lógica de datas e versões automaticamente para você.</p>



<h4 class="wp-block-heading"><strong>Usando SQL Puro (Merge)</strong></h4>



<p>Em bancos como <strong>Snowflake, BigQuery ou Databricks</strong>, usamos o comando <code>MERGE</code>. É um comando poderoso que consegue inserir ou atualizar registros em uma única transação, garantindo que o histórico não seja corrompido se o processo cair no meio.</p>



<h3 class="wp-block-heading">3. Exemplo de Código SQL</h3>



<p>Imagine que você está atualizando a dimensão de <code>Produtos</code> porque o preço ou a categoria mudaram:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Exemplo simplificado de lógica de aplicação SCD 2
-- 1. Marcar como expirado o que mudou
UPDATE dim_produtos
SET data_fim = CURRENT_DATE,
    atual = FALSE
WHERE id_produto IN (SELECT id_produto FROM staging_produtos)
  AND atual = TRUE;

-- 2. Inserir a nova versão "fresca"
INSERT INTO dim_produtos (sk_produto, id_produto, nome, preco, data_inicio, atual)
SELECT 
    nextval('seq_sk_produtos'), -- Gera uma nova Surrogate Key
    id_produto, 
    nome, 
    preco, 
    CURRENT_DATE, 
    TRUE
FROM staging_produtos;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Exemplo simplificado de lógica de aplicação SCD 2</span></span>
<span class="line"><span style="color: #7B7F8B">-- 1. Marcar como expirado o que mudou</span></span>
<span class="line"><span style="color: #F286C4">UPDATE</span><span style="color: #F6F6F4"> dim_produtos</span></span>
<span class="line"><span style="color: #F286C4">SET</span><span style="color: #F6F6F4"> data_fim </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> CURRENT_DATE,</span></span>
<span class="line"><span style="color: #F6F6F4">    atual </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> FALSE</span></span>
<span class="line"><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> id_produto </span><span style="color: #F286C4">IN</span><span style="color: #F6F6F4"> (</span><span style="color: #F286C4">SELECT</span><span style="color: #F6F6F4"> id_produto </span><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> staging_produtos)</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">AND</span><span style="color: #F6F6F4"> atual </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> TRUE;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">-- 2. Inserir a nova versão &quot;fresca&quot;</span></span>
<span class="line"><span style="color: #F286C4">INSERT INTO</span><span style="color: #F6F6F4"> dim_produtos (sk_produto, id_produto, nome, preco, data_inicio, atual)</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F6F6F4">    nextval(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">seq_sk_produtos</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">), </span><span style="color: #7B7F8B">-- Gera uma nova Surrogate Key</span></span>
<span class="line"><span style="color: #F6F6F4">    id_produto, </span></span>
<span class="line"><span style="color: #F6F6F4">    nome, </span></span>
<span class="line"><span style="color: #F6F6F4">    preco, </span></span>
<span class="line"><span style="color: #F6F6F4">    CURRENT_DATE, </span></span>
<span class="line"><span style="color: #F6F6F4">    TRUE</span></span>
<span class="line"><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> staging_produtos;</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading">O impacto no BI (O consumo do dado)</h2>



<p>Para o analista que usa o Power BI ou Tableau, a aplicação prática do SCD Tipo 2 resolve o problema da <strong>Integridade Referencial Histórica</strong>.</p>



<ul class="wp-block-list">
<li><strong>Sem SCD:</strong> Se um produto custava 10 e mudou para 20, todos os gráficos de lucro do ano passado seriam recalculados com o preço de 20, gerando números falsos.</li>



<li><strong>Com SCD:</strong> A tabela Fato de Vendas aponta para a <code>Surrogate Key</code> (SK) que era válida naquele dia. Assim, a venda de ontem usa a SK do preço 10, e a venda de hoje usa a SK do preço 20. <strong>O passado permanece intacto.</strong></li>
</ul>



<p>Na prática, aplicar SCD é gerenciar <strong>Surrogate Keys</strong>. Se você tentar fazer histórico usando apenas o ID original do sistema (Natural Key), você vai falhar, pois o ID 42 não pode aparecer duas vezes na mesma tabela como chave primária. A Surrogate Key (1001, 1002&#8230;) é o que permite que o ID 42 tenha várias vidas.</p>
<p>O post <a href="https://datauniverse.com.br/slowly-changing-dimensions-scd/">Slowly Changing Dimensions (SCD)</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/slowly-changing-dimensions-scd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CRUD (Create, Read, Update e Delete)</title>
		<link>https://datauniverse.com.br/crud-create-read-update-e-delete/</link>
					<comments>https://datauniverse.com.br/crud-create-read-update-e-delete/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Fri, 06 Mar 2026 21:55:13 +0000</pubDate>
				<category><![CDATA[Modelagem de Dados]]></category>
		<category><![CDATA[Curso Fundamentos da Engenharia de Dados]]></category>
		<guid isPermaLink="false">https://datauniverse.com.br/?p=3004</guid>

					<description><![CDATA[<p>Seja em um aplicativo de celular, em um site de e-commerce ou em um complexo ecossistema de Big Data, quase tudo o que você faz com uma informação se resume a quatro ações básicas. Essas ações formam o acrônimo CRUD, que significa Create, Read, Update e Delete (Criar, Ler, Atualizar e Excluir). O CRUD é [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/crud-create-read-update-e-delete/">CRUD (Create, Read, Update e Delete)</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Seja em um aplicativo de celular, em um site de e-commerce ou em um complexo ecossistema de <a href="https://datauniverse.com.br/big-data/">Big Data</a>, quase tudo o que você faz com uma informação se resume a quatro ações básicas. Essas ações formam o acrônimo <mark style="background-color:#fcb900" class="has-inline-color"><strong>CRUD</strong>, que significa <strong>Create, Read, Update e Delete</strong> </mark>(Criar, Ler, Atualizar e Excluir).</p>



<p>O CRUD é o padrão absoluto que define as funções essenciais para o armazenamento persistente de dados em sistemas de software.</p>



<h2 class="wp-block-heading">Entendendo cada letra do CRUD</h2>



<p>Para ilustrar, imagine que você está usando a agenda de contatos do seu smartphone:</p>



<ul class="wp-block-list">
<li><strong>C &#8211; Create (Criar):</strong> É a ação de inserir uma nova informação no sistema.
<ul class="wp-block-list">
<li><em>Exemplo prático:</em> Quando você conhece alguém novo e salva o nome e o número de telefone dessa pessoa na sua agenda.</li>
</ul>
</li>



<li><strong>R &#8211; Read (Ler):</strong> É a ação de consultar, buscar ou recuperar dados que já foram armazenados. É a operação mais executada na maioria dos sistemas.
<ul class="wp-block-list">
<li><em>Exemplo prático:</em> Quando você abre a agenda e pesquisa pelo nome &#8220;João&#8221; para ver qual é o número dele.</li>
</ul>
</li>



<li><strong>U &#8211; Update (Atualizar):</strong> É a ação de modificar um dado que já existe no banco de dados.
<ul class="wp-block-list">
<li><em>Exemplo prático:</em> Quando o João muda de número de telefone e você edita o contato dele na agenda para salvar a informação nova.</li>
</ul>
</li>



<li><strong>D &#8211; Delete (Excluir):</strong> É a ação de remover permanentemente uma informação do sistema.
<ul class="wp-block-list">
<li><em>Exemplo prático:</em> Quando você não fala mais com o João e decide apagar o contato dele do seu celular.</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Como o CRUD se traduz na Tecnologia?</h2>



<p>O conceito de CRUD é universal, mas ele ganha &#8220;nomes&#8221; diferentes dependendo de onde o Engenheiro de Dados ou Desenvolvedor está trabalhando.</p>



<p>A tabela abaixo mostra como essas quatro ações conceituais são traduzidas para a linguagem de Banco de Dados Relacional (<strong>SQL</strong>) e para o padrão de comunicação da web (<strong>APIs REST</strong>):</p>



<figure class="wp-block-table"><table><thead><tr><td><strong>Operação CRUD</strong></td><td><strong>O que faz</strong></td><td><strong>Comando SQL (Bancos de Dados)</strong></td><td><strong>Método HTTP (APIs Web)</strong></td></tr></thead><tbody><tr><td><strong>Create</strong></td><td>Insere novos dados</td><td><code>INSERT</code></td><td><code>POST</code></td></tr><tr><td><strong>Read</strong></td><td>Consulta dados existentes</td><td><code>SELECT</code></td><td><code>GET</code></td></tr><tr><td><strong>Update</strong></td><td>Modifica dados existentes</td><td><code>UPDATE</code></td><td><code>PUT</code> ou <code>PATCH</code></td></tr><tr><td><strong>Delete</strong></td><td>Remove dados</td><td><code>DELETE</code></td><td><code>DELETE</code></td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><strong>C</strong>reate (Criar/Inserir)</h2>



<p>A operação de criação é feita através do comando <code>INSERT</code>. Aqui, passamos o nome da tabela, as colunas que queremos preencher e os respectivos valores.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Inserindo um novo aluno na tabela
INSERT INTO Alunos (nome_aluno, matricula, data_nasc)
VALUES ('Felipe Andrade', '2026105', '2004-08-20');
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Inserindo um novo aluno na tabela</span></span>
<span class="line"><span style="color: #F286C4">INSERT INTO</span><span style="color: #F6F6F4"> Alunos (nome_aluno, matricula, data_nasc)</span></span>
<span class="line"><span style="color: #F286C4">VALUES</span><span style="color: #F6F6F4"> (</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">Felipe Andrade</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">2026105</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">2004-08-20</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading"><strong>R</strong>ead (Ler/Consultar)</h2>



<p>A leitura é a alma do SQL, feita com o comando <code>SELECT</code>. Podemos buscar todos os dados de uma vez ou filtrar por critérios específicos.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Consultar todos os alunos cadastrados
SELECT * FROM Alunos;

-- Consultar apenas o nome de um aluno específico usando a matrícula
SELECT nome_aluno 
FROM Alunos 
WHERE matricula = '2026105';
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Consultar todos os alunos cadastrados</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> Alunos;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">-- Consultar apenas o nome de um aluno específico usando a matrícula</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span><span style="color: #F6F6F4"> nome_aluno </span></span>
<span class="line"><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> Alunos </span></span>
<span class="line"><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> matricula </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">2026105</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading"><strong>U</strong>pdate (Atualizar/Alterar)</h2>



<p>O comando <code>UPDATE</code> modifica registros existentes. <strong>Atenção:</strong> É vital usar a cláusula <code>WHERE</code>; caso contrário, você atualizará todos os alunos da tabela de uma só vez (o pesadelo de todo DBA).</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Alterando a data de nascimento do Felipe
UPDATE Alunos
SET data_nasc = '2004-09-20'
WHERE matricula = '2026105';
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Alterando a data de nascimento do Felipe</span></span>
<span class="line"><span style="color: #F286C4">UPDATE</span><span style="color: #F6F6F4"> Alunos</span></span>
<span class="line"><span style="color: #F286C4">SET</span><span style="color: #F6F6F4"> data_nasc </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">2004-09-20</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> matricula </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">2026105</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading"><strong>D</strong>elete (Excluir/Remover)</h2>



<p>A exclusão é feita com o comando <code>DELETE</code>. Assim como no Update, o uso do <code>WHERE</code> é obrigatório para garantir que você está apagando apenas o registro correto.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Removendo o aluno do sistema através do seu ID único
DELETE FROM Alunos
WHERE id_aluno = 5;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Removendo o aluno do sistema através do seu ID único</span></span>
<span class="line"><span style="color: #F286C4">DELETE</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> Alunos</span></span>
<span class="line"><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> id_aluno </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">5</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span></code></pre></div>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><mark style="background-color:#fcb900" class="has-inline-color">Em ambientes de produção, é comum utilizarmos o <strong>Soft Delete</strong>. Em vez de usar o comando <code>DELETE</code> físico, adicionamos uma coluna chamada <code>ativo</code> (booleano).</mark> Para &#8220;apagar&#8221; o usuário, apenas fazemos um <code>UPDATE Alunos SET ativo = false</code>. Isso mantém o histórico e a integridade dos dados para auditoria futura.</p>
</blockquote>



<h3 class="wp-block-heading">Por que o CRUD é tão importante?</h3>



<p>Entender o CRUD é o primeiro passo para projetar qualquer aplicação. Se você modelou um banco de dados (como vimos nas fases Conceitual, <a href="https://datauniverse.com.br/modelagem-de-dados-conceitual-logica-e-fisica/">Lógica e Física</a>) e o seu sistema não consegue realizar pelo menos o <em>Create</em> e o <em>Read</em>, ele não tem utilidade prática.</p>



<p>Além disso, é através da limitação das operações CRUD que implementamos a segurança e o <strong><a href="https://datauniverse.com.br/rbac-role-based-access-control/">RBAC (Role-Based Access Control)</a></strong>. Por exemplo, um estagiário pode ter permissão apenas de <em>Read</em> em uma tabela financeira, enquanto o gerente tem permissão completa de <em>Create, Read, Update e Delete</em>.</p>
<p>O post <a href="https://datauniverse.com.br/crud-create-read-update-e-delete/">CRUD (Create, Read, Update e Delete)</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/crud-create-read-update-e-delete/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Modelagem de dados Conceitual, Lógica e Física</title>
		<link>https://datauniverse.com.br/modelagem-de-dados-conceitual-logica-e-fisica/</link>
					<comments>https://datauniverse.com.br/modelagem-de-dados-conceitual-logica-e-fisica/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Thu, 05 Mar 2026 19:48:23 +0000</pubDate>
				<category><![CDATA[Modelagem de Dados]]></category>
		<category><![CDATA[Curso Fundamentos da Engenharia de Dados]]></category>
		<guid isPermaLink="false">https://datauniverse.com.br/?p=2998</guid>

					<description><![CDATA[<p>Modelagem de dados é o processo de criação de uma representação visual de todo um sistema de informação ou de partes dele para comunicar conexões entre pontos de dados e estruturas.&#160; O objetivo é ilustrar os tipos de dados utilizados e armazenados no sistema, as relações entre esses tipos de dados, as formas como os [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/modelagem-de-dados-conceitual-logica-e-fisica/">Modelagem de dados Conceitual, Lógica e Física</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Modelagem de dados é o processo de criação de uma representação visual de todo um sistema de informação ou de partes dele para comunicar conexões entre pontos de dados e estruturas.&nbsp;</p>



<p>O objetivo é ilustrar os tipos de dados utilizados e armazenados no sistema, as <strong>relações</strong> entre esses tipos de dados, as formas como os dados podem ser agrupados e organizados e seus formatos e atributos.</p>



<p>Os modelos de dados são construídos em torno das necessidades do negócio. As regras e os requisitos são definidos antecipadamente através do feedback das partes interessadas do negócio, para que possam ser incorporados no design de um novo sistema ou adaptados na iteração de um sistema existente.</p>



<p>Os dados podem ser modelados em vários níveis de abstração. O processo começa com a coleta de informações sobre os requisitos de negócios das partes interessadas e dos usuários finais.</p>



<p>Essas regras de negócios são então traduzidas em estruturas de dados para formular um projeto concreto de banco de dados.&nbsp;</p>



<p>Um modelo de dados pode ser comparado a um roteiro, um projeto de arquiteto ou qualquer diagrama formal que facilite uma compreensão mais profunda do que está sendo projetado.</p>



<p>A modelagem de dados emprega esquemas padronizados e técnicas formais. Isso fornece uma maneira comum, consistente e previsível de definir e gerenciar recursos de dados em uma organização ou mesmo fora dela.</p>



<p><mark style="background-color:#fcb900" class="has-inline-color">Idealmente, os modelos de dados são documentos vivos que evoluem junto com as mudanças nas necessidades de negócios</mark>. Eles desempenham um papel importante no suporte aos processos de negócios e no planejamento da arquitetura e estratégia de TI. </p>



<ol class="wp-block-list">
<li><strong>Modelo Conceitual:</strong>
<ul class="wp-block-list">
<li>Pergunta: O QUÊ?</li>



<li>Visão do Negócio</li>



<li>Sem Detalhes Técnicos</li>



<li>Entidades e Relacionamentos</li>



<li>Atividade: Reuniões com Usuários</li>
</ul>
</li>



<li><strong>Modelo Lógico:</strong>
<ul class="wp-block-list">
<li>Pergunta: COMO?</li>



<li>Estrutura Lógica</li>



<li>Independente de SGBD</li>



<li>Tabelas, Chaves, Atributos</li>



<li>Atividade: Design do Banco</li>
</ul>
</li>



<li><strong>Modelo Físico:</strong>
<ul class="wp-block-list">
<li>Pergunta: IMPLEMENTAÇÃO</li>



<li>Banco de Dados Real</li>



<li>Específico para SGBD</li>



<li>Índices, Constraints, Tipos</li>



<li>Resultado: Banco Pronto para Usar</li>
</ul>
</li>
</ol>



<p><strong>Progressão Lógica:</strong></p>



<ul class="wp-block-list">
<li>Conceitual → Lógico → Físico</li>



<li>Cada nível adiciona mais detalhe técnico</li>



<li>Do abstrato para o concreto</li>
</ul>



<h2 class="wp-block-heading">Primeiro passo: Entendimento do Negócio</h2>



<p>Imagine que você vai construir uma casa. Você não começa comprando cimento e tijolos no primeiro dia. Primeiro, você desenha um esboço com o arquiteto para entender quantos quartos a casa terá (o conceito). Depois, faz uma planta baixa com as medidas e a disposição das portas (a lógica). Por fim, o engenheiro define a espessura da parede, a fiação e o tipo de encanamento (o físico).</p>



<p>Na Engenharia de Software e de Dados, o processo de criar um banco de dados segue exatamente a mesma lógica. A <strong>Modelagem de Dados</strong> é dividida em três fases: <strong>Conceitual, Lógica e Física</strong>.</p>



<p><strong>Atividades:</strong></p>



<ul class="wp-block-list">
<li>Reuniões com stakeholders para entender o modelo de negócio, processos e objetivos da startup.</li>



<li>Análise de documentos e softwares utilizados pela contabilidade.</li>



<li>Levantamento dos requisitos de dados para cada área da empresa (financeiro, fiscal, clientes, etc.).</li>
</ul>



<p><strong>Exemplo:</strong> Identificar quais dados são necessários para registrar transações financeiras, gerar relatórios fiscais, gerenciar clientes e acompanhar indicadores de desempenho.</p>



<figure class="wp-block-image size-large zoooom"><img decoding="async" width="1024" height="535" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-4-1024x535.png" alt="" class="wp-image-2999" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-4-1024x535.png 1024w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-4-300x157.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-4-768x402.png 768w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-4-1536x803.png 1536w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-4-2048x1071.png 2048w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-4-scaled.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Modelagem Conceitual: A Visão de Negócio</h3>



<p>O modelo conceitual é o mais alto nível de abstração. O foco aqui não é a tecnologia, mas sim entender as regras de negócio e como as informações se relacionam no mundo real. É um desenho feito para que gerentes, diretores e analistas de negócio consigam entender o sistema sem precisar saber programação.</p>



<p>Os modelos conceituais geralmente são criados como parte do processo de coleta dos requisitos iniciais do projeto. Normalmente, eles incluem classes de entidade (definindo os tipos de coisas que são importantes para o negócio representar no modelo de dados), suas características e restrições, os relacionamentos entre elas e os requisitos relevantes de segurança e integridade de dados.&nbsp;</p>



<p><strong>Objetivo:</strong> Criar uma representação abstrata das entidades, relacionamentos e atributos dos dados, independente de tecnologia.</p>



<p><strong>Atividades:</strong></p>



<ul class="wp-block-list">
<li>Identificação das entidades principais (Cliente, Conta Bancária, Transação Financeira, Plano de Contas, Nota Fiscal, etc.).</li>



<li>Definição dos atributos de cada entidade (nome, CPF/CNPJ, data, valor, descrição, categoria, etc.).</li>



<li>Estabelecimento dos relacionamentos entre as entidades (um cliente possui várias contas bancárias, uma transação está associada a uma conta e a um plano de contas, etc.).</li>



<li>Criação de um Diagrama Entidade-Relacionamento (DER) para visualizar o modelo conceitual.</li>
</ul>



<p><strong>Exemplo Prático:</strong></p>



<p>Em um sistema de biblioteca escolar:</p>



<ul class="wp-block-list">
<li>Um <code>Aluno</code> <strong>pega emprestado</strong> um <code>Livro</code>.</li>



<li>O modelo conceitual mostrará apenas caixas para &#8220;Aluno&#8221; e &#8220;Livro&#8221;, unidas por uma linha representando o &#8220;Empréstimo&#8221;. Não nos importamos com o CPF do aluno ou o ISBN do livro ainda.</li>
</ul>



<p>Esse modelo oferece uma visão geral do que o sistema conterá, como será organizado e quais regras de negócios estão envolvidas.&nbsp;</p>



<h3 class="wp-block-heading">2. Modelagem Lógica: A Estrutura da Informação</h3>



<p>Esse modelo fornece maiores detalhes sobre os conceitos e relações no domínio em consideração.&nbsp;</p>



<p>Os modelos lógicos não especificam nenhum requisito técnico do sistema. Este estágio é frequentemente omitido em práticas ágeis ou DevOps.&nbsp;</p>



<p>Os modelos lógicos podem ser úteis em ambientes de implementação altamente processuais ou para projetos que são orientados a dados por natureza, como design de Data Warehouse ou desenvolvimento de sistemas de relatórios.</p>



<p><strong>Objetivo:</strong> Transformar o modelo conceitual em um modelo mais detalhado, utilizando estruturas e regras específicas.</p>



<p><strong>Atividades:</strong></p>



<ul class="wp-block-list">
<li>Definição das características detalhadas dos dados (tipo de dado, tamanho, formato, constraints, etc.).</li>



<li>Estabelecimento de regras de negócio (validações, gatilhos, etc.).</li>



<li>Criação de um Modelo Lógico de Dados (MLD) utilizando notações como UML.</li>
</ul>



<p>Uma vez aprovado o conceito, avançamos para o modelo lógico. Aqui, começamos a adicionar detalhes estruturais aos dados, mas ainda sem nos prender a um banco de dados específico (como Oracle, MySQL ou PostgreSQL). Este modelo é geralmente construído por Arquitetos de Dados ou Analistas de Sistemas.</p>



<ul class="wp-block-list">
<li><strong>Objetivo:</strong> Responder <em>como</em> os dados serão estruturados e relacionados.</li>



<li><strong>Elementos adicionados:</strong>
<ul class="wp-block-list">
<li><strong>Atributos:</strong> As características das entidades (ex: Nome, Data de Nascimento, Preço).</li>



<li><strong>Chaves Primárias (PK):</strong> O identificador único de cada registro (ex: ID_Cliente).</li>



<li><strong>Chaves Estrangeiras (FK):</strong> O campo que cria a ligação entre duas tabelas.</li>



<li><strong><a href="https://datauniverse.com.br/normalizacao-vs-desnormalizacao-de-dados/">Normalização</a>:</strong> É aqui que aplicamos as Formas Normais (1FN, 2FN, 3FN) para evitar redundâncias.</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><strong>Exemplo Prático (Tabelas Lógicas):</strong></h3>



<figure class="wp-block-image size-large zoooom"><img decoding="async" width="1024" height="874" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-5-1024x874.png" alt="" class="wp-image-3000" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-5-1024x874.png 1024w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-5-300x256.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-5-768x655.png 768w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-5-1536x1310.png 1536w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-5-2048x1747.png 2048w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-5-scaled.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Tabela: LIVRO</h3>



<figure class="wp-block-table"><table><thead><tr><th>id_livro</th><th>titulo</th><th>isbn</th><th>descricao</th><th>id_autor</th><th>id_categoria</th><th>quantidade_total</th><th>quantidade_disponivel</th><th>data_publicacao</th><th>idioma</th></tr></thead><tbody><tr><td>1</td><td>Dom Casmurro</td><td>978-8535929003</td><td>Romance clássico de Machado de Assis</td><td>1</td><td>1</td><td>5</td><td>3</td><td>1899-01-01</td><td>Português</td></tr><tr><td>2</td><td>1984</td><td>978-0451524935</td><td>Distopia futurista de George Orwell</td><td>2</td><td>2</td><td>4</td><td>2</td><td>1949-06-08</td><td>Inglês</td></tr><tr><td>3</td><td>O Cortiço</td><td>978-8535914689</td><td>Romance naturalista de Aluísio Azevedo</td><td>3</td><td>1</td><td>3</td><td>1</td><td>1890-01-01</td><td>Português</td></tr><tr><td>4</td><td>O Pequeno Príncipe</td><td>978-8525051696</td><td>Fábula infantil de Antoine de Saint-Exupéry</td><td>4</td><td>3</td><td>6</td><td>4</td><td>1943-04-06</td><td>Francês</td></tr><tr><td>5</td><td>Grande Sertão Veredas</td><td>978-8535915853</td><td>Romance épico de Guimarães Rosa</td><td>5</td><td>1</td><td>2</td><td>1</td><td>1956-01-01</td><td>Português</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Tabela: AUTOR</h3>



<figure class="wp-block-table"><table><thead><tr><th>id_autor</th><th>nome</th><th>nacionalidade</th><th>data_nascimento</th><th>biografia</th></tr></thead><tbody><tr><td>1</td><td>Machado de Assis</td><td>Brasileira</td><td>1839-06-21</td><td>Escritor brasileiro, considerado por muitos críticos o maior nome da literatura brasileira</td></tr><tr><td>2</td><td>George Orwell</td><td>Britânica</td><td>1903-06-25</td><td>Escritor inglês conhecido por seus romances distópicos</td></tr><tr><td>3</td><td>Aluísio Azevedo</td><td>Brasileira</td><td>1857-04-14</td><td>Escritor brasileiro pioneiro do naturalismo</td></tr><tr><td>4</td><td>Antoine de Saint-Exupéry</td><td>Francesa</td><td>1900-06-29</td><td>Piloto e escritor francês, autor de O Pequeno Príncipe</td></tr><tr><td>5</td><td>Guimarães Rosa</td><td>Brasileira</td><td>1908-06-27</td><td>Escritor mineiro, um dos maiores modernistas brasileiros</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Tabela: CATEGORIA</h3>



<figure class="wp-block-table"><table><thead><tr><th>id_categoria</th><th>nome</th><th>descricao</th></tr></thead><tbody><tr><td>1</td><td>Romance</td><td>Narrativas de ficção sobre a vida humana e relacionamentos</td></tr><tr><td>2</td><td>Distopia</td><td>Ficção científica que retrata sociedades futuras negativas</td></tr><tr><td>3</td><td>Infantil</td><td>Histórias e fábulas destinadas ao público infantil</td></tr><tr><td>4</td><td>Mistério</td><td>Histórias que envolvem suspense e investigação</td></tr><tr><td>5</td><td>Poesia</td><td>Textos em verso com linguagem lírica e expressiva</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Tabela: MEMBRO</h3>



<figure class="wp-block-table"><table><thead><tr><th>id_membro</th><th>nome</th><th>email</th><th>telefone</th><th>endereco</th><th>data_cadastro</th><th>status</th></tr></thead><tbody><tr><td>1</td><td>João Silva</td><td><a href="mailto:joao.silva@email.com">joao.silva@email.com</a></td><td>(11) 98765-4321</td><td>Rua A, 123 &#8211; São Paulo</td><td>2024-01-15</td><td>Ativo</td></tr><tr><td>2</td><td>Maria Santos</td><td><a href="mailto:maria.santos@email.com">maria.santos@email.com</a></td><td>(11) 99876-5432</td><td>Avenida B, 456 &#8211; São Paulo</td><td>2024-02-20</td><td>Ativo</td></tr><tr><td>3</td><td>Pedro Oliveira</td><td><a href="mailto:pedro.oliveira@email.com">pedro.oliveira@email.com</a></td><td>(11) 97654-3210</td><td>Rua C, 789 &#8211; São Paulo</td><td>2024-03-10</td><td>Ativo</td></tr><tr><td>4</td><td>Ana Costa</td><td><a href="mailto:ana.costa@email.com">ana.costa@email.com</a></td><td>(11) 96543-2109</td><td>Avenida D, 321 &#8211; São Paulo</td><td>2024-01-25</td><td>Inativo</td></tr><tr><td>5</td><td>Carlos Mendes</td><td><a href="mailto:carlos.mendes@email.com">carlos.mendes@email.com</a></td><td>(11) 95432-1098</td><td>Rua E, 654 &#8211; São Paulo</td><td>2024-04-05</td><td>Ativo</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Tabela: EMPRESTIMO</h3>



<figure class="wp-block-table"><table><thead><tr><th>id_emprestimo</th><th>id_membro</th><th>id_livro</th><th>data_emprestimo</th><th>data_devolucao_prevista</th><th>data_devolucao_real</th><th>status</th></tr></thead><tbody><tr><td>1</td><td>1</td><td>1</td><td>2024-05-01</td><td>2024-05-15</td><td>2024-05-14</td><td>Devolvido</td></tr><tr><td>2</td><td>2</td><td>2</td><td>2024-05-03</td><td>2024-05-17</td><td>NULL</td><td>Pendente</td></tr><tr><td>3</td><td>3</td><td>4</td><td>2024-05-05</td><td>2024-05-19</td><td>NULL</td><td>Pendente</td></tr><tr><td>4</td><td>1</td><td>3</td><td>2024-04-20</td><td>2024-05-04</td><td>2024-05-06</td><td>Devolvido com Atraso</td></tr><tr><td>5</td><td>5</td><td>5</td><td>2024-05-02</td><td>2024-05-16</td><td>2024-05-15</td><td>Devolvido</td></tr></tbody></table></figure>



<p><strong>Entidades (Tabelas) e seus Atributos:</strong></p>



<ol class="wp-block-list">
<li><strong>LIVRO:</strong>
<ul class="wp-block-list">
<li>id_livro (Chave Primária)</li>



<li>titulo, isbn (Chave Única)</li>



<li>descricao, data_publicacao</li>



<li>quantidade_total, quantidade_disponível</li>



<li>id_autor (Chave Estrangeira)</li>



<li>id_categoria (Chave Estrangeira)</li>
</ul>
</li>



<li><strong>AUTOR:</strong>
<ul class="wp-block-list">
<li>id_autor (Chave Primária)</li>



<li>nome, nacionalidade</li>



<li>data_nascimento, biografia</li>
</ul>
</li>



<li><strong>CATEGORIA:</strong>
<ul class="wp-block-list">
<li>id_categoria (Chave Primária)</li>



<li>nome, descricao</li>
</ul>
</li>



<li><strong>MEMBRO:</strong>
<ul class="wp-block-list">
<li>id_membro (Chave Primária)</li>



<li>nome, email (Chave Única)</li>



<li>telefone, endereco</li>



<li>data_cadastro, status</li>
</ul>
</li>



<li><strong>EMPRESTIMO:</strong>
<ul class="wp-block-list">
<li>id_emprestimo (Chave Primária)</li>



<li>id_membro (Chave Estrangeira)</li>



<li>id_livro (Chave Estrangeira)</li>



<li>data_emprestimo, data_devolucao_prevista</li>



<li>data_devolucao_real, status</li>
</ul>
</li>
</ol>



<p><strong>Relacionamentos:</strong></p>



<ul class="wp-block-list">
<li>Um LIVRO é escrito por Um AUTOR</li>



<li>Um LIVRO pertence a Uma CATEGORIA</li>



<li>Um LIVRO tem vários EMPRÉSTIMOs</li>



<li>Um MEMBRO realiza vários EMPRÉSTIMOs</li>
</ul>



<p><strong>Legenda</strong></p>



<ul class="wp-block-list">
<li><strong>PK (Primary Key)</strong>: Chave Primária &#8211; Identifica unicamente cada registro</li>



<li><strong>FK (Foreign Key)</strong>: Chave Estrangeira &#8211; Estabelece relacionamento com outra tabela</li>



<li><strong>UK (Unique Key)</strong>: Chave Única &#8211; Campo único que não pode ser duplicado</li>
</ul>



<h3 class="wp-block-heading">3. Modelagem Física: A Implementação Tecnológica</h3>



<p>O modelo físico é a &#8220;mão na massa&#8221;. É aqui que o modelo lógico é traduzido para a linguagem de um Sistema Gerenciador de Banco de Dados (SGBD) específico. O Engenheiro de Dados ou o DBA (Database Administrator) define como os dados serão efetivamente gravados no disco do servidor.</p>



<ul class="wp-block-list">
<li><strong>Objetivo:</strong> Responder <em>como</em> o sistema vai armazenar os dados fisicamente, otimizando o desempenho.</li>



<li><strong>Elementos adicionados:</strong>
<ul class="wp-block-list">
<li><strong>Tipos de Dados (Data Types):</strong> Definir se um campo será <code>VARCHAR(50)</code>, <code>INT</code>, <code>DECIMAL(10,2)</code> ou <code>BOOLEAN</code>.</li>



<li><strong>Índices (Indexes):</strong> Criados para acelerar a busca de dados.</li>



<li><strong>Restrições (Constraints):</strong> Regras do banco, como <code>NOT NULL</code> ou <code>UNIQUE</code>.</li>



<li><strong>Particionamento:</strong> Decisões de arquitetura (como vimos no caso do <a href="https://datauniverse.com.br/sharding-vs-partitioning/">Sharding</a> e Partitioning).</li>
</ul>
</li>
</ul>



<p><strong>Exemplo Prático (Especificação Física):</strong></p>



<p>A tabela de <code>Aluno</code> agora ganha sua definição técnica, pronta para virar código SQL:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Nome da Coluna</strong></td><td><strong>Tipo de Dado (PostgreSQL)</strong></td><td><strong>Restrição (Constraint)</strong></td><td><strong>Descrição</strong></td></tr></thead><tbody><tr><td><code>id_aluno</code></td><td>INTEGER</td><td>PRIMARY KEY, AUTOINCREMENT</td><td>Identificador único numérico</td></tr><tr><td><code>nome_aluno</code></td><td>VARCHAR(100)</td><td>NOT NULL</td><td>Nome completo do aluno</td></tr><tr><td><code>matricula</code></td><td>VARCHAR(20)</td><td>UNIQUE, NOT NULL</td><td>Código de matrícula da escola</td></tr><tr><td><code>data_nasc</code></td><td>DATE</td><td>NULL</td><td>Data de nascimento (formato YYYY-MM-DD)</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Quadro Resumo: Comparando as 3 Fases</h3>



<p>Para facilitar a visualização e servir de material de estudo, aqui está a comparação direta:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Característica</strong></td><td><strong>Modelo Conceitual</strong></td><td><strong>Modelo Lógico</strong></td><td><strong>Modelo Físico</strong></td></tr></thead><tbody><tr><td><strong>Público-Alvo</strong></td><td>Gestores, Analistas de Negócio e Clientes.</td><td>Arquitetos de Dados e Analistas de Sistemas.</td><td>DBAs, Engenheiros de Dados e Desenvolvedores.</td></tr><tr><td><strong>Nível de Detalhe</strong></td><td>Muito baixo (Visão Macro).</td><td>Médio (Visão Estrutural).</td><td>Muito alto (Visão Técnica).</td></tr><tr><td><strong>Dependência de SGBD</strong></td><td>Nenhuma.</td><td>Nenhuma (Agnóstico).</td><td>Total (Depende se é MySQL, Oracle, etc.).</td></tr><tr><td><strong>O que define?</strong></td><td>Entidades e Relacionamentos gerais.</td><td>Atributos, Chaves (PK/FK) e Normalização.</td><td>Tipos de dados, Índices, Views e Constraints.</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Referências Importantes sobre o Tema</h3>



<p>Se você deseja se aprofundar na literatura acadêmica e de mercado que padronizou esses conceitos, recomendo os seguintes pilares da engenharia de dados:</p>



<ol start="1" class="wp-block-list">
<li><strong>Peter Chen (1976):</strong> Criador do Modelo Entidade-Relacionamento (MER), que é a base da modelagem conceitual até hoje. Seu artigo <em>&#8220;The Entity-Relationship Model: Toward a Unified View of Data&#8221;</em> mudou a história da computação.</li>



<li><strong>DAMA-DMBOK (Data Management Body of Knowledge):</strong> O guia oficial da Data Management Association. O capítulo de <em>Data Modeling and Design</em> estabelece os padrões globais da indústria para a criação de modelos lógicos e físicos em empresas de grande porte.</li>



<li><strong>Ralph Kimball e Bill Inmon:</strong> Para modelagem focada em Data Warehouses (OLAP), que utiliza modelagem dimensional (Star Schema/Snowflake), que é uma variação específica após a modelagem relacional clássica.</li>
</ol>
<p>O post <a href="https://datauniverse.com.br/modelagem-de-dados-conceitual-logica-e-fisica/">Modelagem de dados Conceitual, Lógica e Física</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/modelagem-de-dados-conceitual-logica-e-fisica/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Normalização vs. Desnormalização de Dados</title>
		<link>https://datauniverse.com.br/normalizacao-vs-desnormalizacao-de-dados/</link>
					<comments>https://datauniverse.com.br/normalizacao-vs-desnormalizacao-de-dados/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Thu, 05 Mar 2026 19:15:33 +0000</pubDate>
				<category><![CDATA[Modelagem de Dados]]></category>
		<category><![CDATA[Curso Fundamentos da Engenharia de Dados]]></category>
		<guid isPermaLink="false">https://datauniverse.com.br/?p=2987</guid>

					<description><![CDATA[<p>Na engenharia e arquitetura de dados, a forma como você organiza as tabelas de um banco de dados dita o desempenho, a integridade e a escalabilidade do sistema. O grande dilema na hora de criar esse modelo físico geralmente se resume a dois caminhos: Normalização e Desnormalização. Eles não são inimigos, mas sim estratégias opostas [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/normalizacao-vs-desnormalizacao-de-dados/">Normalização vs. Desnormalização de Dados</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Na engenharia e arquitetura de dados, a forma como você organiza as tabelas de um banco de dados dita o desempenho, a integridade e a escalabilidade do sistema. O grande dilema na hora de criar esse modelo físico geralmente se resume a dois caminhos: <strong>Normalização</strong> e <strong>Desnormalização</strong>.</p>



<p>Eles não são inimigos, mas sim estratégias opostas usadas para resolver problemas diferentes. <mark style="background-color:#fcb900" class="has-inline-color">A normalização foca na escrita e integridade (OLTP), enquanto a desnormalização foca na velocidade de leitura (OLAP).</mark></p>



<h2 class="wp-block-heading">O que é Normalização?</h2>



<p>A normalização é o processo de organizar os dados em um banco de dados relacional para <strong>reduzir a redundância</strong> e <strong>melhorar a integridade</strong>. O objetivo é garantir que cada pedaço de informação seja armazenado em apenas um lugar. Quando você precisa atualizar o nome de um cliente, por exemplo, você altera apenas uma linha em uma única tabela, e não em centenas de registros de vendas.</p>



<p>Para atingir esse nível de organização, aplicamos regras progressivas chamadas de <strong>Formas Normais (FN)</strong>.</p>



<p>O processo de normalização aplica uma série de regras sobre as tabelas de um banco de dados para verificar se estas estão corretamente projetadas. </p>



<p>Embora existam cinco formas normais (ou regras de normalização), na prática usamos um conjunto de três Formas Normais, <mark style="background-color:#fcb900" class="has-inline-color">ou seja, um banco de dados é considerado normalizado se nele foram aplicadas as regras destas três formas normais.</mark></p>



<h2 class="wp-block-heading">O que é Desnormalização?</h2>



<p>A desnormalização é o processo intencional de <strong>adicionar redundância</strong> a um banco de dados que já foi normalizado. O objetivo é melhorar a <strong>performance de leitura</strong>.</p>



<p>Em sistemas de Data Warehouse ou Analytics (OLAP), fazer dezenas de <code>JOINs</code> para montar um relatório através de tabelas na 3FN é extremamente lento. A desnormalização &#8220;achata&#8221; essas tabelas, agrupando dados frequentemente consultados em um lugar só.</p>



<ul class="wp-block-list">
<li><strong>Exemplo Prático:</strong> Em vez de fazer um JOIN entre <code>Vendas</code>, <code>Clientes</code>, <code>Cidades</code> e <code>Estados</code> para saber o total vendido em São Paulo, você cria uma tabela desnormalizada gigante (Fato/Dimensão) onde a linha da venda já contém o nome da cidade e do estado, mesmo que isso repita a palavra &#8220;São Paulo&#8221; um milhão de vezes.</li>
</ul>



<figure class="wp-block-image size-large zoooom"><img loading="lazy" decoding="async" width="1024" height="404" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-3-1024x404.png" alt="" class="wp-image-2989" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-3-1024x404.png 1024w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-3-300x118.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-3-768x303.png 768w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-3-1536x605.png 1536w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-3-2048x807.png 2048w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-3-scaled.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">1ª Forma Normal (1FN): Atomicidade</h2>



<p>A regra de ouro aqui é: cada coluna deve conter apenas um valor único e indivisível (atômico), e não pode haver grupos repetidos. Uma entidade estará na primeira forma normal (IFN) se todos os campos forem atômicos (simples) e não multivalorados (com múltiplos valores).</p>



<p><strong>Problema (Não Normalizado):</strong> Uma tabela de livros onde um livro possui vários autores na mesma célula.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Livro</strong></td><td><strong>Titulo</strong></td><td><strong>Autores</strong></td></tr></thead><tbody><tr><td>101</td><td>Engenharia de Dados</td><td>João Silva, Maria Souza</td></tr><tr><td>102</td><td>Redes Neurais</td><td>Carlos Dias</td></tr></tbody></table></figure>



<p><strong>Solução (1FN):</strong> Dividir em múltiplas linhas, garantindo que a coluna <code>Autores</code> tenha apenas um valor por registro.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Livro</strong></td><td><strong>Titulo</strong></td><td><strong>Autor</strong></td></tr></thead><tbody><tr><td>101</td><td>Engenharia de Dados</td><td>João Silva</td></tr><tr><td>101</td><td>Engenharia de Dados</td><td>Maria Souza</td></tr><tr><td>102</td><td>Redes Neurais</td><td>Carlos Dias</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Quais os problemas de uma tabela não normalizada com a 1FN?</h3>



<p>São vários. A primeira forma normal tenta resolver um dos maiores problemas de bancos de dados que é<br>a repetição (redundância de dados) e a desorganização deles.</p>



<p>Imagine um campo telefone que permita a entrada de mais de um valor (dois números de telefones) por exemplo. Como faríamos uma busca em um dos valores apenas? Mesma coisa em um campo endereço onde as partes não estivessem desmembradas, da seguinte forma: </p>



<p><strong>Rua das Oliveiras, 256, Parque Novo Mundo, São Paulo, SP. </strong></p>



<p>Como seria possível fazer uma busca de todos os clientes que morassem no Parque Novo<br>Mundo? Ou na cidade de São Paulo? Ou no estado de SP?</p>



<h3 class="wp-block-heading">Toda tabela precisa obrigatoriamente ser normalizada com a 1FN?</h3>



<p>Não. A normalização é um processo corretivo que deve ser aplicado em casos específicos onde o problema for identificado. Tudo irá depender de como a análise dos dados foi feita. De início você terá muita dificuldade em aplicar as regras de normalização e somente o tempo e o acúmulo de experiência farão esse processo ser natural para você. <mark style="background-color:#fcb900" class="has-inline-color">Um analista experiente aplica a normalização de dados por padrão, pois ele olha para uma tabela e já &#8216;sente&#8217; que tem algo errado ali e aplica a correção para tal.</mark></p>



<h2 class="wp-block-heading">2ª Forma Normal (2FN): Dependência Total</h2>



<p>Para estar na 2FN, a tabela precisa estar na 1FN e todos os atributos não-chave devem depender de <strong>toda</strong> a chave primária (isso se aplica a tabelas com chaves primárias compostas). Uma entidade estará na 2FN se ela já se encontrar na 1FN e todos os atributos não chave forem totalmente dependentes da chave primária.</p>



<ul class="wp-block-list">
<li>Crie tabelas separadas para conjuntos de valores que se aplicam a vários registros.</li>



<li>Relacione essas tabelas com uma chave estrangeira.</li>



<li>Primeiramente, para estar na 2FN é preciso estar também na 1FN.&nbsp;</li>
</ul>



<p>2FN define que os atributos normais, ou seja, os não chave, devem depender unicamente da chave primária da tabela.&nbsp;Assim como as colunas da tabela que não são dependentes dessa chave devem ser removidas da tabela principal e cria-se uma nova tabela utilizando esses dados.</p>



<p><strong>Problema (1FN, mas viola 2FN):</strong> Uma tabela de matrículas onde a chave composta é <code>ID_Aluno</code> + <code>ID_Curso</code>. O <code>Nome_Curso</code> depende apenas do <code>ID_Curso</code>, não do aluno.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Aluno</strong></td><td><strong>ID_Curso</strong></td><td><strong>Nome_Curso</strong></td><td><strong>Semestre_Matricula</strong></td></tr></thead><tbody><tr><td>55</td><td>10</td><td>Banco de Dados</td><td>2026.1</td></tr><tr><td>55</td><td>20</td><td>Programação</td><td>2026.1</td></tr></tbody></table></figure>



<p><strong>Solução (2FN):</strong> Separar as informações específicas do curso em uma nova tabela.</p>



<p><strong>Tabela Matricula:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Aluno</strong></td><td><strong>ID_Curso</strong></td><td><strong>Semestre_Matricula</strong></td></tr></thead><tbody><tr><td>55</td><td>10</td><td>2026.1</td></tr><tr><td>55</td><td>20</td><td>2026.1</td></tr></tbody></table></figure>



<p><strong>Tabela Curso:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Curso</strong></td><td><strong>Nome_Curso</strong></td></tr></thead><tbody><tr><td>10</td><td>Banco de Dados</td></tr><tr><td>20</td><td>Programação</td></tr></tbody></table></figure>



<p>Conforme vimos tanto com a 1FN quanto agora com a 2FN, <mark style="background-color:#fcb900" class="has-inline-color">quando aplicamos a normalização de dados é comum gerar novas tabelas a fim de satisfazer as formas normais que estão sendo aplicadas.</mark> Mais uma vez gostaria de deixar claro que a normalização de dados, apesar das regras serem simples, causa grande dificuldade nos iniciantes da área. Então tenha paciência pois com o tempo irá ganhar experiência e tudo ficará mais fácil.</p>



<h2 class="wp-block-heading">3ª Forma Normal (3FN): Sem Dependências Transitivas</h2>



<p>Para estar na 3FN, a tabela deve estar na 2FN e nenhum atributo não-chave pode depender de outro atributo não-chave. Todos devem depender <strong>apenas</strong> da chave primária.</p>



<ul class="wp-block-list">
<li>Elimine campos que não dependem da chave.</li>



<li>Assim como para estar na 2FN é preciso estar na 1FN, para estar na 3FN é preciso estar também na 2FN.&nbsp;</li>
</ul>



<p>3FN define que todos os atributos dessa tabela devem ser funcionalmente independentes uns dos outros, ao mesmo tempo que devem ser dependentes exclusivamente da chave primária da tabela.&nbsp;</p>



<p>3FN foi projetada para melhorar o desempenho de processamento dos banco de dados e minimizar os custos de armazenamento.&nbsp;</p>



<p><strong>Problema (2FN, mas viola 3FN):</strong> Uma tabela de veículos onde a chave primária é a <code>Placa</code>. O atributo <code>Pais_Origem_Marca</code> depende da <code>Marca</code>, e não diretamente da <code>Placa</code>.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Placa</strong></td><td><strong>Modelo</strong></td><td><strong>Marca</strong></td><td><strong>Pais_Origem_Marca</strong></td></tr></thead><tbody><tr><td>ABC-1234</td><td>Civic</td><td>Honda</td><td>Japão</td></tr><tr><td>XYZ-9876</td><td>Corolla</td><td>Toyota</td><td>Japão</td></tr></tbody></table></figure>



<p><strong>Solução (3FN):</strong> Criar uma tabela separada para as marcas.</p>



<p><strong>Tabela Veiculo:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Placa</strong></td><td><strong>Modelo</strong></td><td><strong>ID_Marca</strong></td></tr></thead><tbody><tr><td>ABC-1234</td><td>Civic</td><td>1</td></tr><tr><td>XYZ-9876</td><td>Corolla</td><td>2</td></tr></tbody></table></figure>



<p><strong>Tabela Marca:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Marca</strong></td><td><strong>Nome_Marca</strong></td><td><strong>Pais_Origem_Marca</strong></td></tr></thead><tbody><tr><td>1</td><td>Honda</td><td>Japão</td></tr><tr><td>2</td><td>Toyota</td><td>Japão</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">3.5 Forma Normal de Boyce-Codd (BCNF)</h2>



<p>Conhecida como &#8220;3.5FN&#8221;, ela é uma versão mais rigorosa da 3FN. A regra dita que <strong>todo determinante deve ser uma chave candidata</strong>. Ela resolve anomalias em tabelas que possuem múltiplas chaves candidatas compostas e sobrepostas.</p>



<p><strong>Problema:</strong> Uma clínica onde a chave primária é (<code>ID_Paciente</code> + <code>Especialidade</code>). Um médico atende apenas uma especialidade. O <code>Nome_Medico</code> determina a <code>Especialidade</code>, criando uma redundância se o médico mudar de especialidade.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Paciente</strong></td><td><strong>Especialidade</strong></td><td><strong>Nome_Medico</strong></td></tr></thead><tbody><tr><td>99</td><td>Cardiologia</td><td>Dr. Marcos</td></tr><tr><td>88</td><td>Cardiologia</td><td>Dr. Marcos</td></tr></tbody></table></figure>



<p><strong>Solução (BCNF):</strong> Separar a relação do paciente com o médico, e do médico com a especialidade.</p>



<p><strong>Tabela Consulta:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Paciente</strong></td><td><strong>ID_Medico</strong></td></tr></thead><tbody><tr><td>99</td><td>500</td></tr><tr><td>88</td><td>500</td></tr></tbody></table></figure>



<p><strong>Tabela Medico_Especialidade:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Medico</strong></td><td><strong>Nome_Medico</strong></td><td><strong>Especialidade</strong></td></tr></thead><tbody><tr><td>500</td><td>Dr. Marcos</td><td>Cardiologia</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">4ª Forma Normal (4FN): Dependências Multivaloradas Independentes</h2>



<p>Para estar na 4FN, a tabela deve estar na BCNF e não pode conter mais de uma dependência multivalorada independente.</p>



<p><strong>Problema:</strong> Um programador tem várias &#8220;Linguagens&#8221; (Python, Java) e possui várias &#8220;Certificações&#8221; (AWS, Azure). Colocar tudo na mesma tabela cria uma multiplicação (produto cartesiano) de registros desnecessários.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Programador</strong></td><td><strong>Linguagem</strong></td><td><strong>Certificacao</strong></td></tr></thead><tbody><tr><td>1</td><td>Python</td><td>AWS</td></tr><tr><td>1</td><td>Python</td><td>Azure</td></tr><tr><td>1</td><td>Java</td><td>AWS</td></tr><tr><td>1</td><td>Java</td><td>Azure</td></tr></tbody></table></figure>



<p><strong>Solução (4FN):</strong> Criar duas tabelas distintas para separar as dependências que não têm relação entre si.</p>



<p><strong>Tabela Programador_Linguagem:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Programador</strong></td><td><strong>Linguagem</strong></td></tr></thead><tbody><tr><td>1</td><td>Python</td></tr><tr><td>1</td><td>Java</td></tr></tbody></table></figure>



<p><strong>Tabela Programador_Certificacao:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>ID_Programador</strong></td><td><strong>Certificacao</strong></td></tr></thead><tbody><tr><td>1</td><td>AWS</td></tr><tr><td>1</td><td>Azure</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">5ª Forma Normal (5FN): Dependência de Junção</h2>



<p>É extremamente rara na prática. Diz que uma tabela está na 5FN se ela não puder ser dividida em tabelas menores sem perder informações ao tentar juntá-las (JOIN) novamente. Trata de relações ternárias (três variáveis conectadas) que causam anomalias se agrupadas.</p>



<p><strong>Problema:</strong> Uma relação complexa onde um <strong>Vendedor</strong> vende produtos de uma <strong>Marca</strong> que pertence a uma <strong>Categoria</strong>. Se juntarmos tudo, podemos inferir erroneamente que um vendedor vende uma categoria de uma marca específica que ele, na verdade, não tem autorização para vender.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Vendedor</strong></td><td><strong>Marca</strong></td><td><strong>Categoria</strong></td></tr></thead><tbody><tr><td>Roberto</td><td>Samsung</td><td>Smartphones</td></tr><tr><td>Roberto</td><td>Samsung</td><td>TVs</td></tr></tbody></table></figure>



<p><strong>Solução (5FN):</strong> Dividir a relação ternária em três tabelas binárias (relação de dois em dois).</p>



<p><strong>Tabela Vendedor_Marca:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Vendedor</strong></td><td><strong>Marca</strong></td></tr></thead><tbody><tr><td>Roberto</td><td>Samsung</td></tr></tbody></table></figure>



<p><strong>Tabela Vendedor_Categoria:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Vendedor</strong></td><td><strong>Categoria</strong></td></tr></thead><tbody><tr><td>Roberto</td><td>Smartphones</td></tr><tr><td>Roberto</td><td>TVs</td></tr></tbody></table></figure>



<p><strong>Tabela Marca_Categoria:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Marca</strong></td><td><strong>Categoria</strong></td></tr></thead><tbody><tr><td>Samsung</td><td>Smartphones</td></tr><tr><td>Samsung</td><td>TVs</td></tr></tbody></table></figure>
<p>O post <a href="https://datauniverse.com.br/normalizacao-vs-desnormalizacao-de-dados/">Normalização vs. Desnormalização de Dados</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/normalizacao-vs-desnormalizacao-de-dados/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
