Desafio - BD Estruturado para Ecommerce
Projeto Prático: Banco de Dados para E-commerce
Crie esse projeto baseado no desafio do banco de dados voltado para um cenário de e-commerce. O objetivo foi aplicar conceitos de modelagem lógica, relacionamento EER e SQL avançado em um projeto realista, incluindo persistência de dados e consultas complexas.
1️⃣ Contexto do Projeto
Nesse projeto, resolvi me desafiar um pouco mais e ficou com a seguinte estrutura:
- Clientes PF e PJ (uma conta não pode ser as duas ao mesmo tempo)
- Pedidos com múltiplos pagamentos
- Entregas com status e código de rastreio
- Produtos, fornecedores e estoque
- Relacionamentos complexos entre entidades
O projeto foi desenvolvido em SQL, com scripts de criação do banco, inserção de dados e consultas para análise.
2️⃣ Diagrama EER (Modelo Lógico)
Abaixo, um diagrama minimalista e didático mostrando as principais tabelas e seus relacionamentos:
O diagrama destaca:
- PF/PJ como especializações da tabela Cliente
- Múltiplos pagamentos por pedido
- Relacionamentos N:N entre Produto e Fornecedor
- Integração com Estoque e Entregas

3️⃣ Criação do Banco (DDL)
CREATE DATABASE ecommerce;
USE ecommerce;
CREATE TABLE cliente (
id_cliente INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
CREATE TABLE cliente_pf (
id_cliente INT PRIMARY KEY,
cpf CHAR(11) UNIQUE NOT NULL,
FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente)
);
CREATE TABLE cliente_pj (
id_cliente INT PRIMARY KEY,
cnpj CHAR(14) UNIQUE NOT NULL,
FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente)
);
CREATE TABLE pedido (
id_pedido INT AUTO_INCREMENT PRIMARY KEY,
id_cliente INT NOT NULL,
data_pedido DATE NOT NULL,
status VARCHAR(30),
FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente)
);
CREATE TABLE pagamento (
id_pagamento INT AUTO_INCREMENT PRIMARY KEY,
id_pedido INT NOT NULL,
tipo VARCHAR(30),
valor DECIMAL(10,2),
FOREIGN KEY (id_pedido) REFERENCES pedido(id_pedido)
);
CREATE TABLE entrega (
id_entrega INT AUTO_INCREMENT PRIMARY KEY,
id_pedido INT NOT NULL,
status VARCHAR(30),
codigo_rastreio VARCHAR(50),
FOREIGN KEY (id_pedido) REFERENCES pedido(id_pedido)
);
CREATE TABLE produto (
id_produto INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100),
preco DECIMAL(10,2)
);
CREATE TABLE fornecedor (
id_fornecedor INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100)
);
CREATE TABLE produto_fornecedor (
id_produto INT,
id_fornecedor INT,
PRIMARY KEY (id_produto, id_fornecedor),
FOREIGN KEY (id_produto) REFERENCES produto(id_produto),
FOREIGN KEY (id_fornecedor) REFERENCES fornecedor(id_fornecedor)
);
CREATE TABLE estoque (
id_produto INT PRIMARY KEY,
quantidade INT,
FOREIGN KEY (id_produto) REFERENCES produto(id_produto)
);
CREATE TABLE vendedor (
id_vendedor INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100)
);
4️⃣ Inserção de Dados (DML)
INSERT INTO cliente (nome, email) VALUES
('Ana Silva', 'ana@email.com'),
('Empresa XPTO', 'contato@xpto.com');
INSERT INTO cliente_pf VALUES (1, '12345678901');
INSERT INTO cliente_pj VALUES (2, '98765432000199');
INSERT INTO pedido (id_cliente, data_pedido, status) VALUES
(1, '2024-01-10', 'Concluído'),
(1, '2024-01-15', 'Em andamento'),
(2, '2024-01-20', 'Concluído');
INSERT INTO pagamento (id_pedido, tipo, valor) VALUES
(1, 'Cartão', 200.00),
(1, 'Pix', 50.00),
(2, 'Boleto', 300.00);
INSERT INTO entrega (id_pedido, status, codigo_rastreio) VALUES
(1, 'Entregue', 'BR123'),
(2, 'Em transporte', 'BR456');
INSERT INTO produto (nome, preco) VALUES
('Notebook', 3500),
('Mouse', 150);
INSERT INTO fornecedor (nome) VALUES
('Fornecedor Tech'),
('Fornecedor Acessórios');
INSERT INTO produto_fornecedor VALUES
(1,1),
(2,2);
INSERT INTO estoque VALUES
(1, 10),
(2, 50);
5️⃣ Consultas SQL Práticas
Quantos pedidos cada cliente realizou?
SELECT c.nome, COUNT(p.id_pedido) AS total_pedidos
FROM cliente c
JOIN pedido p ON c.id_cliente = p.id_cliente
GROUP BY c.nome;
Pedidos com status “Concluído”
SELECT *
FROM pedido
WHERE status = 'Concluído';
Total pago por pedido
SELECT id_pedido, SUM(valor) AS total_pago
FROM pagamento
GROUP BY id_pedido;
Produtos e fornecedores com estoque
SELECT p.nome AS produto, f.nome AS fornecedor, e.quantidade
FROM produto p
JOIN produto_fornecedor pf ON p.id_produto = pf.id_produto
JOIN fornecedor f ON pf.id_fornecedor = f.id_fornecedor
JOIN estoque e ON p.id_produto = e.id_produto;
6️⃣ Aprendizado
Durante este projeto, pratiquei toda a jornada de um banco de dados real:
- Do mapeamento conceitual ao lógico
- Criação de scripts SQL completos
- Desenvolvimento de consultas simples e complexas
- Compreensão de como uma boa modelagem facilita análises e garante integridade
É um ótimo exercício para quem está começando e quer colocar a mão na prática.



