Este repositório contém a modelagem básica de um projeto voltado a otimização de sistemas de transporte, este material será disponibilizado para uso acadêmico e visualização aprofundada, toda a base de dados utilizada foi criada de maneira fictícia, portanto não há nenhum dado real de fato nos arquvivos divulgados.
- 📌 Descrição do Problema
- 🎯 Objetivos do Sistema
- 🗄️ Modelo Relacional (MR)
- 🧹 Normalização
- 🛢️ Arquivos SQL
- 👀 Preview dos Arquivos
- 🚦 Cenários de Uso
- 🟦 Integração com Supabase
- 🛠️ Tecnologias Utilizadas
- 📊 Dashboards Interativos
- 📚 Licença
Faculdades que oferecem transporte para alunos e funcionários frequentemente enfrentam:
- 🚫 Superlotação em determinados veículos
- 📉 Ociosidade em outros
- 🕒 Conflitos de horário
- 🛣️ Rotas pouco otimizadas
- 🧑
✈️ Dificuldade de gestão de motoristas e fornecedores
Este banco de dados foi projetado para resolver esses problemas e oferecer um sistema sólido para decisões operacionais.
| Objetivo | Descrição |
|---|---|
| 🚍 Organizar Transporte | Distribuir corretamente os usuários entre os veículos |
| 🛣️ Otimizar Rotas | Reduzir o tempo total de deslocamento |
| 🕒 Sincronizar Horários | Evitar atrasos e conflitos com o horário acadêmico |
| 📊 Equilibrar Ocupação | Distribuir a demanda de forma inteligente |
| 🧑 |
Motoristas, veículos, fornecedores, rotas e usuários |
(Modelo já normalizado e documentado)
Foram aplicadas as 3 Formas Normais:
🔹 Primeira Forma Normal (1FN)
- Remoção de atributos multivalorados
- Padronização dos domínios
- Tabelas duplicadas foram unificadas
🔹 Segunda Forma Normal (2FN)
- Separação de dependências parciais
- Criação da tabela
enderecos - Eliminação de dados redundantes
🔹 Terceira Forma Normal (3FN)
- Criação da tabela associativa
alocacoes_usuarios_veiculos - Unificação de ônibus/peruas em
veiculoscomtipo_veiculo - Remoção de dependências transitivas
O projeto inclui dois arquivos principais:
Contém:
- Criação das tabelas
- Definição de PKs e FKs
- Inserts com dados de teste
Contém queries analíticas, incluindo:
- Rotas com maior demanda
- Distribuição de usuários por veículo
- Fornecedores ativos
- Média de capacidade
- Relação motorista → veículos
CREATE TABLE rotas (
id_rota SERIAL PRIMARY KEY,
tempo_estimado INTERVAL NOT NULL,
demanda_usuarios INT NOT NULL CHECK (demanda_usuarios >= 0),
endereco_partida_id VARCHAR(9) NOT NULL,
endereco_chegada_id VARCHAR(9) NOT NULL,
horario_partida TIME NOT NULL,
FOREIGN KEY (endereco_partida_id) REFERENCES enderecos(id_endereco),
FOREIGN KEY (endereco_chegada_id) REFERENCES enderecos(id_endereco)
);
CREATE TABLE veiculos (
id_veiculo VARCHAR(20) PRIMARY KEY,
tipo_veiculo VARCHAR(10) NOT NULL CHECK (tipo_veiculo IN ('onibus', 'perua')),
capacidade INT NOT NULL CHECK (capacidade > 0 AND capacidade <= 50),
eixos INT NOT NULL CHECK (eixos > 0),
rota_id INT NOT NULL REFERENCES rotas(id_rota),
fornecedor_id VARCHAR(18) NOT NULL REFERENCES fornecedores(fornecedor_id),
motorista_id INT NOT NULL REFERENCES motoristas(motorista_id)
);
CREATE TABLE motoristas (
motorista_id SERIAL PRIMARY KEY,
nome VARCHAR(150) NOT NULL,
telefone VARCHAR(20) NOT NULL,
turno VARCHAR(20) NOT NULL CHECK (turno IN ('manha', 'tarde', 'noite')),
tipo_cnh VARCHAR(5) NOT NULL CHECK (tipo_cnh IN ('D', 'E')),
fornecedor_id VARCHAR(18) NOT NULL,
FOREIGN KEY (fornecedor_id) REFERENCES fornecedores(fornecedor_id)
);
CREATE TABLE alocacoes_usuarios_veiculos (
usuario_id VARCHAR(50) NOT NULL,
id_veiculo VARCHAR(20) NOT NULL,
PRIMARY KEY (usuario_id, id_veiculo),
FOREIGN KEY (usuario_id) REFERENCES usuarios(id_usuario),
FOREIGN KEY (id_veiculo) REFERENCES veiculos(id_veiculo)
);
🔍 consultas.sql
-- QUERY 1
-- Seleciona informações sobre rotas que têm mais de 10 usuários alocados
SELECT
r.id_rota,
m.nome AS nome_motorista,
COUNT(DISTINCT auv.usuario_id) AS total_usuarios,
AVG(v.capacidade) AS media_capacidade_veiculo
FROM
rotas r
JOIN
veiculos v ON r.id_rota = v.rota_id
JOIN
motoristas m ON v.motorista_id = m.motorista_id
JOIN
alocacoes_usuarios_veiculos auv ON v.id_veiculo = auv.id_veiculo
WHERE
r.id_rota IN (
-- Subconsulta que retorna rotas com mais de 10 usuários distintos alocados
SELECT v2.rota_id
FROM veiculos v2
JOIN alocacoes_usuarios_veiculos auv2 ON v2.id_veiculo = auv2.id_veiculo
GROUP BY v2.rota_id
HAVING COUNT(DISTINCT auv2.usuario_id) > 10
)
GROUP BY
r.id_rota, m.nome
ORDER BY
total_usuarios DESC;| Cenário | Descrição |
|---|---|
| 🚫 Superlotação | O sistema redistribui usuários entre veículos quando a capacidade máxima é ultrapassada. |
| 🕒 Conflito de Horários | O usuário só pode reservar rotas compatíveis com seu horário de aula. |
| 🛣️ Otimização de Rotas | Identifica rotas ociosas ou sobrecarregadas para melhor balanceamento. |
| 🧑 |
Permite consultar motoristas por turno, fornecedor e veículos associados. |
A visualização deste projeto é disponibilizada através do supabase, la armazenamos os triggers, funções, views entre outras funcionalidades adicionais que não poderão ser disponibilizadas por aqui diretamente, toda estrutura atualizada deste projeto será implementada de forma privada para a impossibilitação de descasos de plágio.
Este projeto conta com dashboards desenvolvidos no Grafana 12.4, conectados diretamente ao banco de dados hospedado no Supabase.
Os painéis permitem visualizar:
- Ocupação dos veículos
- Veículos ociosos
- Ranking de rotas por demanda
- Comparativo: capacidade média × ocupação média
- Distribuição de usuários (curso e turno)
- Veículos por fornecedor
- Motoristas por turno
- Mapa operacional completo (rota → veículo → motorista → fornecedor)
- Alocações detalhadas dos usuários
As imagens abaixo mostram prévias reais dos painéis criados:
Todas as capturas acima foram geradas diretamente do dashboard oficial deste projeto.
🔗 Para facilitar a visualização, segue um overview da ultima snapshot lançada do dashboard completo: https://mateusmonteiro11.grafana.net/dashboard/snapshot/VkGuV0L8I7bUen8MRnfvZwdUgz0r0nzz
- 💾 SQL (DDL, DML, DQL)
- 🧩 Modelagem MER e Modelo Relacional
- 📊 Grafana Data Source
- 🧹 Normalização (1FN → 3FN)
- 🐘 PostgreSQL / SQLite / MySQL
- 🟩 Supabase
- 🗺️ DrawSQL / DBML / Workbench
Este é um projeto acadêmico, porém é de suma uma tecnologia voltada a resolução de um problema real, portanto este projeto pode ser atualizado brevemente e suas alterações futuras ou qualquer dado relacionado aos novos lançamentos não poderão ser disponibilizados diretamente. Os arquivos da criação de tabelas, inserts e consultas estarão disponiveis para consultas acadêmicas e visualização para análise aprofundada, porém não permitiremos plágio ou qualquer utilização deste material de forma imprudente.
