🎯 ATIVIDADE 04 — A ARTE DA ORGANIZAÇÃO
Bem-vindo à quarta semana (4 aulas) do curso de Banco de Dados. Até aqui, você aprendeu a modelar o mundo real. Mas, às vezes, nossa modelagem inicial contém "armadilhas" — dados repetidos que causam erros. Hoje, vamos aprender a técnica de Normalização, o processo de refinamento que separa o bom design do amadorismo. 🛡️🧩
🎯 Objetivo da Aula
Ao final desta semana, você será capaz de:
- Identificar e corrigir Anomalias de Inserção, Exclusão e Alteração.
- Aplicar a 1ª Forma Normal (1FN): Atomicidade.
- Aplicar a 2ª Forma Normal (2FN): Dependência Total.
- Aplicar a 3ª Forma Normal (3FN): Dependência Transitiva.
🏢 O Cenário Prático (Seu Desafio)
A TecProExpress herdou um banco de dados de uma empresa adquirida. Os dados estão em uma única tabela chamada PLANILHA_MESTRA. Quando um cliente muda de endereço, o sistema precisa atualizar centenas de linhas, gerando inconsistências.
📋 Seed: A Planilha "Bagunçada" (Não Normalizada)
| Cod_Ped | Cliente | Endereco | Produtos | Valor_Un |
|---|---|---|---|---|
| 1001 | João Silva | Rua A, 10 | Pneus, Óleo | 400.00, 50.00 |
| 1002 | Maria Souza | Rua B, 20 | Filtro Ar | 80.00 |
🧠 Fundamentos: A Teoria Traduzida
Normalizar é como organizar uma biblioteca por categorias, autores e títulos, em vez de empilhar tudo na entrada.
O Fluxo da Organização
Veja como os dados "evoluem" durante a normalização:
flowchart TD
subgraph Erro ["Estado Crítico"]
A["Tabela Única (Caos)"]
end
subgraph FN1 ["1ª Forma Normal"]
B["Valores Atômicos (Sem listas)"]
end
subgraph FN2 ["2ª Forma Normal"]
C["Chaves Primárias Definidas"]
end
subgraph FN3 ["3ª Forma Normal"]
D["Tabelas Independentes (Padrão Indústria)"]
end
A -->|Dividir listas| B
B -->|Mover campos parciais| C
C -->|Mover campos indiretos| D
style A fill:#ffcdd2
style D fill:#c8e6c9
📖 Exemplo Guiado: Aplicando a 1FN
Problema: A coluna Produtos tem "Pneus, Óleo". O banco de dados não consegue somar o estoque assim.
Solução: Cada produto deve ter sua própria linha.
| Cod_Ped | Produto |
|---|---|
| 1001 | Pneus |
| 1001 | Óleo |
🛠️ Prática Obrigatória 1: Diagnóstico de Anomalias
Cenário: Analise a PLANILHA_MESTRA da TecProExpress.
- Aponte 2 anomalias que ocorrem se deletarmos o pedido 1002.
- Explique por que o endereço do cliente não deve ficar na tabela de pedidos.
🏁 Resultado Esperado (Para sua Referência)
- Anomalia de Exclusão: Ao deletar o pedido, perdemos os dados de contato da Maria Souza.
- Redundância: O endereço se repete em cada pedido do mesmo cliente.
🛠️ Prática Obrigatória 2: O Esquema 3FN
Cenário: Projete o banco normalizado no draw.io.
- Crie tabelas separadas para:
CLIENTE,PEDIDO,PRODUTOeITEM_PEDIDO. - Mova o
Enderecopara a tabelaCLIENTE. - Mova o
Valor_Unpara a tabelaPRODUTO.
🏁 Resultado Esperado (Seed das Tabelas Normalizadas)
Tabela CLIENTE:
| id | nome | endereco |
|---|---|---|
| 1 | João Silva | Rua A, 10 |
Tabela ITEM_PEDIDO:
| id_ped | id_prod | qtd |
|---|---|---|
| 1001 | 50 (Pneu) | 2 |
🔍 Detalhamento Técnico:
- Atomicidade: Agora cada célula tem apenas um valor.
- Relacionamento: Usamos IDs (FKs) para conectar as tabelas sem repetir nomes ou endereços.
📤 Instruções de Entrega (Microsoft Teams)
Após projetar seu banco de dados normalizado na 3ª Forma Normal:
- Exporte a imagem do diagrama conceitual/lógico normalizado no formato
.png. - Salve o arquivo fonte do draw.io no formato
.drawio. - Caso tenha escrito scripts SQL adicionais para testes, você pode anexá-los.
- Envie ambos os arquivos (
Atividade_04_SeuNome.drawioeAtividade_04_SeuNome.png) na tarefa correspondente no Microsoft Teams para validação de integridade física.
💡 Checkpoint de Lógica
[!IMPORTANT] Reflexão Profissional: Um banco normalizado economiza espaço em disco, mas exige mais "JOINS" nas consultas. Na TecProExpress, a prioridade é a Integridade dos Dados. 🧠🛡️
🔥 Desafio de Fixação (Opcional)
Nível: Expert 🏆
Onde você armazenaria o Preço de Venda? Na tabela PRODUTO ou na tabela ITEM_PEDIDO? (Dica: Pense no que acontece se o preço do produto mudar amanhã).
🔑 Gabarito de Código/Fórmulas Completo
Mapeamento 3FN Final:
CLIENTE (id PK, nome, endereco)PRODUTO (id PK, descricao, valor_unitario)PEDIDO (id PK, data, id_cliente FK)ITEM_PEDIDO (id_pedido FK, id_produto FK, quantidade, valor_historia)
SQL de Criação (Gabarito):
CREATE TABLE cliente (
id INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(100),
endereco VARCHAR(200)
);
CREATE TABLE item_pedido (
id_pedido INT,
id_produto INT,
quantidade INT,
PRIMARY KEY (id_pedido, id_produto),
FOREIGN KEY (id_pedido) REFERENCES pedido(id),
FOREIGN KEY (id_produto) REFERENCES produto(id)
);
🔍 Explicação do Gabarito:
- PRIMARY KEY (id_pedido, id_produto): Garante que um produto não seja inserido duas vezes no mesmo pedido.
- valor_historia: Armazena o preço cobrado no dia, garantindo que relatórios antigos não mudem de valor se o produto encarecer hoje.