🎯 ATIVIDADE 03 — DO DESENHO À GRADE
Para realizar este laboratório com sucesso, certifique-se de ter compreendido os conceitos apresentados no:
👉 CAPÍTULO 03: TRANSAÇÕES ACID E ECOSSISTEMA CLOUD
Bem-vindo à terceira semana (4 aulas) do curso de Banco de Dados. Agora que você já sabe "desenhar" as necessidades do cliente (Modelo Conceitual), vamos aprender a traduzir esse desenho para a linguagem que os computadores entendem: o Modelo Lógico (Relacional) e a matemática que rege tudo isso, a Álgebra Relacional. 🛡️🧩
🎯 Objetivos de Aprendizagem do Laboratório
Ao final deste laboratório prático (estimativa: 4 horas presenciais / autoguiadas), você será capaz de:
- Mapear Entidades e Relacionamentos para Tabelas e Colunas.
- Implementar a Integridade Referencial através de Chaves Estrangeiras (FK).
- Executar operações de Seleção, Projeção e Junção usando Álgebra Relacional.
- Criar diagramas lógicos profissionais no draw.io.
🏢 O Cenário Prático (Seu Desafio)
A TecProExpress aprovou seu MER (Atividade 02). Agora, a equipe de desenvolvimento precisa que você entregue o Esquema Lógico. Eles precisam saber exatamente quais colunas cada tabela terá e como elas se conectam via IDs.
Além disso, o time de BI (Business Intelligence) solicitou que você descreva, de forma lógica, como extrair relatórios específicos (Ex: "Quais entregadores estão usando veículos do tipo 'Caminhão'?").
🧠 Fundamentos: A Teoria Traduzida
O mapeamento é a ponte entre o abstrato e o concreto.
1. A Anatomia do Mapeamento
Mapear é transformar "caixas" em "tabelas". Veja a regra visual:
graph LR
subgraph Conceitual ["Nível Conceitual (MER)"]
A["Entidade: CLIENTE"] --- B(("Atributo: Nome"))
end
Conceitual -->|Mapeamento| Logico
subgraph Logico ["Nível Lógico (Tabelas)"]
C["Tabela: cliente"]
C --- D["Coluna: nome (VARCHAR)"]
end
style Conceitual fill:#e3f2fd,stroke:#1e88e5
style Logico fill:#f1f8e9,stroke:#558b2f
2. Álgebra Relacional: Os Três Pilares
O banco de dados não "procura" dados; ele realiza operações matemáticas sobre conjuntos.
| Operação | Símbolo | Função Visual | Analogia |
|---|---|---|---|
| Seleção | σ | Filtra Linhas | Um filtro de busca por preço |
| Projeção | π | Filtra Colunas | Escolher quais campos exibir |
| Junção | ⋈ | Combina Tabelas | Cruzar dados de duas planilhas |
flowchart TD
subgraph Sigma ["σ Seleção (Horizontal)"]
S1[Linha 1] --- S2[Linha 2] --- S3[Linha 3]
end
subgraph Pi ["π Projeção (Vertical)"]
P1[Coluna A]
P2[Coluna B]
end
Sigma -.->|Filtra| R1[Resultado]
Pi -.->|Escolhe| R1
📖 Exemplo Guiado: Mapeando 1:N
No cenário da TecProExpress:
- Entidade: ENTREGADOR (1)
- Entidade: VEÍCULO (N) - Assumindo que um entregador pode usar vários veículos.
🏁 Resultado Esperado (Modelo Lógico)
ENTREGADOR (id PK, nome, cpf UNIQUE, telefone)VEICULO (id PK, placa UNIQUE, modelo, ano, id_entregador FK)
🔍 Detalhamento do Mapeamento:
- PK (Primary Key): Identificador único sequencial (geralmente numérico auto-incremental).
- FK (Foreign Key): A PK do "lado 1" (Entregador) que viaja para o "lado N" (Veículo) como
id_entregador. - UNIQUE: Restrição que impede duplicidade (ex: não podem existir dois entregadores com o mesmo CPF ou duas placas iguais).
- Integridade: Garante que não exista um veículo sem um entregador responsável.
🛠️ Prática Obrigatória 1: Mapeamento Logístico
Cenário: Transformação do MER da TecProExpress para o Modelo Lógico.
- Com base no cenário da Atividade 02, escreva o esquema lógico das tabelas: CLIENTE, PEDIDO, PRODUTO e ENTREGADOR.
- Indique claramente quais são as Primary Keys (PK) e as Foreign Keys (FK).
🏁 Resultado Esperado (Para sua Referência)
CLIENTE (id PK, nome, cpf UNIQUE, endereco)
PEDIDO (id PK, data, id_cliente FK)
PRODUTO (id PK, sku UNIQUE, nome, preco)
🔍 Detalhamento das Decisões:
- CLIENTE: Adotamos
idcomo PK numérica para otimização do banco, mantendo ocpfcomo colunaUNIQUE(regra de negócio). - PEDIDO: Recebe
id_clientecomo FK para conectar com o cliente associado. - PRODUTO: Usa
idcomo PK, mantendo o SKU como chave única secundária para fins de código de barras industrial.
💻 Simulador de Álgebra Relacional em Python
Para inspecionar as operações de Seleção ($\sigma$), Projeção ($\pi$) e Junção ($\bowtie$) no terminal:
# simulador_algebra.py
entregadores = [
{"cpf": "111", "nome": "Ana Silva", "veiculo_id": 10},
{"cpf": "222", "nome": "João Souza", "veiculo_id": 20},
{"cpf": "333", "nome": "Bia Costa", "veiculo_id": 10}
]
veiculos = [
{"id": 10, "tipo": "Caminhão", "modelo": "Mercedes 710"},
{"id": 20, "tipo": "Moto", "modelo": "Honda Cargo"}
]
print("=" * 65)
print("🧮 MOTOR DE ÁLGEBRA RELACIONAL (σ, π, ⋈) - TECPROEXPRESS")
print("=" * 65)
# 1. Junção Natural (⋈): Entregador ⋈ Veículo
join_result = []
for e in entregadores:
for v in veiculos:
if e["veiculo_id"] == v["id"]:
join_result.append({**e, **v})
# 2. Seleção (σ): tipo = 'Caminhão'
caminhoneiros = [r for r in join_result if r["tipo"] == "Caminhão"]
# 3. Projeção (π): nome, modelo
projecao = [{"nome": r["nome"], "modelo": r["modelo"]} for r in caminhoneiros]
print(f"📊 Resultado: π_nome,modelo (σ_tipo='Caminhão' (Entregador ⋈ Veículo)):")
for linha in projecao:
print(f" • Motorista: {linha['nome']:<12} | Veículo: {linha['modelo']}")
print("=" * 65)
🖥️ Saída Esperada no Terminal:
=================================================================
🧮 MOTOR DE ÁLGEBRA RELACIONAL (σ, π, ⋈) - TECPROEXPRESS
=================================================================
📊 Resultado: π_nome,modelo (σ_tipo='Caminhão' (Entregador ⋈ Veículo)):
• Motorista: Ana Silva | Veículo: Mercedes 710
• Motorista: Bia Costa | Veículo: Mercedes 710
=================================================================
🌐 Exemplo de Payload JSON para Filtro Algébrico (Swagger /docs)
{
"operacao": "SELECAO_E_JUNCAO",
"tabela_origem": "entregador",
"tabela_join": "veiculo",
"chave_estrangeira": "veiculo_id",
"filtro_sigma": {"veiculo.tipo": "Caminhão"},
"projecao_pi": ["entregador.nome", "veiculo.modelo"]
}
🛠️ Prática Obrigatória 2: Laboratório de Álgebra
Cenário: Extração de lógica para relatórios usando as tabelas abaixo (Seeds).
📋 Seed: Tabela ENTREGADOR
| cpf | nome | veiculo_id |
|---|---|---|
| 111 | Ana Silva | 10 |
| 222 | João Souza | 20 |
| 333 | Bia Costa | 10 |
📋 Seed: Tabela VEICULO
| id | tipo | modelo |
|---|---|---|
| 10 | Caminhão | Mercedes 710 |
| 20 | Moto | Honda Cargo |
🚀 Script de Seed (SQL)
-- PASSO 1: Criar as Tabelas (Estrutura)
CREATE TABLE veiculo (
id INT PRIMARY KEY,
tipo VARCHAR(50),
modelo VARCHAR(100)
);
CREATE TABLE entregador (
cpf VARCHAR(11) PRIMARY KEY,
nome VARCHAR(100),
veiculo_id INT,
FOREIGN KEY (veiculo_id) REFERENCES veiculo(id)
);
-- PASSO 2: Popular as Tabelas (Dados)
INSERT INTO veiculo (id, tipo, modelo) VALUES (10, 'Caminhão', 'Mercedes 710');
INSERT INTO veiculo (id, tipo, modelo) VALUES (20, 'Moto', 'Honda Cargo');
INSERT INTO entregador (cpf, nome, veiculo_id) VALUES ('111', 'Ana Silva', 10);
INSERT INTO entregador (cpf, nome, veiculo_id) VALUES ('222', 'João Souza', 20);
INSERT INTO entregador (cpf, nome, veiculo_id) VALUES ('333', 'Bia Costa', 10);
🔍 Detalhamento do Seed:
- Ordem: Inserimos primeiro o
VEICULOporque oENTREGADORdepende dele (FK). - Vínculo: Note que o
veiculo_id10 é compartilhado por Ana e Bia.
📤 Instruções de Entrega (Microsoft Teams)
Após finalizar o mapeamento e as fórmulas matemáticas:
- Digite a sua resposta contendo o mapeamento lógico e as fórmulas equivalentes da Álgebra Relacional (pode ser em formato texto no Word/Markdown ou PDF).
- Salve o arquivo com a nomenclatura
Atividade_03_SeuNome.pdfouAtividade_03_SeuNome.md. - Envie a resposta na plataforma correspondente do Microsoft Teams para avaliação técnica. (Esta atividade é conceitual e foca na matemática relacional, sem necessidade de código
.sqlexecutável).
💡 Checkpoint de Lógica
Reflexão Profissional: Imagine que você tem 1 milhão de clientes. É mais eficiente fazer a Seleção (σ) antes ou depois da Junção (⋈)? Na indústria, filtrar os dados antes de cruzar tabelas economiza processamento e tempo. 🧠🛡️
🔥 Desafio de Fixação (Opcional)
Nível: Expert 🏆
O relacionamento entre PEDIDO e PRODUTO é Muitos para Muitos (N:M). Como mapear isso para o modelo lógico?
🏁 Resultado Esperado do Desafio
ITEM_PEDIDO (id_pedido FK, sku_produto FK, quantidade)
🔍 Explicação da Solução:
Relacionamentos N:M sempre geram uma terceira tabela (Associativa). Esta tabela carrega as chaves estrangeiras de ambos os lados e as transforma em uma Chave Primária Composta.
🔑 Gabarito de Código/Fórmulas Completo
Prática 1 (Mapeamento Completo):
CLIENTE (id PK, nome, cpf UNIQUE, endereco)PRODUTO (id PK, sku UNIQUE, nome, preco)PEDIDO (id PK, data, id_cliente FK, id_entregador FK)ENTREGADOR (id PK, nome, cpf UNIQUE, veiculo_id FK)VEICULO (id PK, placa UNIQUE, modelo, tipo)
Prática 2 (Álgebra vs SQL Passo a Passo):
-
Objetivo: Nomes dos Entregadores.
- Fórmula:
π nome (ENTREGADOR) - SQL Equivalente:
SELECT nome FROM entregador;
- Fórmula:
-
Objetivo: Filtro de Caminhões.
- Fórmula:
σ tipo='Caminhão' (VEICULO) - SQL Equivalente:
SELECT * FROM veiculo WHERE tipo = 'Caminhão';
- Fórmula:
-
Objetivo: Cruzamento de Dados (Nome + Modelo).
- Fórmula:
π nome, modelo (ENTREGADOR ⋈ veiculo_id=id VEICULO) - SQL Equivalente:
SELECT e.nome, v.modelo FROM entregador e INNER JOIN veiculo v ON e.veiculo_id = v.id;
- Fórmula:
Desafio (Mapeamento N:M):
- Lógico:
ITEM_PEDIDO (id_pedido FK, sku_produto FK, quantidade) - SQL de Criação (com as tabelas-pai
pedidoeprodutopara as FKs resolverem):CREATE TABLE pedido ( id INT PRIMARY KEY, data_pedido DATE ); CREATE TABLE produto ( sku VARCHAR(50) PRIMARY KEY, nome VARCHAR(100) ); CREATE TABLE item_pedido ( id_pedido INT, sku_produto VARCHAR(50), quantidade INT, PRIMARY KEY (id_pedido, sku_produto), FOREIGN KEY (id_pedido) REFERENCES pedido(id), FOREIGN KEY (sku_produto) REFERENCES produto(sku) );
📊 Rubrica Formativa de Avaliação
| Critério de Avaliação | Insuficiente (0% - 40%) | Regular (41% - 70%) | Excelente (71% - 100%) |
|---|---|---|---|
| Mapeamento Lógico & Tabela Associativa | Não consegue mapear relacionamentos N:M ou omite Chaves Estrangeiras (FKs). | Cria a tabela associativa mas sem a Chave Primária Composta. | Mapeia perfeitamente a tabela associativa `ITEM_PEDIDO` com PK composta e FKs corretas. |
| Equivalência Álgebra Relacional vs SQL | Erros conceituais na tradução de Projeção ($\pi$), Seleção ($\sigma$) e Junção ($\bowtie$). | Traduz 2 das 3 expressões corretamente. | Tradução impecável das 3 expressões de Álgebra Relacional para SQL ANSI. |
| Entrega no GitHub | Entrega fora da pasta `bd-atv-03-mapeamento/`. | Arquivo entregue mas sem a formatação em tabela. | `Atividade_03.md` entregue com formatação Markdown e SQL validado. |