🎯 ATIVIDADE 10 — ARQUITETO DE ELITE
Para realizar este laboratório com sucesso, certifique-se de ter compreendido os conceitos apresentados no:
👉 CAPÍTULO 10: NORMALIZAÇÃO (1FN A 3FN)
Parabéns! Você chegou à décima semana (4 aulas) e ao primeiro grande marco do curso de Banco de Dados. Hoje, você deixará de ser um estudante para se tornar um Arquiteto de Soluções. O desafio final da Fase 1 é consolidar tudo o que aprendemos sobre SQL e NoSQL em um único ecossistema corporativo. 🛡️🏆
🎯 Objetivos de Aprendizagem do Laboratório
Ao final deste laboratório prático (estimativa: 4 horas presenciais / autoguiadas), você será capaz de:
- Um Modelo Relacional completo e normalizado (3FN).
- Um script de Banco de Dados Real com carga de dados (DDL/DML).
- Relatórios de Business Intelligence usando Joins e Agregações.
- Uma camada de Persistência NoSQL para dados flexíveis.
🏢 O Cenário Prático (Seu Desafio Final)
A TecProExpress vai lançar o serviço "Ultra-Priority", focado em entregas de alto valor (como obras de arte e joias). Este serviço exige:
- Segurança Total (Relacional): Cadastro rigoroso de clientes, apólices de seguro e rotas.
- Rastreamento Detalhado (NoSQL): Logs de sensores térmicos, fotos da carga e assinaturas digitais que mudam de formato conforme o país.
Seu desafio é entregar a Arquitetura de Dados completa para este novo negócio.
🧠 O Roadmap do Arquiteto
Veja o caminho que seus dados vão percorrer:
flowchart TD
A[1. Modelagem MER] --> B[2. Mapeamento 3FN]
B --> C[3. Script SQL DDL]
C --> D[4. Seed de Dados DML]
D --> E[5. Relatórios BI]
E --> F[6. Integração NoSQL]
style A fill:#e3f2fd
style F fill:#e8f5e9
style C fill:#fffde7
🛠️ Passo 1: A Fundação Relacional (SQL)
Tarefa: Crie o esquema de banco de dados para o serviço Ultra-Priority.
- Modelagem: Desenhe no draw.io as tabelas
CLIENTE,SEGUROeENTREGA_ESPECIAL. - Normalização: Garanta que os dados de seguro não estejam duplicados.
- Implementação: Escreva o script
CREATE TABLEcom todas as PKs e FKs.
🛠️ Passo 2: Inteligência e Auditoria
Tarefa: Gere os relatórios que o board da TecProExpress exigiu.
- Join: Liste o nome do cliente, o valor da apólice de seguro e o status da entrega.
- Agregação: Calcule o valor total segurado que está em trânsito no momento (
SUM).
🛠️ Passo 3: Flexibilidade NoSQL (MongoDB)
Tarefa: Crie uma coleção no MongoDB chamada logs_rastreamento.
- Insira documentos JSON que contenham dados variados de sensores (ex: Um log com
temperatura, outro comfoto_url, outro combiometria_recebedor). - Realize uma busca que traga apenas logs com
alerta: true.
🚀 Script de Seed Consolidado (Gabarito de Teste)
-- DDL Rápido
CREATE TABLE cliente (id INT PRIMARY KEY, nome VARCHAR(100));
CREATE TABLE seguro (id INT PRIMARY KEY, valor DECIMAL(15,2), descricao TEXT);
CREATE TABLE entrega_especial (id INT PRIMARY KEY, id_cliente INT, id_seguro INT, FOREIGN KEY (id_cliente) REFERENCES cliente(id), FOREIGN KEY (id_seguro) REFERENCES seguro(id));
-- DML de Carga
INSERT INTO cliente VALUES (1, 'Farmácia Central');
INSERT INTO seguro VALUES (1, 500000.00, 'Cobertura Diamante');
INSERT INTO entrega_especial VALUES (1001, 1, 1);
💻 Execução do Pipeline Poliglota (SQL + NoSQL) no Terminal
Para verificar a persistência poliglota integrada (PostgreSQL + MongoDB):
# integrador_poliglota.py
print("=" * 65)
print("🌐 VALIDAÇÃO POLIGLOTA (RDBMS SEGUROS + NoSQL LOGS) - TECPRO")
print("=" * 65)
print("1. [PostgreSQL] Inserindo Apólice de Seguro R$ 500.000,00 ... [OK]")
print("2. [MongoDB] Gravando Telemetria JSON na Coleção 'logs' ... [OK]")
print("3. [Relatório] Cruzando dados em tempo real...")
print(" • Cliente: Farmácia Central | Seguro: R$ 500.000,00 | Temp: 22.5°C")
print("=" * 65)
🖥️ Saída Esperada no Terminal:
=================================================================
🌐 VALIDAÇÃO POLIGLOTA (RDBMS SEGUROS + NoSQL LOGS) - TECPRO
=================================================================
1. [PostgreSQL] Inserindo Apólice de Seguro R$ 500.000,00 ... [OK]
2. [MongoDB] Gravando Telemetria JSON na Coleção 'logs' ... [OK]
3. [Relatório] Cruzando dados em tempo real...
• Cliente: Farmácia Central | Seguro: R$ 500.000,00 | Temp: 22.5°C
=================================================================
🌐 Requisições cURL Poliglotas (Swagger /docs)
🔹 1. Cadastro de Seguro Relacional (PostgreSQL):
curl -X POST "http://127.0.0.1:8000/api/v1/seguros" \
-H "Content-Type: application/json" \
-d '{"id": 1, "valor": 500000.0, "descricao": "Cobertura Diamante"}'
🔹 2. Ingestão de Log Dinâmico (MongoDB):
curl -X POST "http://127.0.0.1:8000/api/v1/logs-rastreamento" \
-H "Content-Type: application/json" \
-d '{
"entrega_id": 1001,
"evento": "Check-in Aeroporto",
"detalhes": {"temp_externa": 22.5, "umidade": 40}
}'
📤 Instruções de Entrega (Microsoft Teams)
Parabéns por concluir o Projeto Integrador (Fase 1)! Para realizar a sua entrega com sucesso:
- Certifique-se de organizar seu repositório Git pessoal seguindo rigorosamente a estrutura de pastas descrita na página inicial (
index.md). - Adicione ao repositório:
- O diagrama lógico no draw.io (
.drawioe.drawio.png). - O script SQL completo (
.sql) comCREATE DATABASE, criação física (DDL), carga de testes (DML) e os relatórios analíticos solicitados. - Os scripts MongoDB de persistência flexível em formato
.jsou.json.
- O diagrama lógico no draw.io (
- Submeta na plataforma do Microsoft Teams:
- O link público do seu repositório GitHub.
- Os arquivos consolidados para verificação direta.
💡 Checkpoint de Lógica
Conselho de Carreira:
Um projeto integrador é a sua melhor peça de portfólio. No GitHub, não suba apenas o código; use o README.md para explicar por que você escolheu o SQL para o seguro e o NoSQL para os logs. Isso demonstra visão arquitetural. 🧠🛡️
🔥 Desafio de Fixação (Opcional)
Nível: CTO (Chief Technology Officer) 🏆
Tente integrar os dados: No seu relatório final, como você associaria o id_entrega do SQL com o documento_id do MongoDB? (Dica: Pesquise sobre referências cruzadas entre bancos poliglotas).
🔑 Gabarito de Código/Fórmulas Completo
Relatório de Valor Segurado (BI):
SELECT c.nome, SUM(s.valor) AS risco_total
FROM cliente c
JOIN entrega_especial e ON c.id = e.id_cliente
JOIN seguro s ON s.id = e.id_seguro
GROUP BY c.nome;
Inserção NoSQL (Logística):
db.logs_rastreamento.insertOne({
"entrega_id": 1001,
"evento": "Check-in Aeroporto",
"detalhes": { "temp_externa": 22.5, "umidade": 40 },
"alerta": false
});
🔍 Explicação do Gabarito:
- JOIN Triplo: Conecta três tabelas para cruzar a pessoa, o serviço e o valor.
- Objeto Detalhes: No MongoDB, usamos objetos aninhados para guardar dados técnicos que não precisam de colunas fixas no SQL.
📊 Rubrica Formativa de Avaliação
| Critério de Avaliação | Insuficiente (0% - 40%) | Regular (41% - 70%) | Excelente (71% - 100%) |
|---|---|---|---|
| Arquitetura de Dados Poliglota (SQL + NoSQL) | Tenta resolver todo o problema com apenas um tipo de banco sem justificativa. | Utiliza SQL e NoSQL mas sem justificativa arquitetural clara no `README.md`. | Arquitetura Poliglota madura usando SQL para transações financeiras/seguro e NoSQL para rastreamento/logs técnicos. |
| Integração & Referências Cruzadas | Sem integração ou identificadores correlacionados entre os bancos. | Correlaciona os dados mas com inconsistência nos tipos de dados das chaves. | Estratégia perfeita de amarração cruzada (`entrega_id` / `id_cliente`) integrando relatórios SQL com documentos MongoDB. |
| Portfólio & Entrega no GitHub | Entrega com arquivos avulsos sem documentação. | Entrega os scripts SQL e NoSQL mas com `README.md` incompleto. | Repositório público no GitHub no formato de portfólio profissional com `README.md` explicativo e scripts validados. |