Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🎯 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_PedClienteEnderecoProdutosValor_Un
1001João SilvaRua A, 10Pneus, Óleo400.00, 50.00
1002Maria SouzaRua B, 20Filtro Ar80.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_PedProduto
1001Pneus
1001Óleo

🛠️ Prática Obrigatória 1: Diagnóstico de Anomalias

Cenário: Analise a PLANILHA_MESTRA da TecProExpress.

  1. Aponte 2 anomalias que ocorrem se deletarmos o pedido 1002.
  2. 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.

  1. Crie tabelas separadas para: CLIENTE, PEDIDO, PRODUTO e ITEM_PEDIDO.
  2. Mova o Endereco para a tabela CLIENTE.
  3. Mova o Valor_Un para a tabela PRODUTO.

🏁 Resultado Esperado (Seed das Tabelas Normalizadas)

Tabela CLIENTE:

idnomeendereco
1João SilvaRua A, 10

Tabela ITEM_PEDIDO:

id_pedid_prodqtd
100150 (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:

  1. Exporte a imagem do diagrama conceitual/lógico normalizado no formato .png.
  2. Salve o arquivo fonte do draw.io no formato .drawio.
  3. Caso tenha escrito scripts SQL adicionais para testes, você pode anexá-los.
  4. Envie ambos os arquivos (Atividade_04_SeuNome.drawio e Atividade_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.