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 05 — LEVANTANDO AS PAREDES

Bem-vindo à quinta semana (4 aulas) do curso de Banco de Dados. Hoje vamos abrir o terminal e "levantar as paredes" do nosso sistema usando a DDL (Data Definition Language). No mercado, um script DDL bem escrito é a fundação de qualquer software de sucesso. 🛡️🧩


🎯 Objetivo da Aula

Ao final desta semana, você será capaz de:

  • Criar bancos de dados reais no MySQL e PostgreSQL.
  • Implementar tabelas usando o comando CREATE TABLE.
  • Configurar restrições de integridade (PK, FK, NOT NULL, UNIQUE, CHECK).
  • Dominar a Ordem de Criação dos objetos.

🏢 O Cenário Prático (Seu Desafio)

A TecProExpress precisa que você execute o script oficial de criação do banco. O CTO exige que o script seja "limpo" e que as chaves estrangeiras tenham nomes padronizados (ex: fk_pedido_cliente).

📊 Hierarquia de Criação (O que vem primeiro?)

Para evitar erros de "tabela não encontrada", siga esta ordem lógica:

graph TD
    A["1. Tabelas Independentes (Pais)"] --> B["2. Tabelas Dependentes (Filhos)"]
    B --> C["3. Tabelas Associativas (Netos)"]
    
    subgraph Exemplos
    E1[CLIENTE] --- E2[PRODUTO]
    E3[PEDIDO] --- E4[ITEM_PEDIDO]
    end
    
    E1 --> E3
    E2 --> E4
    E3 --> E4
    
    style A fill:#e8f5e9
    style C fill:#fffde7

🧠 Fundamentos: A Teoria Traduzida

DDL é a engenharia civil dos dados.

ComandoFunçãoAnalogia
CREATECria objetosConstruir a casa
ALTERModifica objetosFazer uma reforma
DROPDeleta objetosDemolir a estrutura

📖 Exemplo Guiado: Criando a Tabela Produto

Veja como definir tipos de dados e restrições no PostgreSQL (SGBD Foco) e no MySQL (Comparação).

🐬 Iniciando o Banco de Dados

Antes de criar qualquer tabela, é mandatório criar o container lógico (Banco de Dados) e dizer ao SGBD qual banco utilizar:

-- Executar no Console de Query (pgAdmin/DBeaver/Workbench)
CREATE DATABASE tecpro_express;

No pgAdmin (PostgreSQL), após criar o banco, você deve clicar com o botão direito no banco tecpro_express na árvore de navegação esquerda e selecionar Query Tool para garantir que as tabelas sejam criadas dentro dele. No MySQL Workbench/DBeaver, use o comando:

USE tecpro_express;

🛠️ Código do Exemplo (Equivalência Relacional)

```sql
-- 🐘 Padrão PostgreSQL (pgAdmin)
CREATE TABLE produto (
    id SERIAL PRIMARY KEY,               -- SERIAL gera inteiros sequenciais automáticos
    nome VARCHAR(100) NOT NULL,          -- Texto obrigatório
    preco DECIMAL(10,2) CHECK (preco > 0) -- Validação de integridade física
);
-- 🐬 Padrão MySQL (Workbench)
CREATE TABLE produto (
    id INT PRIMARY KEY AUTO_INCREMENT,   -- AUTO_INCREMENT gera inteiros sequenciais
    nome VARCHAR(100) NOT NULL,
    preco DECIMAL(10,2) CHECK (preco > 0)
);

#### 🔍 Detalhamento do Código:
*   `SERIAL` vs `AUTO_INCREMENT`: Ambas as cláusulas servem para gerar números sequenciais únicos automáticos (Chaves Primárias Surrogadas). O PostgreSQL usa o tipo virtual `SERIAL`, enquanto o MySQL usa o modificador `AUTO_INCREMENT` no tipo `INT`.
*   `DECIMAL(10,2)`: Ideal para armazenar valores monetários (10 dígitos totais de precisão, sendo 2 após a vírgula).
*   `CHECK`: Restrição física de coluna que impede que a **TecProExpress** registre preços menores ou iguais a zero.

---

## 🛠️ Prática Obrigatória 1: Script de Infraestrutura
**Cenário:** Criação das tabelas `CLIENTE` e `PEDIDO`.

1.  A tabela `CLIENTE` deve ter um ID auto-incremental e um CPF único.
2.  A tabela `PEDIDO` deve ter uma FK apontando para `CLIENTE`.

### 🏁 Resultado Esperado (Seed Visual)
Ao rodar `DESCRIBE pedido;` no seu banco, você deverá ver:
*   `id_cliente` marcado como **MUL** (Multiple) ou **FK**.

---

## 🛠️ Prática Obrigatória 2: O Elo Perdido (Associativa)
**Cenário:** Implementação da tabela `ITEM_PEDIDO`.

1.  Esta tabela deve conectar `PEDIDO` e `PRODUTO` (Tabela Associativa N:M).
2.  Adicione a coluna `quantidade` com valor padrão **1**.
3.  Implemente a **Chave Primária Composta** formada pelas duas chaves estrangeiras.

### 🏁 Resultado Esperado (Script SQL Correto)
```sql
CREATE TABLE item_pedido (
    id_pedido INT,
    id_produto INT,
    quantidade INT DEFAULT 1,
    PRIMARY KEY (id_pedido, id_produto),
    CONSTRAINT fk_item_pedido_ped FOREIGN KEY (id_pedido) REFERENCES pedido(id),
    CONSTRAINT fk_item_pedido_prod FOREIGN KEY (id_produto) REFERENCES produto(id)
);

📤 Instruções de Entrega (Microsoft Teams)

Após testar os comandos e confirmar a criação bem-sucedida das tabelas no pgAdmin (ou SGBD de sua preferência):

  1. Organize as instruções em ordem cronológica de criação (pais antes dos filhos).
  2. Salve as instruções SQL em um único arquivo de texto com a extensão .sql contendo CREATE DATABASE no início.
  3. Envie o arquivo (Atividade_05_SeuNome.sql) na tarefa correspondente no Microsoft Teams para avaliação de sintaxe e restrições.

💡 Checkpoint de Lógica

[!IMPORTANT] Reflexão Profissional: O que acontece se você tentar deletar um CLIENTE que já tem PEDIDOS cadastrados? O banco impedirá a exclusão para proteger a Integridade Referencial. Isso é segurança de dados na prática! 🧠🛡️


🔥 Desafio de Fixação (Opcional)

Nível: Arquiteto 🏆

Pesquise a diferença entre INT, BIGINT e SERIAL. Qual deles você usaria para um sistema que processa 1 bilhão de entregas por mês?


🔑 Gabarito de Código/Fórmulas Completo

🐘 Gabarito Oficial PostgreSQL (pgAdmin)

-- 1. Criar Banco de Dados
CREATE DATABASE tecpro_express;
-- (Nota: No pgAdmin, lembre-se de abrir uma Query Tool apontando para o banco tecpro_express após criá-lo)

-- 2. Criar Tabelas Pais
CREATE TABLE cliente (
    id SERIAL PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    cpf CHAR(11) UNIQUE
);

CREATE TABLE produto (
    id SERIAL PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    preco DECIMAL(10,2) CHECK (preco > 0)
);

-- 3. Criar Tabela Dependente (Filho)
CREATE TABLE pedido (
    id SERIAL PRIMARY KEY,
    data_ped DATE,
    id_cliente INT,
    CONSTRAINT fk_ped_cli FOREIGN KEY (id_cliente) REFERENCES cliente(id)
);

-- 4. Criar Tabela Associativa (Neto)
CREATE TABLE item_pedido (
    id_pedido INT,
    id_produto INT,
    quantidade INT DEFAULT 1,
    PRIMARY KEY (id_pedido, id_produto),
    CONSTRAINT fk_item_ped FOREIGN KEY (id_pedido) REFERENCES pedido(id),
    CONSTRAINT fk_item_prod FOREIGN KEY (id_produto) REFERENCES produto(id)
);

🐬 Gabarito Alternativo MySQL (DBeaver / Workbench)

-- 1. Criar e Usar Banco
CREATE DATABASE tecpro_express;
USE tecpro_express;

-- 2. Criar Tabelas Pais
CREATE TABLE cliente (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100) NOT NULL,
    cpf CHAR(11) UNIQUE
);

CREATE TABLE produto (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100) NOT NULL,
    preco DECIMAL(10,2) CHECK (preco > 0)
);

-- 3. Criar Tabela Dependente
CREATE TABLE pedido (
    id INT PRIMARY KEY AUTO_INCREMENT,
    data_ped DATE,
    id_cliente INT,
    CONSTRAINT fk_ped_cli FOREIGN KEY (id_cliente) REFERENCES cliente(id)
);

-- 4. Criar Tabela Associativa
CREATE TABLE item_pedido (
    id_pedido INT,
    id_produto INT,
    quantidade INT DEFAULT 1,
    PRIMARY KEY (id_pedido, id_produto),
    CONSTRAINT fk_item_ped FOREIGN KEY (id_pedido) REFERENCES pedido(id),
    CONSTRAINT fk_item_prod FOREIGN KEY (id_produto) REFERENCES produto(id)
);

🔍 Explicação do Gabarito:

  • Ordem de Criação: Os bancos de dados exigem que tabelas sem Foreign Keys (cliente, produto) sejam criadas primeiro, antes das tabelas que fazem referência a elas (pedido, item_pedido). Caso contrário, ocorrerá erro de referência.
  • UNIQUE: Garante a integridade lógica (ex: impossibilita que dois clientes compartilhem o mesmo CPF).
  • CONSTRAINT: Dar nomes explícitos às chaves estrangeiras (ex: fk_ped_cli) facilita diagnósticos de erros e remoção de restrições em updates de produção.