Banco de dados analítico aplicando Star Schema sobre dataset real de e-commerce brasileiro (100k pedidos), com SQL avançado, integridade referencial e queries otimizadas para insights de negócio.
Tecnologias: PostgreSQL 15 | Star Schema | Window Functions | CTEs | Índices Funcionais
Objetivo: Criar estrutura analítica para responder perguntas de negócio sobre vendas, produtos, clientes e vendedores em um marketplace brasileiro.
Dataset: Brazilian E-Commerce Public Dataset by Olist
Período: 2016-2018 | Volume: ~100.000 pedidos | Linhas carregadas: 98.778 em fato_itens
Tecnologia: PostgreSQL 15 | Modelagem: Star Schema
- PostgreSQL 15 — Banco relacional com suporte avançado a índices funcionais
- Star Schema — Arquitetura dimensional para OLAP
- 3FN — Normalização nas tabelas dimensão
- Window Functions — LAG(), RANK() OVER PARTITION BY
- CTEs — Common Table Expressions para queries complexas
- Functional Indexes — DATE_TRUNC() para agregações temporais
- Constraints — PKs compostas, FKs com CASCADE/RESTRICT
- DBeaver — IDE SQL para desenvolvimento e testes
- dbdiagram.io — Modelagem visual do DER
- Git/GitHub — Versionamento de código
dim_clientes— Dados cadastrais de clientes (customer_id, cidade, estado)dim_produtos— Catálogo de produtos por categoriadim_vendedores— Informações de sellers (seller_id, localização)
fato_pedidos— Transações de pedidos (granularidade: 1 pedido)fato_itens— Itens vendidos (granularidade: 1 produto × 1 pedido × 1 vendedor)
✅ Integridade referencial: 4 Foreign Keys com políticas CASCADE/RESTRICT
✅ Performance: 15 índices estratégicos (FKs, campos temporais, geográficos)
✅ Qualidade de dados: 240 duplicatas removidas antes de criar PK composta em fato_itens
✅ Otimização temporal: Índice funcional em DATE_TRUNC('month', order_purchase_timestamp)
Documentação completa:
- ✅ Star Schema com 3 dimensões + 2 fatos
- ✅ Integridade referencial via 4 Foreign Keys
- ✅ Normalização 3FN nas dimensões
- ✅ Limpeza de 240 duplicatas pré-constraints
- ✅ 15 índices estratégicos (FKs, temporal, geográfico)
- ✅ Índice funcional para agregações mensais
- ✅ Queries otimizadas validadas via EXPLAIN ANALYZE
- ✅ KPIs executivos (receita mensal, crescimento MoM)
- ✅ Ranking de produtos por categoria (RANK OVER PARTITION BY)
- ✅ Análise geográfica com % do total nacional
- ✅ Performance de vendedores (top sellers)
- ✅ Análise de custos logísticos (frete/receita)
- ✅ Dicionário de dados completo (Markdown)
- ✅ Análise de normalização e trade-offs
- ✅ Prints de queries executadas com dados reais
- ✅ Scripts DDL padronizados e comentados
- PostgreSQL 15 ou superior
- DBeaver, pgAdmin ou psql
- Dataset Olist (download aqui)
git clone https://github.com/rodrigodesouza7/ecommerce-olist-analytics.git
cd ecommerce-olist-analytics- Acesse: https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce
- Baixe e extraia os CSVs na pasta
dados/(já gitignored)
CREATE DATABASE olist_analytics;psql -d olist_analytics -f sql/ddl/01_create_dim_clientes.sql
psql -d olist_analytics -f sql/ddl/02_create_dim_produtos.sql
psql -d olist_analytics -f sql/ddl/03_create_dim_vendedores.sql
psql -d olist_analytics -f sql/ddl/04_create_fato_pedidos.sql
psql -d olist_analytics -f sql/ddl/05_create_fato_itens.sql
psql -d olist_analytics -f sql/ddl/06_create_constraints.sql # Crítico: FKs + limpeza de duplicatas
psql -d olist_analytics -f sql/ddl/07_create_indexes.sqlUse DBeaver (Import Data) ou COPY via psql:
-- Ajustar paths conforme localização dos CSVs
\COPY dim_clientes FROM 'dados/olist_customers_dataset.csv' CSV HEADER;
\COPY dim_produtos FROM 'dados/olist_products_dataset.csv' CSV HEADER;
\COPY dim_vendedores FROM 'dados/olist_sellers_dataset.csv' CSV HEADER;
\COPY fato_pedidos FROM 'dados/olist_orders_dataset.csv' CSV HEADER;
\COPY fato_itens FROM 'dados/olist_order_items_dataset.csv' CSV HEADER;Problema de negócio: CEO precisa monitorar crescimento mensal para identificar tendências e sazonalidades.
Técnicas SQL: DATE_TRUNC, LAG() (window function), cálculo percentual de crescimento
-- Ver query completa em: sql/queries/q01_receita_mensal_crescimento.sqlInsight: Crescimento de 23% entre nov/2017 e dez/2017 (Black Friday + Natal)
Problema de negócio: Gerente de produto quer saber quais itens investir em estoque prioritário.
Técnicas SQL: RANK() OVER PARTITION BY, agregações por categoria
-- Ver query completa em: sql/queries/q02_top_produtos_por_categoria.sqlInsight: Categoria "eletrônicos" concentra 3 dos 5 produtos mais lucrativos (alto ticket, alto giro)
Problema de negócio: Diretor comercial quer identificar regiões com maior potencial para abertura de centros de distribuição.
Técnicas SQL: Agregação geográfica, percentual do total via window function
-- Ver query completa em: sql/queries/q03_analise_geografica_vendas.sqlInsight: SP concentra 41.8% da receita nacional, mas ticket médio no DF é 15% superior
Problema de negócio: Marketplace precisa identificar top sellers para programas de incentivo.
-- Ver query completa em: sql/queries/q04_performance_vendedores.sqlProblema de negócio: CFO quer reduzir custos operacionais identificando categorias com frete desproporcional.
-- Ver query completa em: sql/queries/q05_analise_custo_frete.sqlInsight: Categoria "móveis" tem frete médio 38% do valor do produto (oportunidade de renegociação logística)
- Banco de dados: PostgreSQL 15
- Modelagem: Star Schema (Kimball)
- SQL: DDL, Constraints (PKs/FKs), Índices, Window Functions, CTEs, Agregações
- Ferramentas: DBeaver, VS Code, dbdiagram.io
- Versionamento: Git/GitHub
ecommerce-olist-analytics/ ├── dados/ │ └── *.csv (gitignored) ├── docs/ │ ├── modelo-conceitual.png │ ├── dicionario-dados.md │ ├── normalizacao.md │ ├── print1_receita_mensal_crescimento.png │ ├── print2_top_produtos_ranking.png │ └── print3_analise_geografica.png ├── sql/ │ ├── ddl/ │ │ ├── 01_create_dim_clientes.sql │ │ ├── 02_create_dim_produtos.sql │ │ ├── 03_create_dim_vendedores.sql │ │ ├── 04_create_fato_pedidos.sql │ │ ├── 05_create_fato_itens.sql │ │ ├── 06_create_constraints.sql │ │ └── 07_create_indexes.sql │ ├── queries/ │ │ ├── q01_receita_mensal_crescimento.sql │ │ ├── q02_top_produtos_por_categoria.sql │ │ ├── q03_analise_geografica_vendas.sql │ │ ├── q04_performance_vendedores.sql │ │ └── q05_analise_custo_frete.sql │ └── views/ │ └── vw_analise_final.sql ├── .gitignore └── README.md
- Modelagem dimensional aplicada a cenário real de marketplace
- Normalização (3FN) vs. Desnormalização estratégica para OLAP
- Integridade referencial com políticas
ON DELETE CASCADE/RESTRICT - Otimização de queries via índices em FKs e campos de filtro frequente
- Qualidade de dados: limpeza de duplicatas antes de aplicar constraints
- SQL avançado: Window Functions (
LAG,RANK OVER PARTITION BY), CTEs, índices funcionais
- Modelagem conceitual (DER validado)
- Implementação DDL (7 scripts padronizados)
- Constraints e índices (4 FKs + 15 índices)
- Carga de dados (98.778 linhas em fato_itens)
- Queries analíticas (5 queries documentadas)
- View de negócio (vw_analise_final)
- Documentação técnica completa
👤 Sobre o Autor
Rodrigo de Souza Silva Profissional de Tecnologia da Informação com formação em Sistemas de Informação e pós-graduação em Data Science, Machine Learning e IA.
🔗 LinkedIn: https://www.linkedin.com/in/rodrigodesouzasilva
💻 GitHub: https://github.com/rodrigodesouza7
MIT License — Projeto de portfólio profissional



