Este repositório documenta o processo completo de modelagem de um banco de dados relacional para um sistema de gerenciamento de pagamentos, desde a concepção conceitual até a implementação física.
- Estrutura do Projeto
- Ferramentas Utilizadas
- Contexto do Sistema
- Entidades e Relacionamentos
- Modelagem de Dados
- Scripts SQL
- Instruções de Uso
- Lições Aprendidas
- Licença
📦 database-modeling-payments
┣ 📁 diagrams
┃ ┣ 01 - Conceitual.brm3 # Diagrama conceitual (BrModelo)
┃ ┣ 01 - Conceitual.png # Imagem do diagrama conceitual
┃ ┣ 02 - Lógico.mwb # Diagrama lógico (MySQL Workbench)
┃ ┣ 02 - Lógico.png # Imagem do diagrama lógico
┃ ┗ 03 - Fisíco.png # Imagem do diagrama Fisíco
┣ 📁 sql
┃ ┣ 04 - script_create_table.sql # Criação de tabelas e constraints
┃ ┣ 05 - script_insert_table.sql # Dados de exemplo
┃ ┣ 06 - script_queries.sql # Consultas de análise
┃ ┣ 07 - script_indexes.sql # Índices para otimização
┃ ┗ 08 - Exercícios.pdf # Exercícios para praticar
┣ README.md
┗ LICENSE
| Ferramenta | Finalidade | Versão |
|---|---|---|
| BrModelo | Modelo conceitual | 3.3 |
| MySQL Workbench | Modelo lógico | 8.0+ |
| PostgreSQL | SGBD para modelo físico | 14+ |
| DBeaver | Interface e execução SQL | 23.0+ |
A empresa precisa de um sistema robusto para gerenciar as transações financeiras dos seus clientes, observando as seguintes regras de negócio:
- Clientes realizam Pedidos.
- Cada Pedido é associado a um Pagamento.
- O Pagamento possui um Status Assíncrono:
Pendente,Aprovado,RecusadoouEstornado. - Um Pagamento utiliza uma única Forma de Pagamento.
- Formas de Pagamento definem parâmetros como
percentual_descontooupercentual_juros_mes. - Pagamentos podem ser divididos em até 12 Parcelas, com flexibilidade para valores e datas de vencimento individuais por parcela.
| Entidade | Descrição | Atributos Principais |
|---|---|---|
| Clientes | Cadastro de clientes | id, nome, email, cpf, data_cadastro |
| Pedidos | Registro de pedidos | id, cliente_id, valor_total, data_pedido, status |
| Pagamentos | Transações de pagamento | id, pedido_id, forma_pagamento_id, valor_total, status |
| FormaPagamento | Meios de pagamento | id, nome, desconto, juros_mensal, parcelas_maximas |
| Parcelas | Parcelas do pagamento | id, pagamento_id, numero_parcela, valor, data_vencimento, status |
Cliente (1) ---- (N) Pedido
Pedido (1) ---- (1) Pagamento
FormaPagamento (1) ---- (N) Pagamento
Pagamento (1) ---- (N) Parcela
- Arquivo:
diagrams/01 - Conceitual.brM3 - Objetivo: Representar entidades, atributos e relacionamentos de alto nível
- Características: Identificação das entidades principais e seus relacionamentos básicos
- Arquivo:
diagrams/02 - Lógico.mwb - Objetivo: Definir estrutura detalhada com chaves, tipos de dados e cardinalidades
- Características: Normalização até 3FN, definição de PKs e FKs
- Implementação: PostgreSQL e DBeaver
- Características: Scripts executáveis, índices, constraints e dados de exemplo
-- Exemplo de criação de tabelas
create table if not exists modulo_pagamentos.clientes (
id_cliente SERIAL primary key,
nome VARCHAR(60) not null,
endereco VARCHAR (100) not null,
telefone VARCHAR (15) not null,
email VARCHAR(45) not null unique
);
create table if not exists modulo_pagamentos.pedidos (
id_pedido SERIAL primary key,
id_cliente INT references modulo_pagamentos.clientes(id_cliente),
valor_bruto DECIMAL(10,2) check (valor_bruto >= 0),
status_pedido VARCHAR(45) not null default 'Pagamento Pendente',
data_pedido TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
constraint chk_status_pedido check (status_pedido in ('Pagamento Pendente', 'Pagamento Confirmado', 'Cancelado',
'Entrega em andamento', 'Finalizado', 'Em separação'))
);- Dados de exemplo para todas as tabelas
- Cenários de teste para diferentes formas de pagamento
- Casos de uso realistas para análise
Consultas
- Listar as parcelas para um determinado mês (exemplo: janeiro de 2026).
- Listar todas as parcelas de um pedido específico, mostrando o número da parcela e a data de vencimento.
- Contar todos os pedidos de um cliente específico.
- Listar os clientes que ainda têm pagamentos pendentes.
- Mostrar o total pago por cada cliente
- Mostrar todas as parcelas em Pendente com o nome do cliente e valor que falta a pagar
- Selecionar os clientes que pagaram com o dinheiro.
- Selecionar todos os pagamentos em que não foram aplicados qualquer tipo de desconto.
- Selecionar pagamentos parcelados acima de 3x.
- Listar os 3 clientes que mais realizaram pedidos.
- Mostrar a evolução mensal do volume de pagamentos.
- Listar os pedidos onde o valor total pago é superior em mais de 5% ao valor bruto do pedido, mostrando a porcentagem exata do acréscimo.
- Listar clientes que fizeram mais de um pedido e utilizam formas de pagamento diferentes.
-- Exemplo de criação de indices
create index idx_clientes_nome on modulo_pagamentos.clientes(nome);
create index idx_clientes_email on modulo_pagamentos.clientes(email);
create index idx_pedidos_id_cliente on modulo_pagamentos.pedidos(id_cliente);
create index idx_pedidos_status on modulo_pagamentos.pedidos(status_pedido);
create index idx_pedidos_data on modulo_pagamentos.pedidos(data_pedido);-
Modelo Conceitual:
# Abrir com BrModelo Abra o arquivo diagrams/01 - Conceitual.brM3 no BrModelo -
Modelo Lógico:
# Abrir com MySQL Workbench Abra o arquivo diagrams/02 - Lógico.mwb no MySQL Workbench
-
Conectar ao banco:
-- Via DBeaver ou psql \c nome_do_seu_banco -
Executar scripts em ordem:
\i sql/04 - script_create_table.sql \i sql/05 - script_insert_table.sql \i sql/07 - script_indexes.sql
-
Testar consultas:
\i sql/06 - script_queries.sql
- Aplicação da modelagem em camadas (conceitual → lógico → físico) garantindo estrutura consistente e evolução segura do modelo.
- Normalização até 3FN, eliminando redundâncias e assegurando integridade dos dados.
- Definição precisa de PKs, FKs, UNIQUE e CHECK, aplicando regras de negócio diretamente no banco.
- Modelagem de pagamentos parcelados com relacionamento 1:N e controle individual de vencimento, status e valor.
- Implementação de domínios de status utilizando constraints para prevenir estados inválidos.
- Estruturação de tabelas com tipos adequados (BOOLEAN, DECIMAL, TIMESTAMP) e defaults inteligentes.
- Criação de índices otimizados para acelerar consultas e melhorar performance do modelo.
- Escrita de consultas SQL analíticas e operacionais usando JOINs, agregações, subconsultas e filtros compostos.
- Simulação de cenários financeiros reais, incluindo juros, descontos, parcelamentos e diferentes métodos de pagamento.
- Organização modular dos scripts SQL, separando DDL, inserts, queries e índices para facilitar manutenção.
- Utilização de ferramentas especializadas (BrModelo, MySQL Workbench, PostgreSQL e DBeaver) em cada etapa do projeto.
- Visão sistêmica da modelagem, entendendo como decisões estruturais impactam performance, relatórios e evolução futura.
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes | Feito com 💙 por LARISSA PANISSET


