Table of Contents
Bancos de Dados SQL e NoSQL 🗄️
Domine o universo dos dados, desde a modelagem relacional com PostgreSQL até a flexibilidade do NoSQL com MongoDB. Aprenda a estruturar, consultar e gerenciar informações para aplicações modernas.
Foco do Curso
Metodologia: Teoria aplicada em laboratórios práticos, focada na construção de bases de dados sólidas, performáticas e escaláveis.
🎯 O Que Você Vai Aprender
-
Modelo Relacional --- Entenda entidades, relacionamentos e como o PostgreSQL gerencia dados estruturados com integridade total. Ir para Módulo I
-
:material-sql: Poder do SQL --- Domine o SELECT, JOINs complexos, transações ACID e técnicas avançadas de manipulação de dados. Ver SQL Prático
-
Mundo NoSQL --- Explore o MongoDB, aprenda modelagem orientada a documentos e descubra quando a flexibilidade supera a estrutura. Ver NoSQL
-
Big Data & Projetos --- Integre diferentes paradigmas em um projeto final robusto e compreenda o papel dos dados no cenário de Big Data. Ver Projetos
📚 Jornada de Aprendizado (16 Aulas)
O curso é estruturado em três módulos fundamentais.
🧱 Módulo I: Fundamentos (Aulas 01-04)
- Aula 01 - Introdução a Bancos de Dados 🧩
- Aula 02 - Modelagem de Dados e Modelo E-R 🏗️
- Aula 03 - Normalização e Estrutura Relacional 📡
- Aula 04 - DDL (Criação da Estrutura) 📄
🏗️ Módulo II: SQL na Prática (Aulas 05-10)
- Aula 05 - DML (Manipulação de Dados) ⚙️
- Aula 06 - DQL Básico 💾
- Aula 07 - Consultas Avançadas 🧪
- Aula 08 - Junções 🚢
- Aula 09 - Transações e ACID 🔑
- Aula 10 - Projeto Parcial 🔐
🚀 Módulo III: NoSQL e Modernidade (Aulas 11-16)
- Aula 11 - Introdução ao NoSQL 🌐
- Aula 12 - MongoDB na Prática 🍃
- Aula 13 - Modelagem em Documentos 🧱
- Aula 14 - Recursos Avançados 🔄
- Aula 15 - Big Data e Ciência de Dados 🛣️
- Aula 16 - Projeto Final Integrador 🎓
Aulas
Aulas do Curso 📚
Acesse aqui todo o conteúdo teórico dividido em trilhas de conhecimento.
-
Módulo 1: Fundamentos e UI --- A base do desenvolvimento mobile e interfaces modernas.
-
Módulo 2: Arquitetura e Dados --- Organização de código profissional e persistência.
-
Módulo 3: Listas e APIs --- Consumo de dados e performance.
-
Módulo 4: Qualidade e Hardware --- Recursos nativos e publicação.
Aula 01 - Introdução a Bancos de Dados 🗄️
Objetivo
Objetivo: Compreender os conceitos fundamentais de dados e informação, explorar a evolução histórica do armazenamento de dados e entender a arquitetura básica de um Sistema Gerenciador de Banco de Dados Relacional (SGBDR).
1. Dado, Informação e Banco de Dados 🧩
Antes de começarmos a digitar comandos, precisamos entender o que estamos manipulando.
- Dado: É um elemento bruto, sem contexto (ex: "35", "João", "2024-05-10"). Sozinho, ele não transmite uma mensagem clara.
- Informação: É o dado processado e contextualizado (ex: "A temperatura média hoje é 35°C").
- Banco de Dados: É uma coleção organizada de dados relacionados, estruturados de forma que possam ser acessados, gerenciados e atualizados facilmente.
2. Evolução dos Bancos de Dados ⏳
A forma como guardamos informações mudou drasticamente ao longo das décadas:
- Arquivos Planos (Flat Files): Dados guardados em arquivos de texto simples (.txt, .csv). Difícil de buscar e sem segurança.
- Modelo Hierárquico e em Rede: Estruturas rígidas em forma de árvore.
- Modelo Relacional (Anos 70): Introduzido por Edgar F. Codd, organiza dados em tabelas (linhas e colunas). É o padrão mais utilizado até hoje.
- NoSQL (Anos 2000): Surgiu para lidar com grandes volumes de dados não estruturados e alta escalabilidade.
3. O Modelo Relacional e SGBDR 🏛️
Um SGBDR (Sistema Gerenciador de Banco de Dados Relacional) é o software que permite interagir com o banco de dados.
Exemplos Populares:
- 🐘 PostgreSQL: O foco deste curso. Poderoso, robusto e código aberto.
- 🐬 MySQL: Muito popular para aplicações web simples.
- 🪟 SQL Server: A solução corporativa da Microsoft.
- 🅾️ Oracle: O gigante do mercado para grandes corporações.
Arquitetura Cliente/Servidor
O banco de dados geralmente roda em um Servidor. Nós, como desenvolvedores, usamos um Cliente (como pgAdmin ou terminal) para enviar comandos e receber resultados.
4. Visualização de Arquitetura (Mermaid) 📊
graph LR
User((Usuário))
subgraph "Cliente (Seu PC)"
Client[pgAdmin / Terminal]
end
subgraph "Servidor (Local ou Nuvem)"
SGBD[(PostgreSQL Server)]
DB[(Base de Dados)]
end
Client -- "Comandos SQL" --> SGBD
SGBD -- "Resultados/Dados" --> Client
SGBD <--> DB
5. Prática: Primeiros Passos com PostgreSQL 💻
Vamos verificar se o seu ambiente está pronto. Se ainda não instalou, veja o guia de Setup 01.
Verificando via Terminal
$ psql --version
psql (PostgreSQL) 16.2
$ psql -U postgres
Password for user postgres: ********
postgres=# \l (Listar bancos de dados)
postgres=# \q (Sair)
[!IMPORTANT] A senha definida na instalação é a chave mestra para o seu banco. Não a perca!
6. Mini-Projeto: Planejando seu Primeiro Banco 🚀
Imagine que você vai criar um sistema para uma Biblioteca. Quais "coisas" (entidades) você precisaria guardar?
- Livros (Título, Autor, ISBN)
- Usuários (Nome, CPF, E-mail)
- Empréstimos (Data, Prazo)
Desafio: Tente desenhar em papel ou numa ferramenta simples como essas informações se conectam.
7. Exercícios de Fixação 🧠
- Diferencie dado de informação com um exemplo do seu cotidiano.
- Por que o Modelo Relacional é chamado de "relacional"?
- Cite três vantagens de usar um SGBD em vez de guardar dados em arquivos de texto (.txt).
Próxima Aula: Vamos aprender a desenhar bancos de dados com o Modelo E-R! 🏗️
Aula 02 - Modelagem de Dados e Modelo E-R 🏗️
Objetivo
Objetivo: Aprender a abstrair a realidade para o mundo dos dados, utilizando o Modelo Entidade-Relacionamento (E-R) para projetar estruturas de bancos de dados eficientes e consistentes.
1. Abstração e Modelagem 🧠
Modelar dados é como desenhar a planta de uma casa antes de construí-la. Precisamos definir quem são os personagens e como eles interagem.
- Entidade: É um "objeto" do mundo real sobre o qual queremos guardar dados (ex: Cliente, Produto, Pedido).
- Atributo: São as características de uma entidade (ex: Nome, Preço, Cor).
- Relacionamento: É como as entidades se conectam (ex: Um Cliente faz um Pedido).
2. Atributos e Chaves 🔑
Para que um banco de dados funcione, cada registro deve ser único e identificável.
Chave Primária (Primary Key - PK)
É o atributo (ou conjunto de atributos) que identifica exclusivamente cada linha de uma tabela. * Exemplo: O CPF de um usuário ou um ID autoincrementado.
Chave Estrangeira (Foreign Key - FK)
É um atributo que estabelece um vínculo entre duas tabelas, apontando para a PK de outra tabela.
* Exemplo: Na tabela Pedidos, guardamos o id_cliente para saber quem comprou.
3. Cardinalidade: O "Pulo do Gato" 🐈
A cardinalidade define quantos itens de uma entidade podem se relacionar com quantos itens de outra.
- 1:1 (Um para Um): Um usuário tem um perfil.
- 1:N (Um para Muitos): Um cliente faz vários pedidos. { .fragment }
- N:N (Muitos para Muitos): Vários alunos se matriculam em várias disciplinas. { .fragment }
[!NOTE] Em relacionamentos N:N, geralmente precisamos de uma tabela associativa (tabela do meio).
4. Integridade Referencial 🛡️
O banco de dados garante que os relacionamentos sejam válidos. Se um Pedido aponta para o Cliente ID 50, o Cliente 50 deve existir. O SGBD impede que você apague o cliente se ele tiver pedidos pendentes.
5. Diagrama E-R (Mermaid) 📊
Vamos visualizar o relacionamento entre Clientes e Pedidos:
erDiagram
CLIENTE ||--o{ PEDIDO : "faz"
CLIENTE {
int id PK
string nome
string email
}
PEDIDO {
int id PK
int id_cliente FK
date data
decimal total
}
6. Ferramentas CASE 🛠️
Para criar diagramas profissionais, usamos ferramentas como: * dbdiagram.io: Rápido e baseado em texto. * brModelo: Clássico acadêmico brasileiro. * MySQL Workbench: Visual e completo.
7. Prática: Desenhando um Mini-Sistema 💻
Use o terminal ou um papel para listar os atributos e chaves do sistema de uma Clínica Médica:
$ Entidades sugeridas:
$ - Medico (CRM, Nome, Especialidade)
$ - Paciente (CPF, Nome, Telefone)
$ - Consulta (Data, Hora, Medico_ID, Paciente_ID)
8. Exercícios de Fixação 🧠
- O que acontece se tentarmos inserir um
id_clientena tabela dePedidosque não existe na tabelaClientes? - Explique a diferença entre uma Chave Primária Simples e uma Chave Primária Composta.
- Desenhe (ou descreva) o relacionamento entre Autor e Livro. Qual a cardinalidade?
Próxima Aula: Vamos aprender a organizar a "bagunça" com a Normalização! 📡
Aula 03 - Normalização e Estrutura Relacional 📡
Objetivo
Objetivo: Aprender as regras da Normalização para eliminar redundâncias, garantir a integridade dos dados e criar estruturas de tabelas otimizadas e profissionais.
1. Tipos de Dados e o Conceito de NULL 🧩
Cada coluna em uma tabela deve ter um tipo definido. Isso ajuda o SGBD a economizar espaço e validar entradas.
- Inteiros (
INT,BIGINT): Números sem casas decimais. - Decimais (
DECIMAL,NUMERIC,REAL): Para valores monetários ou medidas precisas. - Texto (
VARCHAR,TEXT,CHAR): Cadeias de caracteres. - Data/Hora (
DATE,TIMESTAMP): Registros temporais. - NULL: Representa a ausência de valor ou valor desconhecido. Não é o mesmo que zero ou string vazia ("").
2. O que é Normalização? ⚖️
É um processo técnico de organizar as colunas e tabelas de um banco de dados para minimizar a redundância (repetição de dados) e evitar anomalias de atualização.
Por que normalizar?
- Economia de espaço em disco.
- Facilidade de manutenção.
- Garantia de que a informação esteja em um só lugar.
3. As Formas Normais (FN) 📏
Existem várias formas normais, mas as três primeiras (1FN, 2FN e 3FN) são as mais essenciais no dia a dia.
1ª Forma Normal (1FN) - Atomicidade
- Cada coluna deve conter apenas um valor (valores atômicos).
- Não pode haver grupos repetidos ou listas separadas por vírgula em uma célula.
- Exemplo:
Telefones: (11) 9999, (11) 8888❌ -> Criar tabela separada para telefones ✅.
2ª Forma Normal (2FN) - Dependência Funcional
- Estar na 1FN.
- Toda coluna que não é chave deve depender da chave primária inteira (relevante para chaves compostas).
3ª Forma Normal (3FN) - Dependência Transitiva
- Estar na 2FN.
- As colunas não-chave não podem depender de outras colunas não-chave.
- Exemplo: Tabela
Pedidoscomid_clienteenome_cliente. O nome depende do ID, não do Pedido. Deve sair dali.
4. Especialização e Generalização 🧬
Conceitos herdados da Orientação a Objetos:
* Generalização: Criar uma entidade "Pai" (ex: Pessoa).
* Especialização: Criar entidades "Filhas" com atributos específicos (ex: Pessoa_Fisica e Pessoa_Juridica).
5. Visualização de Estrutura (Mermaid) 📊
Abaixo, um exemplo de banco normalizado:
erDiagram
ALUNO ||--o{ TELEFONE : "possui"
ALUNO {
int id PK
string nome
date data_nascimento
}
TELEFONE {
int id PK
int aluno_id FK
string numero
}
6. Prática: Corrigindo uma Tabela Ruim 💻
Observe esta estrutura mal feita:
Vendas (id_venda, data, cliente_nome, produto_nome, produto_preco)
$ Problemas identificados:
$ 1. Nome do cliente repetido em cada venda (redundância).
$ 2. Se o preço do produto mudar, o histórico das vendas pode se perder.
$
$ Solução Normalizada:
$ - Tabelas separadas para: Clientes, Produtos e Vendas.
7. Exercícios de Fixação 🧠
- Explique a frase: "A 3ª Forma Normal combate a dependência transitiva".
- Quando é aceitável realizar a Desnormalização de um banco de dados?
- O que é um valor Atômico?
Próxima Aula: Vamos colocar a mão na massa com os comandos de DDL - Criação da Estrutura! 🏗️
Aula 04 - DDL (Criação da Estrutura) 🏗️
Objetivo
Objetivo: Aprender a linguagem DDL (Data Definition Language) para criar, alterar e excluir a estrutura física do banco de dados no PostgreSQL.
1. O que é DDL? 📜
DDL (Data Definition Language) é o subconjunto do SQL usado para definir a estrutura do banco de dados (o "esqueleto").
Comandos principais:
* CREATE: Cria objetos (bancos, tabelas, índices).
* ALTER: Altera a estrutura de objetos existentes.
* DROP: Exclui objetos permanentemente.
* TRUNCATE: Esvazia uma tabela (deleta os dados, mas mantém a estrutura).
2. Criando o Banco e Tabelas 🛠️
Antes de guardar dados, precisamos do "container".
Criando o Banco de Dados
Criando uma Tabela Completa
CREATE TABLE professores (
id SERIAL PRIMARY KEY, -- Serial cria um autoincremento
nome VARCHAR(100) NOT NULL, -- Não permite valores vazios
email VARCHAR(150) UNIQUE, -- Não permite emails repetidos
data_contratacao DATE DEFAULT CURRENT_DATE
);
3. Chaves e Restrições (Constraints) 🔑
As restrições garantem a qualidade dos dados.
PRIMARY KEY: Identificador único.FOREIGN KEY: Relacionamento com outra tabela.NOT NULL: Campo obrigatório.UNIQUE: Valor não pode se repetir.CHECK: Valida uma condição (ex:CHECK (preco > 0)).
4. Índices: Acelerando as Buscas ⚡
Índices funcionam como o sumário de um livro. Eles ajudam o SGBD a encontrar dados sem precisar ler a tabela inteira.
[!WARNING] Índices aceleram a leitura (
SELECT), mas tornam a escrita (INSERT,UPDATE) um pouco mais lenta. Use com sabedoria!
5. Alterando e Excluindo 🔨
Errou o nome da coluna? Precisa adicionar um campo novo?
Adicionando Coluna
Removendo Tabela (CUIDADO!)
6. Prática no Terminal (pgAdmin) 💻
Abra o Query Tool no seu pgAdmin e execute estes comandos:
$ CREATE DATABASE escola;
$ \c escola (conectar no banco via psql)
$
$ CREATE TABLE alunos (
$ id SERIAL PRIMARY KEY,
$ nome VARCHAR(100) NOT NULL
$ );
7. Mini-Projeto: O Banco da Escola 🚀
Crie o script DDL para o seguinte cenário:
1. Uma tabela cursos com id, nome e carga_horaria.
2. Uma tabela matriculas que liga alunos (já criada) aos cursos.
Dica: Use
REFERENCESpara criar a Chave Estrangeira.
8. Exercícios de Fixação 🧠
- Qual a diferença entre os comandos
DROPeTRUNCATE? - Por que a coluna
idgeralmente usa o tipoSERIALno PostgreSQL? - Escreva o comando SQL para adicionar uma restrição
UNIQUEna colunaCPFda tabelaalunos.
Próxima Aula: Vamos aprender a colocar dados nessas tabelas com o DML - Manipulação de Dados! ⚙️
Aula 05 - DML (Manipulação de Dados) ⚙️
Objetivo
Objetivo: Aprender os comandos DML (Data Manipulation Language) para inserir, atualizar e excluir informações dentro das tabelas criadas no PostgreSQL.
1. O que é DML? 🖊️
Enquanto o DDL cria o "balde", o DML gerencia a "água" (os dados). É o conjunto de comandos que usamos no dia a dia para manter as informações do sistema atualizadas.
Comandos principais:
* INSERT: Adiciona novas linhas.
* UPDATE: Altera dados de linhas existentes.
* DELETE: Remove linhas da tabela.
2. Inserindo Dados (INSERT) 📥
O comando INSERT adiciona um novo registro.
Sintaxe Básica:
Inserindo Múltiplos Registros de uma vez:
INSERT INTO alunos (nome, email) VALUES
('Ana Souza', 'ana@email.com'),
('João Silva', 'joao@email.com'),
('Maria Oliveira', 'maria@email.com');
[!TIP] Não é necessário incluir a coluna
idse ela for do tipoSERIAL, pois o banco a preenche sozinho!
3. Atualizando Dados (UPDATE) ✏️
Use o UPDATE para mudar informações que já estão lá.
[!CAUTION] NUNCA esqueça o
WHERE! Sem ele, você atualizará TODOS os registros da tabela com o mesmo valor.
4. Removendo Dados (DELETE) 🗑️
O DELETE remove registros permanentemente.
[!CAUTION] Assim como no
UPDATE, oWHEREé vital. Se esquecer, você esvaziará a tabela inteira! Para apagar tudo propositalmente e de forma rápida, dê preferência aoTRUNCATE(DDL).
5. Visualização de Fluxo (Mermaid) 📊
graph TD
Start[Novo Registro] --> I[INSERT]
I --> DB[(Banco de Dados)]
DB --> U[UPDATE - Mudança de Idade/Email]
U --> DB
DB --> D[DELETE - Cancelamento de Conta]
D --> Archive[Fim do Registro]
6. Prática: Populando seu Banco 💻
Utilize o Query Tool para popular sua tabela de alunos:
$ INSERT INTO alunos (nome) VALUES ('Cadu'), ('Bia');
$ SELECT * FROM alunos;
$
$ -- Simulando erro do estagiário:
$ UPDATE alunos SET nome = 'ERRO'; -- Cuidado! Cancele antes de executar!
7. Mini-Projeto: Gestão de Inventário 🚀
Crie uma tabela produtos (id, nome, preco, estoque) e realize:
1. O cadastro de 3 produtos.
2. Uma atualização de preço em 10% para um produto específico.
3. A exclusão de um produto que saiu de linha.
8. Exercícios de Fixação 🧠
- Diferencie
UPDATEdeINSERT. - O que acontece se eu executar
DELETE FROM alunos;sem a cláusulaWHERE? - Como insiro um valor na coluna
data_nascimentoseguindo o formato padrão do ISO (YYYY-MM-DD)?
Próxima Aula: Vamos aprender a recuperar esses dados com o DQL Básico! 💾
Aula 06 - DQL Básico 💾
Objetivo
Objetivo: Dominar o comando SELECT para recuperar informações de tabelas, aprendendo a filtrar resultados com WHERE e organizar a exibição com ORDER BY.
1. O que é DQL? 🔍
DQL (Data Query Language) é o subconjunto do SQL focado na recuperação de dados. É, sem dúvida, o comando que você mais usará em toda a sua carreira na computação.
O comando principal é o SELECT.
2. SELECT: Projeção e Seleção 🎥
Projeção (Escolhendo Colunas)
Quando você escolhe quais colunas quer ver.
Seleção (Escolhendo Linhas)
Quando você filtra quais registros devem aparecer usando o WHERE.
[!NOTE] O asterisco (
*) significa "todas as colunas". Use-o com moderação em bancos de dados muito grandes por questões de performance.
3. Filtrando com WHERE 🎯
O WHERE aceita diversos operadores de comparação:
| Operador | Significado |
|---|---|
= |
Igual |
<> ou != |
Diferente |
> e < |
Maior e Menor |
>= e <= |
Maior/Menor ou Igual |
BETWEEN |
Entre dois valores (ex: BETWEEN 10 AND 20) |
LIKE |
Busca por padrão de texto (ex: nome LIKE 'Ri%') |
IN |
Verifica se o valor está em uma lista (ex: id IN (1, 2, 5)) |
4. Ordenando Resultados (ORDER BY) 📶
Por padrão, o banco de dados não garante a ordem dos registros. Use o ORDER BY para organizar.
- ASC: Ordem Ascendente (padrão).
- DESC: Ordem Descendente.
5. Visualização de Execução (Mermaid) 📊
graph LR
User[Usuário] -- "SELECT nome FROM alunos WHERE id=1" --> SQL{Motor SQL}
SQL -- "Busca na Tabela" --> DB[(Disco Rigido)]
DB -- "Dados Brutos" --> SQL
SQL -- "Resultado Filtrado" --> User
6. Prática: Consultas Simples 💻
Abra o terminal e tente realizar estas buscas:
$ SELECT * FROM alunos WHERE nome LIKE 'A%'; -- Nomes que começam com A
$ SELECT nome, data_contratacao FROM professores ORDER BY data_contratacao ASC;
$ SELECT * FROM produtos WHERE preco > 100 AND estoque < 5;
7. Mini-Projeto: Dashboard de Vendas 🚀
Utilizando sua tabela de produtos, crie consultas para:
1. Listar todos os produtos com estoque zerado.
2. Listar o nome e o preço dos 5 produtos mais baratos.
3. Buscar produtos que tenham a palavra "Monitor" no nome.
8. Exercícios de Fixação 🧠
- O que faz a cláusula
DISTINCTem um comando SELECT? - Como eu buscaria todos os alunos que nasceram entre os anos 2000 e 2005 usando o operador
BETWEEN? - Qual a diferença entre usar
ORDER BY 1eORDER BY nome_coluna?
Próxima Aula: Vamos subir de nível com as Consultas Avançadas e Agregações! 🧪
Aula 07 - Consultas Avançadas e Agregações 🧪
Objetivo
Objetivo: Aprender a realizar cálculos diretamente no banco de dados usando funções de agregação, agrupando dados com GROUP BY e filtrando esses grupos com HAVING.
1. Funções de Agregação 🧮
Em vez de trazer todas as linhas, às vezes precisamos de um resumo (total, média, contagem).
As 5 funções básicas de agregação são:
* COUNT(): Conta o número de linhas ou valores.
* SUM(): Soma valores numéricos.
* AVG(): Calcula a média aritmética.
* MAX(): Encontra o maior valor.
* MIN(): Encontra o menor valor.
SELECT COUNT(*) FROM alunos; -- Quantos alunos existem?
SELECT SUM(preco) FROM produtos; -- Valor total do estoque em R$.
2. Apelidos (ALIAS) com AS 🏷️
Para deixar o cabeçalho do relatório mais bonito e legível, usamos o AS.
3. Agrupando Dados (GROUP BY) 🧱
O GROUP BY divide o resultado em grupos para que possamos aplicar as funções de agregação em cada pedaço.
-- Quantos produtos existem em cada categoria?
SELECT categoria, COUNT(*) AS total_itens
FROM produtos
GROUP BY categoria;
4. Filtrando Grupos com HAVING 🎯
Se o WHERE filtra as linhas (antes do grupo), o HAVING filtra os grupos (depois que a conta foi feita).
-- Quais categorias têm mais de 50 produtos cadastrados?
SELECT categoria, COUNT(*)
FROM produtos
GROUP BY categoria
HAVING COUNT(*) > 50;
5. Visualização de Processamento (Mermaid) 📊
graph TD
Data[(Tabela Bruta)] --> Filter[WHERE - Filtra as linhas]
Filter --> Group[GROUP BY - Separa em potes]
Group --> Agg[Funções SUM/COUNT/AVG]
Agg --> H[HAVING - Filtra os potes cheios]
H --> Result[Relatório Final]
6. Prática: Relatórios de Alunos 💻
Imagine uma tabela notas (aluno_id, disciplina, nota). Tente:
$ SELECT disciplina, AVG(nota) AS media FROM notas GROUP BY disciplina;
$ SELECT aluno_id, SUM(valor_pago) AS total_investido FROM mensalidades GROUP BY aluno_id;
$ SELECT MAX(preco) AS mais_caro FROM produtos;
7. Mini-Projeto: Dashboard de Vendas 🚀
Baseado em um sistema de mercado: 1. Calcule o faturamento total (soma) de um dia específico. 2. Mostre qual o produto mais caro e o mais barato da loja. 3. Liste as categorias que geraram mais de R$ 5.000,00 em vendas.
8. Exercícios de Fixação 🧠
- Qual a diferença fundamental entre
WHEREeHAVING? - O que acontece se eu usar uma função de agregação (como
SUM) sem usar oGROUP BY? - Como eu contaria apenas os valores únicos em uma coluna (ex: quantos estados diferentes meus alunos moram)?
Próxima Aula: Vamos aprender a unir o que está separado com os JOINs - Junções entre Tabelas! 🔗
Aula 08 - JOINs: Junções entre Tabelas 🔗
Objetivo
Objetivo: Aprender a conectar tabelas separadas para extrair informações completas, dominando os diferentes tipos de JOIN (Inner, Left, Right e Full) e entendendo como o banco de dados relaciona as chaves.
1. O que são JOINs? 🤝
Em um banco de dados normalizado, os dados estão espalhados em várias tabelas. O JOIN é a "ponte" que nos permite unir essas peças para gerar uma resposta legível.
Imagine que você tem o id_cliente no pedido, mas quer ver o nome do cliente. Você precisa unir a tabela de Pedidos com a de Clientes.
2. INNER JOIN: A Interseção 🎯
É o tipo mais comum. Ele retorna apenas os registros que possuem correspondência em ambas as tabelas.
SELECT pedidos.id, clientes.nome
FROM pedidos
INNER JOIN clientes ON pedidos.id_cliente = clientes.id;
3. LEFT JOIN e RIGHT JOIN: A Prioridade ⬅️➡️
Às vezes queremos ver todos os registros de uma tabela, mesmo que não haja par na outra.
- LEFT JOIN: Traz todos da tabela da esquerda, e o que houver na direita. Se não houver nada na direita, preenche com
NULL. - RIGHT JOIN: O contrário. Traz todos da direita.
-- Listar TODOS os clientes, mesmo os que nunca compraram nada.
SELECT clientes.nome, pedidos.id
FROM clientes
LEFT JOIN pedidos ON clientes.id = pedidos.id_cliente;
4. FULL OUTER JOIN e CROSS JOIN 🌐
- FULL OUTER JOIN: Traz tudo de ambos os lados, unindo onde houver par e trazendo NULL onde não houver.
- CROSS JOIN: Produto cartesiano. Combina cada linha da primeira tabela com cada linha da segunda (Ex: Todos os Tamanhos x Todas as Cores).
5. Visualização de Conjuntos (Venn) 📊
graph TD
subgraph "Inner Join"
A[Tabela A] --- B[Interseção]
B --- C[Tabela B]
end
subgraph "Left Join"
LA[Tabela A Completa] --- LB[Direita se existir]
end
6. Prática: Unindo o Banco 💻
Utilize seu banco de escola/loja e experimente:
$ -- Ver quais alunos estão em quais turmas
$ SELECT alunos.nome, turmas.nome_turma
$ FROM alunos
$ INNER JOIN turmas ON alunos.id_turma = turmas.id;
$
$ -- Ver alunos que ainda não têm turma
$ SELECT alunos.nome FROM alunos LEFT JOIN turmas ON alunos.id_turma = turmas.id WHERE turmas.id IS NULL;
7. Mini-Projeto: Extrato de Vendas Detalhado 🚀
Crie uma consulta que una 3 tabelas: vendas, produtos e vendedores.
O relatório deve mostrar:
1. O nome do vendedor.
2. O nome do produto vendido.
3. A data da venda.
4. O valor total.
8. Exercícios de Fixação 🧠
- Qual a diferença prática entre
INNER JOINeLEFT JOIN? - O que acontece se eu esquecer a cláusula
ONem um JOIN? - Podemos usar apelidos (alias) para as tabelas em um JOIN (Ex:
FROM clientes c)? Isso facilita em quê?
Próxima Aula: Vamos aprender a garantir a segurança das operações com Transações e ACID! 🔑
Aula 09 - Transações e Integridade ACID 🔑
Objetivo
Objetivo: Compreender o conceito de transações no banco de dados, aprender a usar COMMIT e ROLLBACK para garantir a segurança dos dados e entender as propriedades ACID que tornam os SGBDs confiáveis.
1. O que é uma Transação? 🛡️
Uma transação é uma unidade lógica de trabalho que contém um ou mais comandos SQL. O banco de dados garante que ou tudo seja executado com sucesso ou nada seja executado.
Imagine uma transferência bancária: 1. Tirar R$ 100 da conta A. 2. Colocar R$ 100 na conta B.
Se o sistema travar no passo 1, o dinheiro some? Não, se usarmos transações!
2. Comandos de Transação 🕹️
BEGIN: Inicia a transação.COMMIT: Salva as alterações permanentemente.ROLLBACK: Cancela tudo o que foi feito desde oBEGIN.SAVEPOINT: Cria um "checkpoint" para voltar apenas a um ponto específico.
3. As Propriedades ACID 💎
Para que um SGBD seja considerado confiável (como o PostgreSQL), ele deve seguir o ACID:
- A - Atomicidade: A transação é atômica (tudo ou nada).
- C - Consistência: O banco sempre passa de um estado válido para outro estado válido.
- I - Isolamento: Transações simultâneas não interferem umas nas quais.
- D - Durabilidade: Uma vez confirmada (COMMIT), a alteração não se perde mesmo em queda de energia.
4. Prática: Simulação de Transferência 💻
Vamos simular o cenário no terminal:
$ BEGIN;
$ UPDATE contas SET saldo = saldo - 100 WHERE id = 1;
$ UPDATE contas SET saldo = saldo + 100 WHERE id = 2;
$
$ -- Ops! Vi que o ID 2 está errado.
$ ROLLBACK; -- Nada foi alterado no banco real!
5. Visualização de Fluxo (Mermaid) 📊
graph TD
Start[BEGIN] --> Op1[Update Tabela A]
Op1 --> Op2[Update Tabela B]
Op2 --> Decision{Tudo OK?}
Decision -- Sim --> C[COMMIT - Salvou!]
Decision -- Não --> R[ROLLBACK - Desfez!]
C --> End((Fim))
R --> End
6. Níveis de Isolamento 🛡️
O banco pode lidar com leituras simultâneas de várias formas. Os problemas comuns que as transações evitam são: * Leitura Suja: Ler dados que foram alterados mas não confirmados por outra pessoa. * Leitura Fantasma: Surgimento de novas linhas no meio de uma transação.
7. Mini-Projeto: Sistema de Estorno 🚀
Crie uma sequência de comandos que simule uma compra em um e-commerce:
1. BEGIN.
2. Diminuir o estoque do produto.
3. Registrar o pedido.
4. Inserir um registro de log.
5. Use um ROLLBACK simulando um erro no processamento do cartão de crédito.
8. Exercícios de Fixação 🧠
- O que acontece se um servidor de banco de dados cair no meio de uma transação que ainda não recebeu o
COMMIT? - Explique a propriedade Durabilidade.
- Qual a utilidade do comando
SAVEPOINT?
Próxima Aula: Vamos consolidar o Módulo II com o Projeto Parcial - Sistema Relacional Completo! 🔐
Aula 10 - Projeto Parcial: Sistema Relacional 🔐
Objetivo
Objetivo: Consolidar todo o conhecimento do Módulo II através da criação de um sistema de banco de dados relacional completo, aplicando DDL, DML, DQL avançado e controle de transações.
1. O Desafio: E-commerce "TechStore" 🛒
Nesta aula, você não apenas aprenderá novos conceitos, mas aplicará tudo o que vimos até aqui em um cenário profissional real. O objetivo é construir a base de dados de uma loja de tecnologia.
Requisitos do Sistema:
- Clientes: Cadastro completo.
- Produtos: Controle de estoque e categorias.
- Vendas: Registro de quem comprou, o que comprou e quando.
- Segurança: Garantia de que nenhuma venda seja registrada sem baixar o estoque (Transações).
2. Mapa Mental da Estrutura (Mermaid) 📊
erDiagram
CLIENTE ||--o{ PEDIDO : "faz"
VENDEDOR ||--o{ PEDIDO : "registra"
PEDIDO ||--o{ ITENS_PEDIDO : "contém"
PRODUTO ||--o{ ITENS_PEDIDO : "está em"
CATEGORIA ||--o{ PRODUTO : "classifica"
3. Passo a Passo do Projeto 🛠️
Fase 1: Fundação (DDL)
Criação das tabelas com todas as restrições (PRIMARY KEY, FOREIGN KEY, NOT NULL, CHECK).
Fase 2: Povoamento (DML)
Inserção de dados realistas para testes. Pelo menos 5 clientes, 10 produtos e algumas vendas.
Fase 3: Inteligência (DQL)
Criação de relatórios complexos: * Ranking de vendas por categoria. * Ticket médio por cliente. * Produtos mais vendidos.
4. Checklist de Qualidade 🛡️
- [ ] O banco está na 3ª Forma Normal?
- [ ] As chaves estrangeiras impedem a exclusão de clientes com pedidos?
- [ ] Os preços são sempre maiores que zero?
- [ ] As consultas usam JOINs e Aliases de forma clara?
5. Exemplo de Script Integrado 💻
BEGIN;
-- 1. Criar pedido
INSERT INTO pedidos (cliente_id, data) VALUES (1, CURRENT_DATE) RETURNING id;
-- 2. Adicionar item (Supondo ID do pedido = 50)
INSERT INTO itens_pedido (pedido_id, produto_id, qtd) VALUES (50, 10, 2);
-- 3. Baixar estoque
UPDATE produtos SET estoque = estoque - 2 WHERE id = 10;
COMMIT;
6. Prática: O "Gran Finale" no pgAdmin 🚀
Execute o script completo (que você desenvolverá no Projeto 10) e verifique se o banco se comporta corretamente em casos de erros (ROLLBACK) e sucessos (COMMIT).
7. Exercícios de Fixação 🧠
- Por que é melhor usar uma tabela associativa em
itens_pedidoem vez de colocar os produtos direto na tabelapedidos? - Como você geraria um relatório mostrando os clientes que gastaram mais de R$ 1.000,00 no total?
- Quais índices você criaria para esse sistema para melhorar a performance de busca?
Módulo III: Prepare-se para o mundo moderno com a Introdução ao NoSQL e MongoDB! 🌐
Aula 11 - Introdução ao NoSQL e MongoDB 🌐
Objetivo
Objetivo: Entender o que são bancos de dados não relacionais (NoSQL), os motivos para sua existência e as principais diferenças conceituais em relação ao modelo SQL tradicional.
1. O que é NoSQL? 🧩
NoSQL (do inglês Not Only SQL) é um termo que engloba tecnologias de banco de dados que não utilizam o modelo de tabelas relacionais clássico de linhas e colunas.
Por que surgiu?
- Escalabilidade: Lidar com volumes massivos de dados distribuídos em vários servidores.
- Flexibilidade: Armazenar dados com estruturas que mudam frequentemente (esquema flexível).
- Velocidade: Alta performance em operações simples de leitura e escrita.
2. Tipos de Bancos NoSQL 📚
Existem quatro categorias principais:
- Documento: Guarda dados no formato JSON/BSON (Ex: MongoDB, CouchDB).
- Chave-Valor: Como um dicionário gigante (Ex: Redis, DynamoDB).
- Coluna: Otimizado para consultas analíticas pesadas (Ex: Cassandra, HBase).
- Grafo: Focado em conexões e redes (Ex: Neo4j).
3. SQL vs NoSQL: A Grande Batalha ⚔️
| Característica | SQL (PostgreSQL) | NoSQL (MongoDB) |
|---|---|---|
| Estrutura | Rígida (Tabelas) | Flexível (Documentos) |
| Relacionamentos | JOINs poderosos | Documentos aninhados |
| Escalabilidade | Vertical (Melhor Hardware) | Horizontal (Mais Servidores) |
| Transações | ACID nativo e forte | BASE (Eventual) |
4. O Modelo de Documento (JSON) 🏗️
No MongoDB, não temos tabelas, temos Collections. Não temos linhas, temos Documents.
{
"_id": "645a2b3c...",
"nome": "Ricardo Pires",
"idade": 35,
"habilidades": ["SQL", "MongoDB", "Kotlin"],
"endereco": {
"rua": "Av. Brasil",
"cidade": "São Paulo"
}
}
5. Teorema CAP 📊
Em sistemas distribuídos, você só pode escolher dois destes três: * Consistência (Consistency) * Availabilidade (Availability) * Partição (Partition Tolerance)
graph TD
C[Consistência] --- A[Disponibilidade]
A --- P[Partição]
P --- C
style C fill:#f9f,stroke:#333
style A fill:#bbf,stroke:#333
style P fill:#dfd,stroke:#333
6. Prática: Pensando sem Tabelas 💻
Imagine que você quer guardar as postagens de um blog. * No SQL: Tabela Posts, Tabela Comentários, Tabela Autores (3 tabelas + 2 JOINs). * No NoSQL: Um único documento "Post" contendo todos os comentários dentro dele.
7. Exercícios de Fixação 🧠
- O que significa a sigla NoSQL?
- Dê um exemplo de cenário onde o MongoDB seria melhor que o PostgreSQL.
- Explique o conceito de Escalabilidade Horizontal.
Próxima Aula: Vamos colocar a mão na massa instalando o MongoDB e fazendo o primeiro CRUD! 🍃
Aula 12 - Instalação e CRUD Básico no MongoDB 🍃
Objetivo
Objetivo: Instalar o ambiente de desenvolvimento do MongoDB e dominar as quatro operações básicas (Create, Read, Update, Delete) através do terminal e de ferramentas visuais.
1. Preparando o Ambiente 🛠️
Você tem duas opções principais: 1. MongoDB local: Instalado na sua máquina (vimos no Setup 02). 2. MongoDB Atlas: Banco de dados na nuvem (DBaaS), gratuito para testes.
Para esta aula, usaremos o mongosh (MongoDB Shell) ou o MongoDB Compass (Interface Visual).
2. O Vocabulário MongoDB 🗣️
| SQL | MongoDB |
|---|---|
| Database | Database |
| Table | Collection |
| Row | Document |
| Column | Field |
| Join | Embedding / Reference |
3. Operações de Escrita (Create) ✍️
Diferente do SQL, não precisamos criar as colunas antes. O banco cria a coleção na primeira inserção.
// Inserir um único documento
db.usuarios.insertOne({
nome: "Ricardo",
email: "ricardo@email.com",
ativo: true
});
// Inserir vários
db.usuarios.insertMany([
{ nome: "Ana", idade: 25 },
{ nome: "Bia", idade: 30 }
]);
4. Operações de Busca (Read) 🔎
O find() é o nosso SELECT.
// Buscar todos
db.usuarios.find();
// Buscar com filtro (nome igual a Ricardo)
db.usuarios.find({ nome: "Ricardo" });
// Buscar maiores de 20 anos ($gt = Greater Than)
db.usuarios.find({ idade: { $gt: 20 } });
5. Atualização (Update) 🔄
Sempre usamos operadores como o $set.
// Mudar o nome do usuário com ID específico
db.usuarios.updateOne(
{ _id: ObjectId("...") },
{ $set: { nome: "Ricardo Pires" } }
);
// Adicionar um campo a todos os usuários
db.usuarios.updateMany({}, { $set: { verificado: false } });
6. Exclusão (Delete) 🗑️
Cuidado: assim como no SQL, o filtro é essencial!
// Deletar um
db.usuarios.deleteOne({ nome: "Ana" });
// Limpar a coleção
db.usuarios.deleteMany({});
7. Prática: O Terminal do Futuro 💻
Abra o seu terminal e execute os comandos:
$ mongosh
$ use meu_primeiro_banco;
$ db.produtos.insertOne({ nome: "Mouse", preco: 50 });
$ db.produtos.find();
8. Exercícios de Fixação 🧠
- No MongoDB, qual a diferença entre
insertOneeinsertMany? - Para que serve o operador
$setno comando de update? O que aconteceria se você não o usasse no MongoDB? (Dica: Substituição total). - Como você buscaria produtos com preço entre 100 e 500 no MongoDB?
Próxima Aula: Vamos aprender as estratégias para organizar seus dados com a Modelagem de Documentos! 🏗️
Aula 13 - Modelagem de Documentos no NoSQL 🏗️
Objetivo
Objetivo: Aprender as duas principais estratégias de modelagem de dados no MongoDB (Aninhamento e Referência), entendendo as vantagens de cada uma e como decidir qual usar em projetos reais.
1. O Fim do JOIN? 🚫🔗
No SQL, a regra é: "Separe tudo em tabelas e use JOIN". No NoSQL (MongoDB), a regra de ouro é: "Dados que são acessados juntos, devem ser armazenados juntos".
2. Estratégia 1: Aninhamento (Embedding) 📦
Colocamos os dados relacionados dentro do próprio documento principal.
{
"nome": "Ciclano",
"email": "ciclano@email.com",
"enderecos": [
{ "rua": "Rua A", "cidade": "SP" },
{ "rua": "Rua B", "cidade": "RJ" }
]
}
- Vantagem: Leitura ultrarrápida (uma única busca traz tudo).
- Quando usar: Relacionamentos 1:1 ou 1:Poucos (ex: endereços de um usuário).
3. Estratégia 2: Referência (Linking) 🔗
Guardamos apenas o _id do documento relacionado, similar a uma chave estrangeira.
- Vantagem: Evita redundância e o crescimento excessivo de um único documento.
- Quando usar: Relacionamentos 1:Muitos (ex: um blog com 10.000 comentários) ou N:N.
4. Como decidir? 🤔
Responda estas perguntas: 1. O dado cresce sem parar? Se sim, use Referência. 2. Eu sempre preciso do dado filho para mostrar o pai? Se sim, use Aninhamento. 3. Vários pais compartilham o mesmo filho? Se sim, use Referência.
5. Visualização de Relações (Mermaid) 📊
graph TD
User((Usuário)) -- "Aninha (1:1)" --> Profile[Perfil]
User -- "Referencia (1:N)" --> Posts[Postagens]
Posts -- "Aninha (1:Poucos)" --> Tags[Tags]
6. Prática: Estruturando o Blog 💻
Tente modelar um post de blog com comentários:
// Opção A: Embebed (comentários dentro do post)
db.posts.insertOne({
titulo: "Aula 13",
comentarios: [
{ autor: "Ana", texto: "Gostei!" },
{ autor: "Bob", texto: "Top!" }
]
});
7. Mini-Projeto: Dashboard de E-commerce 🚀
Modele o documento de um Pedido. Ele deve conter:
1. Dados básicos do pedido.
2. Dados do Cliente (Aninhado ou Referenciado?).
3. Lista de Produtos (Cada produto deve ter o nome e o preço no momento da compra).
8. Exercícios de Fixação 🧠
- Qual o limite de tamanho de um documento no MongoDB? (Dica: pesquise por 16MB).
- O que acontece se eu aninhar dados demais em um único documento?
- Podemos misturar as duas estratégias (Híbrido) no mesmo banco?
Próxima Aula: Vamos aprender a extrair inteligência dos dados com Consultas e Agregações no MongoDB! 🧪
Aula 14 - Consultas e Agregações no MongoDB 🧪
Objetivo
Objetivo: Dominar o Aggregation Framework do MongoDB para processar dados em larga escala, realizar agrupamentos complexos e simular junções com o $lookup.
1. O que é o Aggregation Framework? ⚙️
Diferente do simples find(), a agregação funciona como uma linha de montagem (Pipeline). Os dados entram, passam por várias etapas e saem transformados no final.
Cada etapa começa com o símbolo $.
2. As Etapas do Pipeline 🏗️
As mais comuns são: * \(match**: Filtra os documentos (equivalente ao WHERE). * **\)group: Agrupa os documentos (equivalente ao GROUP BY). * \(sort**: Ordena os resultados. * **\)project: Escolhe quais campos mostrar (Projeção). * $limit: Restringe o número de resultados.
3. Exemplo: Média de Preços 💰
db.produtos.aggregate([
{ $match: { categoria: "Eletrônicos" } },
{ $group: { _id: "$categoria", mediaPreco: { $avg: "$preco" } } }
]);
4. O $lookup (O "Join" do NoSQL) 🔗
Se você seguiu a estratégia de Referência, precisará do $lookup para unir os dados na consulta.
db.pedidos.aggregate([
{
$lookup: {
from: "clientes", // Tabela para unir
localField: "cliente_id", // Campo no pedido
foreignField: "_id", // Campo no cliente
as: "dados_cliente" // Nome do novo campo
}
}
]);
5. Visualização do Pipeline (Mermaid) 📊
graph LR
Origin[(Documentos)] --> Match[$match]
Match --> Group[$group]
Group --> Sort[$sort]
Sort --> Result[Relatório Final]
6. Performance e Índices ⚡
Fazer agregação em milhões de documentos pode ser lento.
* Índices: Use createIndex({ campo: 1 }) para acelerar as buscas.
* O $match deve ser sempre a PRIMEIRA etapa do pipeline para diminuir o volume de dados logo no início.
7. Prática: Relatórios de Vendas 💻
Tente executar no mongosh:
$ db.vendas.aggregate([
$ { $group: { _id: "$vendedor", total: { $sum: "$valor" } } },
$ { $sort: { total: -1 } }
$ ]);
8. Exercícios de Fixação 🧠
- Qual a diferença entre usar
find().sort()e o pipeline$sortdentro do aggregate? - Para que serve a etapa
$unwind? (Dica: pesquise sobre Arrays no MongoDB). - Posso usar o
$matchmais de uma vez no mesmo pipeline?
Próxima Aula: Vamos fechar o módulo com o MongoDB no Ecossistema Moderno e Deploy! 🚀
Aula 15 - MongoDB no Ecossistema Moderno 🚀
Objetivo
Objetivo: Entender o papel do MongoDB em arquiteturas de software reais, aprender quando (e quando não) usar NoSQL e conhecer as facilidades do MongoDB Atlas para deploy na nuvem.
1. Quando NÃO usar NoSQL? 🛑
NoSQL não é uma "bala de prata". Evite se: * Os dados são altamente relacionais e exigem muitos JOINs complexos. * Você precisa de transações ACID ultra-rígidas em dezenas de tabelas simultâneas. * O esquema dos dados é fixo e nunca muda.
2. Arquitetura Poliglota (O Melhor de Dois Mundos) 🌍
Grandes empresas não escolhem um só. Elas usam: * PostgreSQL: Para dados financeiros, usuários e core business. * MongoDB: Para catálogos, logs, perfis flexíveis e cache. * Redis: Para dados temporários e alta velocidade.
3. MongoDB Atlas: O Banco na Nuvem ☁️
O Atlas é a plataforma oficial do MongoDB que gerencia tudo para você: * Auto-scaling: Aumenta o servidor se o site bombar. * Segurança: Criptografia nativa e firewalls. * Backup: Cópias automáticas do seu banco.
4. Segurança e Melhores Práticas 🔐
- Nunca deixe o seu banco sem senha.
- Whitelist IP: Configure o Atlas para aceitar apenas o IP do seu servidor.
- Indices: Nunca entre em produção sem criar índices nos campos de busca.
5. Visualizando a Escalabilidade (Mermaid) 📊
graph TD
User((Usuário)) --> LB[Load Balancer]
LB --> S1[Servidor 1]
LB --> S2[Servidor 2]
S1 --> Cluster[(Cluster MongoDB Atlas)]
S2 --> Cluster
6. O Futuro: IA e Vetores 🤖
O MongoDB agora suporta Vector Search. Isso permite que você faça buscas por "semelhança" (ex: achar fotos parecidas ou recomendar produtos baseados no gosto), essencial para apps de Inteligência Artificial.
7. Prática: Exportando para a Nuvem 💻
Tente criar uma conta gratuita no MongoDB Atlas e conectar o seu MongoDB Compass a ela usando a connection string.
8. Exercícios de Fixação 🧠
- O que é persistência poliglota?
- Cite dois benefícios de usar o MongoDB Atlas em vez de instalar o banco no seu próprio servidor Linux.
- Por que a segurança por "Whitelist de IP" é importante?
Aula Final: Prepare-se para o Projeto Integrador Final - SQL + NoSQL! 🎓
Aula 16 - Projeto Final Integrador: O Arquiteto de Dados 🎓
Objetivo
Objetivo: Aplicar de forma integrada os conhecimentos de bancos relacionais (PostgreSQL) e não-relacionais (MongoDB) na criação de uma solução de dados moderna e profissional.
1. O Desafio Final: "OmniStore Analytics" 🦸♂️
Você foi contratado para projetar o ecossistema de dados de uma startup global. Eles precisam de uma estrutura que seja rápida, segura e flexível.
Arquitetura Proposta:
- Motor Core (PostgreSQL): Responsável por dados que não podem falhar (Clientes, Login, Faturamento e Inventário Básico).
- Motor Analytics (MongoDB): Responsável por dados flexíveis e volumosos (Logs de acesso, Comentários, Avaliações e histórico de preços variados).
2. Requisitos Obrigatórios 📋
Seu projeto deve conter os seguintes artefatos:
Módulo SQL (PostgreSQL):
- [ ] Script de criação de tabelas (DDL) com chaves estrangeiras.
- [ ] Pelo menos 2 consultas complexas usando
INNER JOINeSUM. - [ ] Uma transação (
BEGIN/COMMIT) simulando uma compra.
Módulo NoSQL (MongoDB):
- [ ] Modelo de documento para o "Perfil Extendido" do usuário ou "Log de Atividades".
- [ ] Um pipeline de agregação (
aggregate) para gerar um relatório de performance. - [ ] Demonstração de um dado aninhado (Embedding).
3. Dicas para um Portfólio de Elite ✨
Para que seu projeto de conclusão se destaque no mercado:
- Documentação: Crie um
README.mdexplicando onde você usou SQL e onde usou NoSQL e por quê. - Diagramas: Utilize o Mermaid no seu arquivo para mostrar a relação entre as tabelas.
- Ambiente Cloud: Mostre capturas de tela do seu banco rodando no MongoDB Atlas.
- Limpeza: Código organizado, identado e comentado.
4. Onde continuar estudando? 📚
O mundo dos dados é vasto. Se você gostou deste curso, pesquise sobre: 1. Data Engineering: Como mover dados entre SQL e NoSQL automaticamente (ETL). 2. Graph Databases (Neo4j): Para sistemas de recomendação complexos. 3. Big Data (Spark/Hadoop): Para processar Terabytes de informação. 4. Cloud Architecture: AWS RDS, Google Cloud Spanner e Azure CosmosDB.
5. Mensagem Final 🌟
Parabéns! Você completou a jornada de Bancos de Dados SQL e NoSQL. Agora você entende as engrenagens silenciosas que sustentam todos os aplicativos e sites que usamos diariamente. O dado é o novo petróleo, e você acaba de se tornar um mestre da sua extração e refinamento.
"Em Deus nós confiamos; todos os outros devem trazer dados." - W. Edwards Deming
FIM DO CURSO 🚀🚀🚀 Desejamos muito sucesso na sua jornada como Especialista em Banco de Dados!
Exercícios
Listas de Exercícios 🏋️
Pratique o que aprendeu com desafios graduais para cada aula.
-
Trilha 1: Fundamentos ---
-
Trilha 2: Core Android ---
-
Trilha 3: Networking ---
-
Trilha 4: Finalização ---
Exercícios: Aula 01 - Introdução a Bancos de Dados 📝
Pratique os conceitos fundamentais de dados, informação e sistemas de gerenciamento.
🟢 Nível: Básico
1. Classificação de Elementos
Classifique os itens abaixo como DADO ou INFORMAÇÃO:
a) 12/10/1995
b) O cliente João nasceu em 12/10/1995
c) R$ 1.500,00
d) O saldo total da conta é R$ 1.500,00
e) A45
2. SGBDR vs Banco de Dados
Explique, com suas palavras, a diferença entre um Banco de Dados e um SGBDR (Sistema Gerenciador de Banco de Dados Relacional). Use a analogia de uma biblioteca (livros vs bibliotecário).
🟡 Nível: Intermediário
3. Vantagens do SGBD
Imagine um cenário onde uma loja guarda suas vendas em um arquivo do Excel compartilhado. Cite três problemas que podem ocorrer à medida que a loja cresce (ex: muitos funcionários acessando ao mesmo tempo) e como um SGBD resolveria isso.
4. Arquitetura Cliente/Servidor
No PostgreSQL, o que acontece quando você digita um comando no pgAdmin e aperta o botão de executar? Descreva o caminho que os dados percorrem entre o cliente e o servidor.
🔴 Nível: Desafio
5. Identificando Entidades
Pense em um aplicativo de Delivery de Comida. Liste pelo menos 4 entidades fundamentais que esse sistema precisa armazenar e cite 3 atributos (dados) para cada uma delas.
Dica: Quem compra? Quem vende? O que é vendido? Como chega até o cliente?
Exercícios: Aula 02 - Modelagem de Dados e Modelo E-R 🏗️
Aplique os conceitos de entidades, atributos, relacionamentos e chaves.
🟢 Nível: Básico
1. Identificando Chaves Primárias
Para as tabelas abaixo, identifique qual atributo seria a melhor escolha para ser a Chave Primária (PK) e justifique: a) Carros: Placa, Modelo, Ano, Cor. b) Alunos: Nome, Data de Nascimento, CPF, Nota. c) Produtos: Nome do Produto, Código de Barras (EAN), Preço.
2. Conceitos Rápidos
Defina brevemente: a) Entidade. b) Chave Estrangeira (FK). c) Cardinalidade 1:N.
🟡 Nível: Intermediário
3. Definindo Cardinalidades
Determine a cardinalidade (1:1, 1:N ou N:N) para os seguintes relacionamentos reais: a) Estado e Cidade. b) Pessoa e CPF. c) Professor e Turma. d) Pedido e Produto.
4. Integridade Referencial na Prática
Imagine que você tem a tabela Autores (PK: id_autor) e a tabela Livros (FK: id_autor). O que acontece com os livros se você tentar excluir um autor que possui 10 livros cadastrados? Por que o SGBD faz isso?
🔴 Nível: Desafio
5. Mini Modelagem: Sistema de Petshop
Crie um esboço (pode ser em texto ou lista) para um sistema de Petshop que precisa armazenar: * Donos (clientes). * Pets (um cliente pode ter vários pets, mas cada pet pertence a um único dono). * Serviços (Banho, Tosa, Consulta - um pet pode fazer vários serviços ao longo do tempo).
O que você deve entregar: 1. Lista de Entidades e seus Atributos. 2. Indicação de PKs e FKs. 3. A cardinalidade entre as entidades.
Exercícios: Aula 03 - Normalização e Estrutura Relacional 📡
Pratique a organização de tabelas seguindo as regras de normalização.
🟢 Nível: Básico
1. Tipos de Dados Corretos
Escolha o melhor tipo de dado (PostgreSQL) para armazenar as seguintes informações: a) Preço de um produto (ex: R$ 49,90). b) Texto longo de uma postagem de blog. c) Quantidade de itens em estoque (número inteiro). d) Data e hora exata de um acesso ao sistema. e) Status de entrega (V ou F).
2. O Conceito de NULL
Explique a frase: "NULL não é zero, nem um espaço vazio". Por que o uso indiscriminado de colunas que aceitam NULL pode ser ruim para o banco?
🟡 Nível: Intermediário
3. Aplicando a 1ª Forma Normal (1FN)
A tabela abaixo está violando a 1FN. Como você a reestruturaria? Tabela: Projetos | ID_Proj | Nome_Projeto | Equipe_Membros (Lista de nomes) | |---|---|---| | 1 | App Mobile | João, Maria, Pedro | | 2 | Site Web | Ana, José |
4. Entendendo a 3ª Forma Normal (3FN)
Observe a tabela: Carros (ID_Carro, Placa, Modelo, Marca_Nome, Marca_Pais).
Por que ela viola a 3FN? Quais tabelas novas você criaria para normalizá-la?
🔴 Nível: Desafio
5. Caso Real: Sistema de Pedidos Mal Estruturado
Você recebeu uma planilha de Excel para importar para o banco, mas ela está "achatada" (flat):
Planilha: Pedido_ID, Data, Cliente_ID, Cliente_Nome, Cliente_Email, Item_Nome, Item_Qtd, Item_Preco_Unitario.
Sua tarefa: 1. Identifique as repetições de dados. 2. Projete o esquema normalizado (mínimo 3 tabelas). 3. Indique as Chaves Primárias (PK) e Estrangeiras (FK).
Exercícios: Aula 04 - DDL (Criação da Estrutura) 🏗️
Coloque em prática a criação de bancos de dados, tabelas e chaves usando SQL.
🟢 Nível: Básico
1. Criando sua primeira Tabela
Escreva o comando SQL para criar uma tabela chamada produtos com as seguintes colunas:
* id: Chave Primária com autoincremento.
* nome: Texto de até 100 caracteres, obrigatório.
* preco: Valor decimal.
* quantidade: Valor inteiro.
2. Comandos Fundamentais
Diferencie, em uma frase cada, a função dos comandos:
a) CREATE DATABASE
b) ALTER TABLE
c) DROP TABLE
🟡 Nível: Intermediário
3. Restrições e Chaves Estrangeiras
Escreva o script SQL para criar um relacionamento entre categorias e produtos:
1. Crie a tabela categorias (id, nome).
2. Adicione a coluna categoria_id na tabela produtos (criada no exercício 1) como uma Chave Estrangeira que aponta para categorias.
4. Modificando Estruturas
Você percebeu que esqueceu de guardar o "E-mail" na tabela de clientes. Escreva o comando ALTER TABLE necessário para adicionar essa coluna com no máximo 150 caracteres.
🔴 Nível: Desafio
5. O Banco da Biblioteca (Script Completo)
Escreva um único script SQL que realize as seguintes tarefas em ordem:
1. Crie as tabelas autores (id, nome, nacionalidade).
2. Crie a tabela livros (id, titulo, ano_publicacao, autor_id).
3. Garanta que o autor_id seja uma FK obrigatória.
4. Crie um Índice para acelerar a busca pelo título do livro.
5. Adicione uma restrição CHECK na tabela livros para que o ano_publicacao seja maior que 1500.
Exercícios: Aula 05 - DML (Manipulação de Dados) ⚙️
Pratique os comandos de inserção, atualização e exclusão de dados.
🟢 Nível: Básico
1. Inserção Simples
Escreva o comando SQL para inserir um novo registro na tabela clientes com os seguintes dados:
* Nome: Carlos Eduardo
* CPF: 123.456.789-00
* Cidade: São Paulo
2. Inserção Múltipla
Você recebeu uma lista de 3 novos produtos para cadastrar. Escreva um único comando INSERT para adicionar:
* Mouse Sem Fio - R$ 89,00 - Estoque: 50
* Teclado Mecânico - R$ 250,00 - Estoque: 20
* Monitor 24" - R$ 900,00 - Estoque: 10
🟡 Nível: Intermediário
3. Atualização Segura
Escreva o comando para atualizar o preço de todos os produtos da categoria Eletrônicos (ID 5) em 5% de aumento.
Dica: Use preco = preco * 1.05.
4. O Perigo do DELETE
Explique o que aconteceria com os dados se você executasse o comando DELETE FROM usuarios; por engano. Qual a importância do Backup e da cláusula WHERE nesse contexto?
🔴 Nível: Desafio
5. Manutenção de Dados Complexa
Imagine que um cliente mudou de cidade e todos os seus pedidos pendentes devem ser atualizados com uma nova "Taxa de Entrega".
1. Escreva o comando para mudar a cidade do cliente João Silva para Curitiba.
2. Escreva o comando para aumentar em R$ 15,00 o valor_total de todos os pedidos do cliente João Silva que ainda não foram entregues (status = 'Pendente').
Exercícios: Aula 06 - DQL Básico 💾
Pratique a arte de perguntar ao banco de dados e obter as respostas corretas.
🟢 Nível: Básico
1. Seleção de Colunas
Escreva o comando SELECT para visualizar apenas o nome e o telefone de todos os clientes cadastrados na tabela clientes.
2. Filtro de Igualdade
Busque todos os dados do produto que possui o Código de Barras (EAN) igual a 7891234567890.
🟡 Nível: Intermediário
3. Uso de Operadores Relacionais
Escreva uma consulta para listar o nome e o estoque de todos os produtos que possuem menos de 10 unidades em estoque, ordenados pela quantidade (do menor para o maior).
4. Busca por Padrões (LIKE)
O gerente pediu uma lista de todos os alunos cujo e-mail termina com @gmail.com. Como seria esse comando SQL?
🔴 Nível: Desafio
5. Filtragem Composta e Ordenação
Você precisa gerar um relatório de segurança. Escreva um comando para:
1. Listar id, usuario e data_acesso da tabela logs.
2. Filtrar apenas acessos que ocorreram fora do horário comercial (antes das 08:00 ou depois das 18:00).
3. Ordenar o resultado da data mais recente para a mais antiga.
Dica: Use WHERE hora < '08:00' OR hora > '18:00'.
Exercícios: Aula 07 - Consultas Avançadas e Agregações 🧪
Pratique a geração de estatísticas e relatórios complexos.
🟢 Nível: Básico
1. Estatística Simples
Escreva uma consulta para encontrar a média de preços de todos os produtos na tabela produtos. Use um apelido (AS) para que a coluna se chame media_precos.
2. Contagem de Registros
Quantos clientes estão cadastrados que moram na cidade de Rio de Janeiro? Use o comando SQL correspondente.
🟡 Nível: Intermediário
3. Agrupamento por Categoria
Escreva o comando SQL que mostre o nome da categoria e o valor total em estoque (preço * quantidade) para cada categoria, ordenado do maior para o menor valor.
4. Filtro em Grupos
Liste todas as cidades que possuem mais de 100 clientes cadastrados. Use o GROUP BY e o HAVING.
🔴 Nível: Desafio
5. Relatório Gerencial
Você precisa descobrir quais vendedores bateram a meta de R$ 10.000,00 em vendas no mês de Outubro.
1. Utilize a tabela vendas (vendedor_id, data, valor).
2. Filtre pela data (Outubro/2024).
3. Agrupe pelo vendedor_id.
4. Mostre apenas quem vendeu acima de 10.000.
5. Ordene o ranking do melhor vendedor para o pior.
Exercícios: Aula 08 - JOINs: Junções entre Tabelas 🔗
Pratique a união de dados vindos de múltiplas tabelas.
🟢 Nível: Básico
1. Meu Primeiro JOIN
Dada a tabela pedidos (id, data, cliente_id) e clientes (id, nome), escreva o SQL para listar o ID do pedido e o Nome do cliente usando um INNER JOIN.
2. Entendendo o LEFT JOIN
Qual o resultado da consulta abaixo?
SELECT p.nome, c.cor FROM produtos p LEFT JOIN cores c ON p.id_cor = c.id;
O que acontecerá se um produto não tiver uma cor cadastrada no banco?
🟡 Intermediário
3. JOIN com Filtro
Liste o nome dos alunos e o nome dos cursos em que eles estão matriculados, mas apenas para o curso de "Informática".
4. Relatório de Inatividade
Você precisa descobrir quais fornecedores nunca nos venderam nada. Escreva uma consulta usando LEFT JOIN entre fornecedores e compras e filtre os resultados onde a compra é NULL.
🔴 Nível: Desafio
5. O Grande Relatório (Multi-JOIN)
Escreva um script SQL para unir 4 tabelas e exibir os seguintes campos:
* Nome do Cliente (clientes)
* Data do Pedido (pedidos)
* Nome do Produto (produtos)
* Nome da Categoria do Produto (categorias)
Regra: Use apelidos para as tabelas (ex: FROM clientes c) para deixar o código mais limpo.
Exercícios: Aula 09 - Transações e Integridade ACID 🔑
Aprenda a proteger seus dados contra falhas e inconsistências.
🟢 Nível: Básico
1. Conceito Fundamental
O que é uma transação de banco de dados? Dê um exemplo do dia a dia (fora do banco) que funcione como "Tudo ou Nada".
2. Comandos de Controle
Explique a diferença entre:
a) BEGIN
b) COMMIT
c) ROLLBACK
🟡 Nível: Intermediário
3. A Propriedade Atomicidade (A do ACID)
Em um sistema de reserva de assentos de cinema, por que a atomicidade é vital quando o usuário escolhe o lugar e realiza o pagamento?
4. Simulação de Problema
Imagine que você abriu um BEGIN, deletou acidentalmente 1.000 linhas da tabela de clientes e, antes de dar o COMMIT, a sua internet caiu e o pgAdmin fechou. O que acontecerá com esses dados? Por quê?
🔴 Nível: Desafio
5. Transferência de Saldo (Código SQL)
Escreva o script SQL completo para realizar a transferência de R$ 250,00 da conta do Cliente A para o Cliente B.
* O script deve garantir que o Cliente A possui saldo suficiente antes de tirar (usando lógica hipotética ou apenas o comando).
* Se houver um erro simulado no meio do processo, o que você deve fazer?
* Inclua os comandos de início, alteração e finalização.
Exercícios: Aula 10 - Projeto Parcial 🔐
Finalize o Módulo II testando sua capacidade de integração.
🟢 Nível: Básico
1. Revisão de Conceitos
Explique em um parágrafo como o DDL e o DML trabalham juntos em um projeto de software.
2. Identificação de Erros
Observe o script abaixo e aponte pelo menos 2 erros de integridade ou lógica:
CREATE TABLE vendas (
id INT,
produto VARCHAR(50),
preco DECIMAL,
data DATE
);
INSERT INTO vendas VALUES (1, 'Celular', -100, '2024-01-01');
🟡 Nível: Intermediário
3. DQL de Auditoria
Escreva uma consulta que retorne o nome do cliente e a quantidade total de pedidos que ele já fez, mas exiba apenas os clientes que fizeram zero pedidos. (Dica: Use LEFT JOIN e COUNT).
4. Transação de Cancelamento
Escreva o bloco de comandos (BEGIN...COMMIT) para cancelar um pedido:
1. Apagar o registro em itens_pedido.
2. Apagar o registro em pedidos.
3. O que acontece se você inverter a ordem e tentar apagar o pedido antes dos itens?
🔴 Nível: Desafio
5. O Desafio do DBA
Você foi solicitado a otimizar um banco que está lento.
1. Cite 3 colunas que obrigatoriamente deveriam ter Índices.
2. Escreva a consulta para mostrar o faturamento total por categoria, ordenado do maior para o menor.
3. Escreva uma restrição CHECK para garantir que a data de entrega nunca seja anterior à data do pedido.
Exercícios: Aula 11 - Introdução ao NoSQL e MongoDB 🌐
Explore os conceitos fundamentais que diferenciam o NoSQL dos bancos tradicionais.
🟢 Nível: Básico
1. Definição NoSQL
O que significa o termo NoSQL? É correto dizer que bancos NoSQL não aceitam comandos SQL? Explique.
2. Identificação de Tipos
Associe o banco de dados à sua categoria NoSQL: a) MongoDB -> ( ) Grafo b) Redis -> ( ) Colunar c) Neo4j -> ( ) Documento d) Cassandra -> ( ) Chave-Valor
🟡 Nível: Intermediário
3. SQL vs NoSQL (Cenários)
Para os cenários abaixo, qual modelo você escolheria e por quê? a) Um sistema bancário de transferências financeiras críticas. b) Um sistema de logs de sensores de IoT que gera milhões de registros por segundo. c) Um catálogo de e-commerce onde os produtos mudam de atributos constantemente (ex: um tênis tem "tamanho", mas um computador tem "processador").
4. Entendendo Documentos (JSON)
Escreva um pequeno documento JSON que represente um Livro, contendo: titulo, autor (objeto com nome e país), ano e uma lista de categorias.
🔴 Nível: Desafio
5. O Teorema CAP
Explique, com suas palavras, por que é impossível garantir Consistência, Availabilidade e Partição ao mesmo tempo em um sistema distribuído. Se um cabo de rede for cortado separando os servidores (Partição), o que o administrador deve priorizar?
Exercícios: Aula 12 - Instalação e CRUD Básico (MongoDB) 🍃
Coloque a mão na massa com o banco de dados orientado a documentos.
🟢 Nível: Básico
1. Preparação
Você já instalou o MongoDB Compass ou Atlas? Tire um print da tela inicial conectada ao banco.
2. Inserção Simples
Crie uma coleção chamada livros e insira 3 documentos com campos titulo, autor e ano.
🟡 Nível: Intermediário
3. Filtros no Find
Escreva o comando para buscar todos os livros publicados após o ano 2010. (Dica: Use $gt).
4. Atualização de Dados
Houve um erro no cadastro. O autor "Joao" agora se chama "João Silva". Escreva o comando updateOne para corrigir apenas este documento.
🔴 Nível: Desafio
5. Manipulação de Arrays (O Poder do NoSQL)
No MongoDB, campos podem ser listas.
1. Insira um documento na coleção usuarios:
{ nome: "Carlos", tags: ["Estudante", "Inovador"] }
2. Escreva o comando para adicionar a tag "SQL" ao array do usuário "Carlos". (Pesquise sobre o operador $push).
3. Como você buscaria todos os usuários que possuem a tag "Inovador"?
Exercícios: Aula 13 - Modelagem de Documentos (NoSQL) 🏗️
Aprenda a arte de decidir entre unir ou separar seus dados no MongoDB.
🟢 Nível: Básico
1. Conceitos de Modelagem
Explique com suas palavras a diferença entre as estratégias de Embedding e Referencing.
2. Escolha de Estratégia
Em um sistema de biblioteca, você armazenaria os capítulos de um livro de forma Aninhada ou Referenciada no documento do Livro? Justifique.
🟡 Nível: Intermediário
3. Modelagem de Usuário
Desenhe um JSON de um usuário que contenha:
* Nome e E-mail.
* Três endereços aninhados (Casa, Trabalho, Praia).
* Uma lista de IDs de fotos_perfil (Referenciadas).
4. Vantagens e Desvantagens
Cite uma vantagem de performance e uma desvantagem de manutenção ao usar o Embedding.
🔴 Nível: Desafio
5. O Cenário Híbrido
Imagine um sistema de rede social como o Twitter. 1. O perfil do usuário deve ter os nomes dos seus 5 amigos mais próximos aninhados. 2. As postagens do usuário (que podem ser milhares) devem ser referenciadas. 3. Escreva o JSON que represente esse perfil de usuário seguindo essa lógica. 4. Por que guardamos os nomes dos amigos aninhados se já temos os IDs deles? (Dica: Pesquise por Extended Reference Pattern).
Exercícios: Aula 14 - Consultas e Agregações no MongoDB 🧪
Aprenda a processar dados e gerar relatórios poderosos no MongoDB.
🟢 Nível: Básico
1. Pipeline Simples
Explique com suas palavras como funciona a ideia de "Pipeline" (Linha de montagem) no MongoDB.
2. Etapas de Agregação
Quais os equivalentes no SQL para as seguintes etapas do MongoDB:
a) $match ->
b) $group ->
c) $sort ->
d) $limit ->
🟡 Nível: Intermediário
3. Somando Valores
Dada a coleção vendas (vendedor, valor, data), escreva o pipeline de agregação para calcular o valor total vendido por vendedor.
4. O JOIN do NoSQL
Você tem a coleção posts e a coleção autores. Os posts possuem um campo autor_id. Escreva o comando $lookup para trazer os dados do autor dentro de cada post.
🔴 Nível: Desafio
5. Análise de Performance
Por que é recomendado que a etapa $match seja sempre a primeira do seu pipeline de agregação? O que aconteceria se você colocasse um $match após um $group que processou milhões de registros?
6. Desafio do $unwind
Muitos documentos no MongoDB possuem arrays (listas). Pesquise o que faz o operador $unwind e dê um exemplo de uso para um documento de Pedido que contém um array de itens.
Exercícios: Aula 15 - Ecossistema Moderno e Cloud 🚀
Reflita sobre o uso profissional de bancos de dados na nuvem e arquiteturas modernas.
🟢 Nível: Básico
1. Quando usar NoSQL
Cite 2 cenários de aplicativos reais (ex: Instagram, Uber, App de Banco) onde o MongoDB seria a escolha ideal para uma parte do sistema.
2. O conceito de Nuvem
O que é o MongoDB Atlas e qual a principal facilidade que ele traz para um desenvolvedor iniciante?
🟡 Nível: Intermediário
3. Persistência Poliglota
Imagine que você está criando o próximo "Facebook". * Qual banco você usaria para guardar as configurações de login dos usuários? (SQL ou NoSQL?) * Qual banco você usaria para guardar o feed de notícias (posts com imagens e textos variados)? (SQL ou NoSQL?) Justifique suas escolhas.
4. Segurança de Dados
Por que é uma prática perigosa liberar o acesso ao banco de dados para "qualquer IP" (0.0.0.0/0)? O que você deve configurar no painel do Atlas para evitar isso?
🔴 Nível: Desafio
5. Escalabilidade e Custos
Pesquise a diferença entre Escalabilidade Vertical e Escalabilidade Horizontal. Por que o MongoDB leva vantagem na Escalabilidade Horizontal quando falamos de Petabytes de dados?
6. IA e MongoDB
Como a funcionalidade de Vector Search do MongoDB pode ajudar na criação de um sistema de recomendação de filmes inteligente?
Exercícios: Aula 16 - Revisão Geral 🎓
Prepare-se para o seu projeto final revisando os pontos chave de todo o curso.
🟢 Nível: Básico
1. O Mapa Mental
Desenhe um diagrama simples (pode ser texto) que conecte: Aplicação -> SQL -> NoSQL. Qual o papel de cada peça?
2. Vocabulário Cruzado
Preencha o que falta: * Tabela (SQL) = __ (NoSQL) * Linha (SQL) = __ (NoSQL) * JOIN (SQL) = _____ (NoSQL)
🟡 Nível: Intermediário
3. Decisão de Arquiteto
Um cliente quer criar um app de "Lista de Desejos". 1. O nome e e-mail do cliente devem ser únicos e consistentes. (Qual banco?) 2. Cada item da lista de desejos pode ter campos malucos (um quer "tamanho", outro quer "voltagem", outro quer "cor"). (Qual banco?) Como você integraria os dois?
🔴 Nível: Desafio (O Mini-Projeto)
4. Integração Conceitual
Imagine que você tem o ID de um usuário no PostgreSQL (user_id = 45). Como você faria para buscar as preferências desse usuário que estão salvas no MongoDB? Escreva a lógica (em texto ou pseudo-código) dessa integração.
Projetos
Projetos de Fixação 🚀
Nesta seção, você encontrará os mini-projetos práticos para cada aula do curso. O objetivo é aplicar os conceitos teóricos imediatamente em cenários reais.
🛠️ Módulo I: Fundamentos (Aulas 01-04)
- Projeto 01: Lab de Instalação e pgAdmin 🐘
- Projeto 02: Modelagem de Pequeno Sistema 🏗️
- Projeto 03: Normalização de Planilhas 📡
- Projeto 04: Script DDL de Criação 🧱
⚙️ Módulo II: SQL na Prática (Aulas 05-10)
- Projeto 05: Inserção de Dados Reais ⚙️
- Projeto 06: Consultas e Filtros 💾
- Projeto 07: Relatórios de Agregação 🧪
- Projeto 08: Consultas Multi-tabelas 🚢
- Projeto 09: Simulação de Transações Bancárias 🔑
- Projeto 10: Sistema Relacional Parcial 🔐
🍃 Módulo III: NoSQL (Aulas 11-15)
- Projeto 11: Comparativo Relacional vs NoSQL 🌐
- Projeto 12: Operações CRUD no MongoDB 🍃
- Projeto 13: Modelagem de Documentos 🧱
- Projeto 14: Pipelines de Agregação 🔄
- Projeto 15: Deploy e Segurança na Nuvem 🛣️
🎓 Encerramento
Projeto 01: Lab de Instalação e pgAdmin 🐘
Objetivo: Garantir que o ambiente de desenvolvimento esteja 100% funcional.
🚀 Tarefas
- Instalação: Siga o Setup 01 para instalar o PostgreSQL.
- Conexão: Abra o pgAdmin 4 e crie uma conexão com o servidor local (
localhost). - Terminal: Use o comando
psql -U postgresno seu prompt para verificar a versão instalada. - Primeiro Comando: Crie um banco de dados de teste chamado
laboratorio_01.
✅ Critérios de Entrega
- Screenshot do pgAdmin mostrando o servidor conectado.
- Screenshot do terminal com a versão do PostgreSQL.
Projeto 02: Modelagem de um Sistema de Escola 🏗️
Objetivo: Criar o Diagrama Entidade-Relacionamento (DER) para um cenário real.
📝 Cenário
Você foi contratado para modelar o banco de dados de uma escola. O sistema deve armazenar: * Alunos: Nome, Matrícula, Data de Nascimento. * Turmas: Nome da Turma (ex: ADS 1A), Sala. * Professores: Nome, Especialidade.
Regras: 1. Um aluno pertence a uma única turma. 2. Uma turma pode ter vários alunos. 3. Um professor pode dar aula para várias turmas.
🚀 Tarefas
- Identifique as Entidades e Atributos.
- Defina as Chaves Primárias.
- Desenhe o diagrama usando dbdiagram.io ou Mermaid.
✅ Critérios de Entrega
- O link ou imagem do diagrama DER completo.
Projeto 03: Normalização de Planilhas 📡
Objetivo: Transformar dados brutos e redundantes em uma estrutura relacional limpa.
📝 O Desafio
Abaixo está uma linha de uma planilha de "Histórico de Vendas":
Venda_ID, Cliente_Nome, Cliente_Telefone, Data_Venda, Produtos_Lista (ex: Camisa, Calça, Meia), Valor_Total
🚀 Tarefas
- Identifique as violações da 1FN (Valores atômicos).
- Separe os dados em pelo menos 3 tabelas (ex: Clientes, Vendas, Itens_Venda).
- Garanta que não haja redundância de nomes de clientes ou preços de produtos.
✅ Critérios de Entrega
- Lista das tabelas criadas com suas colunas e tipos.
- Justificativa de qual Forma Normal foi aplicada em cada etapa.
Projeto 04: Script DDL de Criação 🧱
Objetivo: Transformar o seu modelo de dados em código SQL executável.
🚀 Tarefas
- Abra o Query Tool no pgAdmin.
- Escreva o script
CREATE TABLEpara o sistema de Escola planejado no Projeto 02. - Inclua:
- Chaves Primárias (
SERIAL). - Chaves Estrangeiras (
REFERENCES). - Restrições
NOT NULLeUNIQUE.
- Chaves Primárias (
- Crie um Índice para a coluna "Nome do Aluno".
✅ Critérios de Entrega
- O arquivo
.sqlcontendo todos os comandos de criação. - Print da aba "Tables" do pgAdmin mostrando as tabelas criadas.
Projeto 05 - Layouts e Unidades 🎨
Objetivo: Praticar a construção de interfaces complexas com diferentes ViewGroups.
O Desafio
Crie uma tela de "Detalhes de Produto" (tipo e-commerce) contendo:
1. LinearLayout (Vertical) para a estrutura principal.
2. ImageView no topo para a foto do produto.
3. ConstraintLayout para a área de informações (nome do produto à esquerda, preço à direita, ambos alinhados).
4. Botão de "Comprar" ocupando a largura total na parte inferior.
5. Use dp para margens (mínimo 16dp) e sp para o título do produto.
Dica
Teste o seu layout em diferentes tamanhos de tela no emulador ou no Preview do Android Studio.
Projeto 06: Consultas e Filtros 💾
Objetivo: Transformar perguntas do negócio em comandos SQL SELECT eficientes.
📝 O Desafio
O dono da loja precisa de algumas informações estratégicas para a Black Friday. Utilize sua tabela de produtos (ou crie uma com pelo menos 10 itens) para responder às perguntas.
🚀 Tarefas
Escreve os comandos SQL para: 1. Relatório de Estoque Baixo: Selecionar nome e estoque de produtos com menos de 5 itens. 2. Vitrine de Ofertas: Selecionar todos os produtos que custam entre R$ 50,00 e R$ 200,00. 3. Busca por Marca: Selecionar todos os produtos que tenham "Samsung" ou "Apple" no nome. 4. Organização por Preço: Listar todos os produtos da categoria 'Eletrônicos', do mais caro para o mais barato. 5. Lista Única: Quais categorias diferentes existem cadastradas no seu banco?
✅ Critérios de Entrega
- O script
.sqlcom os 5 comandos comentados. - Screenshot dos resultados no pgAdmin.
Projeto 07: Relatórios de Agregação 🧪
Objetivo: Criar uma suíte de relatórios estatísticos usando funções de agregação e agrupamento.
📝 O Desafio
Imagine que você trabalha no setor de análise de uma rede de farmácias. Você precisa extrair os seguintes indicadores do banco de dados.
🚀 Tarefas
Escreva os comandos SQL para: 1. Faturamento Total: Qual a soma de todos os valores de vendas registrados? 2. Média de Preços: Qual o preço médio dos medicamentos por categoria? 3. Contagem de Clientes: Quantos clientes cadastrados existem em cada cidade? 4. Ranking de Vendas: Quais são os 3 vendedores que mais realizaram vendas (em quantidade)? 5. Filtro de Qualidade: Liste apenas as cidades que possuem mais de 500 clientes cadastrados.
✅ Critérios de Entrega
- O script
.sqlcom as consultas numeradas. - Uso obrigatório de
ASpara nomear as colunas de resultado. - Screenshot dos resultados no pgAdmin.
Projeto 08: Consultas Multi-tabelas (JOINs) 🚢
Objetivo: Relacionar dados de diferentes partes do banco para gerar relatórios consolidados.
📝 O Desafio
Você precisa criar o relatório de fechamento de um sistema de E-commerce. O banco possui as tabelas: clientes, pedidos e vendedores.
🚀 Tarefas
Escreva o script SQL que resolva:
1. Relatório de Pedidos: Listar o ID do pedido, a data e o Nome do Cliente que fez a compra.
2. Lista de Vendedores Ativos: Listar o nome de todos os vendedores e o ID dos pedidos que eles realizaram (mesmo que um vendedor ainda não tenha feito nenhuma venda).
3. Relatório Completo: Unir Clientes e Pedidos para mostrar apenas quem já comprou pelo menos uma vez.
4. Clientes Sem Pedidos: Descobrir o nome dos clientes que ainda não realizaram nenhuma compra (Dica: Use LEFT JOIN e WHERE ... IS NULL).
✅ Critérios de Entrega
- Uso de aliases (
AS) para as tabelas. - Script
.sqllimpo e comentado. - Screenshot dos resultados no pgAdmin.
Projeto 09: Simulação de Transações Bancárias 🔑
Objetivo: Implementar o controle de transações para garantir a consistência de dados em operações financeiras.
📝 O Desafio
Você deve simular o sistema de transferências de um banco digital. Existem duas tabelas: contas (id, cliente, saldo) e historico_transferencias (id, origem_id, destino_id, valor, data).
🚀 Tarefas
Escreve o script SQL para realizar uma transferência de R$ 300,00 de "Ana" para "Bia":
1. Inicie a transação (BEGIN).
2. Verifique se Ana tem saldo (apenas via comentário ou lógica simples).
3. Subtraia o valor da conta da Ana.
4. Adicione o valor na conta da Bia.
5. Insira o registro no histórico.
6. Simulação de Falha: Imagine que o sistema de histórico caiu. Execute um ROLLBACK e verifique os saldos.
7. Finalização: Repita o processo, mas finalize com COMMIT.
✅ Critérios de Entrega
- O script
.sqlcontendo os dois blocos (o que falha e o que funciona). - Print do saldo das contas antes e depois de cada operação.
Projeto 10: Sistema Relacional Parcial 🔐
Objetivo: Construir do zero um ecossistema de banco de dados para um E-commerce, aplicando todos os comandos SQL aprendidos até aqui.
📝 O Grande Desafio: TechStore v1.0
Você recebeu a missão de criar o backend (BD) da TechStore. O sistema deve ser robusto, normalizado e rápido.
🚀 Etapas do Projeto
1. Modelagem e Criação (DDL)
- Crie as tabelas:
categorias,produtos,clientes,pedidoseitens_pedido. - Defina as chaves e os relacionamentos.
- Crie uma restrição que impeça o estoque de ser negativo.
- Crie um índice na coluna
nomeda tabelaprodutos.
2. Povoamento (DML)
- Insira pelo menos 3 categorias (Ex: Smartphones, Laptops, Acessórios).
- Insira 10 produtos variados.
- Cadastre 5 clientes.
3. Simulando uma Venda (Transação)
- Crie um script que:
- Abre uma transação.
- Registra um pedido para um cliente.
- Adiciona 2 itens a esse pedido.
- Atualiza o estoque desses 2 produtos.
- Finaliza com
COMMIT.
4. Relatórios de Gestão (DQL)
- Crie uma consulta que mostre:
Nome do Cliente,Data do PedidoeValor Total do Pedido. (Dica: Use JOIN e SUM). - Crie um ranking das categorias que mais possuem produtos cadastrados.
✅ Critérios de Entrega
- Um arquivo
techstore_completo.sqlcom todos os comandos comentados. - Diagrama E-R gerado pelo pgAdmin ou Mermaid.
- Print do resultado do relatório de faturamento por cliente.
Projeto 11: Comparativo Relacional vs NoSQL 🌐
Objetivo: Analisar criticamente as diferenças entre os modelos e converter uma estrutura relacional para o formato de documento.
📝 O Desafio
Você tem o modelo de um Blog no PostgreSQL:
* Tabela Autores (id, nome)
* Tabela Posts (id, titulo, conteudo, autor_id)
* Tabela Comentarios (id, texto, post_id)
🚀 Tarefas
- Mapeamento: Desenhe como essa estrutura ficaria em um único documento JSON no MongoDB (utilizando aninhamento).
- Análise de Vantagens: Liste 3 vantagens de usar o MongoDB para este cenário de Blog.
- Análise de Riscos: Liste 2 riscos de segurança ou integridade que o MongoDB traz em comparação ao PostgreSQL.
✅ Critérios de Entrega
- O código JSON formatado do post com seus comentários e autor.
- Um pequeno texto (bullet points) comparativo.
Projeto 12: O Grande Inventário NoSQL 🍃
Objetivo: Aplicar os comandos de CRUD no MongoDB para gerenciar um catálogo de produtos flexível.
📝 O Desafio
Você está criando o sistema de estoque para uma loja de variedades que vende desde eletrônicos até roupas. Como os produtos são muito diferentes, você escolheu o MongoDB.
🚀 Tarefas
- Criação: Crie um banco chamado
loja_nosqle uma coleçãoestoque. - Inserção Variada: Insira 3 documentos com campos diferentes:
- Um Smartphone (com campos de bateria e memória).
- Uma Camisa (com campos de tamanho e tecido).
- Um Livro (com campos de autor e páginas).
- Busca Filtrada: Escreva o comando para localizar todos os produtos que custam acima de R$ 100,00.
- Atualização Geral: Adicione um campo
loja: "Sede Principal"em todos os produtos do estoque. - Exclusão: Delete o produto que possui o menor estoque.
✅ Critérios de Entrega
- Um arquivo
.jscom os comandos usados no mongosh. - Screenshot do MongoDB Compass mostrando os documentos inseridos.
Projeto 13: Arquitetando o Banco de um App de Música 🏗️
Objetivo: Aplicar padrões de modelagem NoSQL para um cenário real de streaming de música.
📝 O Desafio
Você foi contratado para desenhar o banco de dados de um novo "Spotify". Você precisa decidir como armazenar as informações para que o app seja veloz.
🚀 Tarefas
- Modelagem de Playlist: Desenhe o JSON de uma
Playlist. Ela deve conter o nome, o autor e uma lista das 10 primeiras músicas (nome e duração). Você vai usar Aninhamento ou Referência para as músicas totais da playlist? - Modelagem de Artista: Como guardar a biografia e a lista de álbuns?
- Justificativa: Escreva um pequeno parágrafo explicando por que você escolheu aninhamento para as músicas da playlist (ou por que não escolheu).
- Criação no MongoDB: Execute os comandos
insertOneno mongosh para criar um exemplo real das coleçõesartistaseplaylists.
✅ Critérios de Entrega
- O desenho dos 2 esquemas JSON.
- O script
.jscom as inserções. - Explicação técnica da escolha da estratégia.
Projeto 14: Relatórios Analíticos no MongoDB 🧪
Objetivo: Utilizar o Aggregation Framework para gerar inteligência de negócio a partir de dados brutos.
📝 O Desafio
Você tem uma coleção de vendas com os campos: cliente, produto, quantidade, valor_unitario, categoria e data.
🚀 Tarefas
Crie os pipelines de agregação para responder:
1. Faturamento por Categoria: Qual o valor total vendido em cada categoria de produtos?
2. Ticket Médio: Qual a média de valor gasto pelos clientes em suas compras?
3. Top 3 Vendedores: Quais são os 3 vendedores que mais faturaram? (Supondo que haja um campo vendedor).
4. Clientes Inativos (Desafio): Utilize o $lookup para comparar a coleção de clientes com a de vendas e encontrar quem nunca comprou nada.
✅ Critérios de Entrega
- O script
.jscom os pipelines comentados. - Uso de pelo menos 4 estágios diferentes (
$match,$group,$sort,$project). - Screenshot dos resultados no MongoDB Compass.
Projeto 15: Deploy e Segurança na Nuvem 🚀
Objetivo: Realizar o deploy de um banco de dados MongoDB na nuvem e configurar as camadas de segurança essenciais.
📝 O Desafio
Você deve levar o seu projeto "loja_nosql" da Aula 12 para o mundo real, utilizando o MongoDB Atlas.
🚀 Tarefas
- Criação do Cluster: Crie uma conta no MongoDB Atlas e configure um cluster gratuito (Plano M0).
- Segurança:
- Crie um usuário de banco com acesso de leitura e escrita.
- Adicione o seu IP atual na lista de permissões (Whitelist).
- Migração: Utilize o MongoDB Compass para exportar os dados do seu banco local e importar no cluster do Atlas.
- Teste de Conexão: Verifique se você consegue consultar os documentos na nuvem através do shell (
mongosh) ou do próprio Compass. - Relatório de Arquitetura: Escreva um pequeno texto explicando em qual provedor de nuvem (AWS, GCP ou Azure) o seu banco foi hospedado e por que a segurança por IP é necessária.
✅ Critérios de Entrega
- A
connection stringdo seu cluster (oculte a senha!). - Screenshot do painel do MongoDB Atlas mostrando o cluster ativo.
- Screenshot dos dados visualizados no Compass via conexão Atlas.
Projeto 16: Projeto Final Integrador - OmniStore 🎓
Objetivo: Integrar os mundos SQL e NoSQL para criar uma arquitetura de dados moderna, robusta e escalável para uma startup de varejo.
📝 O Desafio: OmniStore Global
A OmniStore é uma rede que vende produtos físicos e digitais em 50 países. Você foi escalado como Líder de Dados para projetar a V1.0 do sistema.
🚀 Requisitos do Projeto
Parte 1: O Núcleo Relacional (PostgreSQL)
- Modelagem: Crie as tabelas de
usuarios,pedidosepagamentos. - Segurança: Implemente uma transação que, ao registrar um pagamento, mude o status do pedido para "Pago".
- Relatório: Gere um ranking dos top 5 clientes que mais gastaram na loja.
Parte 2: O Cérebro Flexível (MongoDB)
- Modelagem: Crie a coleção
catalogo_produtos. Como cada produto tem atributos diferentes (ex: uma TV tem Polegadas, mas um Sapato tem Tamanho), use a flexibilidade do NoSQL. - Engajamento: Modele as
avaliacoes(reviews) dos produtos. Elas devem ser aninhadas ou referenciadas? Explique no código. - Agregação: Crie um pipeline que mostre a média de nota (rating) por categoria de produto.
Parte 3: Integração e Documentação
- Escreva um documento (Markdown) explicando por que você não usou apenas UM tipo de banco.
- Descreva qual o papel do MongoDB Atlas nessa arquitetura.
- Inclua links ou screenshots para os scripts SQL e comandos do MongoDB.
✅ Critérios de Avaliação
- Completude: Cumprimento de todos os requisitos técnicos.
- Qualidade: Código identado, comentado e sem erros.
- Arquitetura: Escolha correta de qual dado vai para qual banco.
- Apresentação: README.md claro e profissional no repositório.
🎓 Parabéns!
Este é o ápice do seu aprendizado. Ao terminar este projeto, você terá em mãos um portfólio de peso para apresentar em qualquer entrevista técnica! 🚀
Quizzes
Quizzes Interativos 🧠
Teste seus conhecimentos rapidamente ao final de cada módulo.
-
Fase 1 ---
-
Fase 2 ---
-
Fase 3 ---
-
Fase 4 ---
Quiz 01 - Introdução ao Desenvolvimento Mobile 📱
Quiz 02 - Fundamentos de Java para Android ☕
Quiz 03 - Introdução ao Kotlin Moderno ⚡
Quiz 04 - Estrutura de um Aplicativo Android 🏗️
Quiz 05 - Interface Gráfica (UI) 🎨
Quiz 06 - Navegação e Intents 🗺️
Quiz 07 - Arquitetura MVVM 🏗️
Quiz 08 - Persistência de Dados (Room) 💾
Quiz 09 - Listas Eficientes (RecyclerView) 📋
Quiz 10 - APIs REST & Retrofit 🌍
Quiz 11 - Threads e Coroutines 🧵
Quiz 12 - UX/UI e Material Design 3 🎨
Quiz 13 - Hardware e Sensores 📸
Quiz 14 - Testes, Qualidade e Debugging 🐞
Quiz 15 - Publicação e Google Play Store 🚀
Quiz 16 - Revisão Geral e Próximos Passos 🎓
Slides
Slides 📺
Material visual para acompanhamento das vídeo-aulas.
-
Módulo 1 ---
-
Módulo 2 ---
-
Módulo 3 ---
-
Módulo 4 ---
Aula 01 - Introdução ao Mobile 📱
Bem-vindo ao Mundo Mobile! 🌍
O mundo hoje é mobile-first.
- Mais acesso via smartphone que PC.
- Bilhões de dispositivos ativos.
- Ecossistema dinâmico e lucrativo.
🎯 Nossa Agenda de Hoje
- Panorama do Mercado
- Nativo vs Híbrido vs Web
- Android vs iOS
- Android Studio & Ferramentas
- Por onde começar?
📱 1. Os Três Caminhos
Existem três formas principais de criar um App.
🚀 Nativo
Desenvolvido na linguagem "mãe" da plataforma.
- Android: Kotlin / Java 🤖
- iOS: Swift / Objective-C 🍎
- Vantagem: Performance máxima e acesso total ao hardware.
🌐 Web (PWA)
Basicamente um site que se comporta como App.
- Tecnologias: HTML, CSS, JS.
- Vantagem: Custo baixo, funciona em tudo.
- Desvantagem: Performance limitada e pouco acesso ao hardware.
🧩 Híbrido / Cross-Platform
Usa um framework para gerar ambas as plataformas.
- Exemplos: Flutter, React Native.
- Vantagem: Uma base de código para dois apps.
- Desvantagem: Dependência de terceiros e overhead de performance.
🤖 2. O Gigante Verde: Android
O sistema operacional mais usado do planeta.
- Criado pelo Google.
- Baseado em Linux.
- Aberto e flexível.
Arquitetura Android
graph TD
A[Apps] --> B[Java/Kotlin Framework]
B --> C[ART Runtime]
C --> D[Hardware Abstraction - HAL]
D --> E[Linux Kernel]
🍎 3. O Pomar da Apple: iOS
Foco em luxo, fluidez e segurança.
- Criado pela Apple.
- Sistema Fechado (Darwin/Unix).
- Consumidores com alto poder aquisitivo.
Android vs iOS 🆚
| Recurso | Android | iOS |
|---|---|---|
| Linguagem | Kotlin | Swift |
| IDE | Android Studio | Xcode |
| Loja | Google Play | App Store |
| Taxa | $25 (Única) | $99 (Anual) |
🛠️ 4. Sua Oficina: Android Studio
A ferramenta oficial para criar apps Android.
- Baseada no IntelliJ IDEA.
- Emulador integrado.
- Layout Editor visual.
⚠️ Requisitos de Hardware
Para não passar raiva:
- RAM: 8GB (Mínimo) / 16GB (Sonho).
- Disco: SSD é OBRIGATÓRIO.
- Processador: i5 ou superior.
📂 5. Anatomia de um Projeto
O que tem dentro das pastas?
O Manifesto 📜
O arquivo AndroidManifest.xml é o "RG" do seu App.
- Nome do App.
- Quais telas existem (Activities).
- Quais permissões ele precisa (Internet, Câmera).
🧠 6. Por que Nativo?
Frameworks vêm e vão, mas o Nativo permanece.
"Quem entende a base, não teme a mudança."
🆚 Kotlin vs Swift
São linguagens "irmãs" na sintaxe!
🚀 Desafio de Hoje
- Instalar o Android Studio.
- Criar seu primeiro projeto "Empty Activity".
- Mudar o texto do "Hello World" para seu nome.
🏁 Conclusão
- Mobile é o presente e o futuro.
- Escolher o caminho Nativo te dá superpoderes.
- Próxima aula: Java para Android.
❓ Dúvidas?
Siga para o canal oficial da disciplina no Teams!
Fim da Aula 01 👋
Aula 02 - Java para Android ☕
🎯 Por que aprender Java em 2026?
"O Kotlin não matou o Java?"
- Base Sólida: O Android é feito de Java.
- Legado: Bilhões de linhas de código em produção.
- Mercado: Muitas empresas pedem os dois.
🧱 A Base da Sintaxe
Java é uma linguagem de tipagem estática e explícita.
📦 Variáveis e Tipos
Onde guardamos os dados na memória.
- int: Números inteiros.
- double: Números decimais.
- boolean: true ou false.
- String: Texto (É uma classe!).
Cuidado com o Null! 👻
Em Java, objetos podem ser null.
Isso causa o famoso NullPointerException.
🔀 Estruturas de Decisão
int idade = 20;
if (idade >= 18) {
System.out.println("Pode dirigir");
} else {
System.out.println("Aguarde mais um pouco");
}
🔁 Estruturas de Repetição
🏛️ Orientação a Objetos (POO)
O coração do desenvolvimento nativo.
- Classe: O molde (Planta da casa).
- Objeto: A instância (A casa construída).
Exemplo: Classe Carro 🚗
🧬 Herança: O extends
No Android, usamos herança o tempo todo.
🔒 Encapsulamento
Proteja seus dados!
- public: Todos veem.
- private: Só a classe vê.
Use getters e setters para acessar dados privados.
🗺️ Android Studio: Onde o Java vive
Ao criar um App, o código Java fica na pasta:
app/src/main/java/
Ciclo de Vida: O onCreate
O primeiro contato com o Android.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
🔬 Comparação: Java vs Swift
No iOS (Swift), os conceitos são os mesmos, muda a "roupa".
- Java:
public class - Swift:
class(mais simples)
🛠️ Ferramentas da Aula
- JDK instalado.
- IntelliJ ou Android Studio.
- Treinar lógica básica no console.
🧩 Exercício Rápido
Crie uma classe Usuario com:
* Nome (String)
* Idade (int)
* Método verificarIdade() que diz se é maior de idade.
⚡ De Java para Kotlin
Na aula de hoje vimos Java. Nas próximas, veremos como o Kotlin simplifica TUDO isso.
Mas sem entender o Java, você será apenas um "copiador de código".
🏁 Resumo
- Java é a fundação.
- POO é essencial para Android.
- Classes, Atributos e Métodos são seus novos amigos.
❓ Pergunta do Dia
"Posso criar um app Android sem saber nadinha de Java?"
Pode, mas na primeira biblioteca antiga que você baixar, vai travar!
Próxima Aula: Kotlin Moderno ⚡
Valeu, pessoal! 👋
Aula 03 - Kotlin Moderno ⚡
🚀 O que é Kotlin?
A linguagem que mudou o Android.
- Criada pela JetBrains (2011).
- Oficial no Android (Google I/O 2017).
- Moderna, Segura e Concisa.
🛡️ Null Safety: O Fim dos Crashes
O pesadelo do Java era o null.
O Kotlin resolveu isso na raiz.
Para permitir nulos:
📦 Variáveis: val vs var
No Kotlin, preferimos a imutabilidade.
- val: Imutável (referência não muda). 🔒
- var: Mutável (pode mudar o valor). 🔓
⚡ Inferência de Tipos
O Kotlin é inteligente. Ele sabe o tipo sem você dizer.
💬 Interpolação de Strings
Diga adeus ao + " " +.
🕴️ Operador Elvis ?:
"Se for nulo, faça isso".
🛠️ Funções: Simplicidade
fun somar(a: Int, b: Int): Int {
return a + b
}
// Versão "Single Line"
fun somar(a: Int, b: Int) = a + b
🏗️ Estruturas de Decisão
O if e o when no Kotlin são expressões (retornam valor).
val status = if (nota >= 6) "Aprovado" else "Reprovado"
when (nota) {
10 -> println("Genial!")
in 7..9 -> println("Muito bom")
else -> println("Tente mais")
}
📋 Coleções
Listas que facilitam a vida.
val numeros = listOf(1, 2, 3) // Imutável
val nomes = mutableListOf("Ana", "Bia") // Mutável
nomes.add("Caio")
🏛️ Classes e Objetos
Mais limpo que o Java.
class Carro(val model: String, var ano: Int)
val meuCarro = Carro("Fusca", 1970)
println(meuCarro.model)
📊 Data Classes
Onde o Kotlin brilha de verdade.
data class Usuario(val id: Int, val email: String)
// Gera automaticamente: toString, equals, hashCode, copy...
🧬 Interoperabilidade
Você pode misturar Java e Kotlin no mesmo projeto sem problemas.
graph LR
A[Java Code] <--> B[Kotlin Code]
B --> C[Bytecode JVM]
C --> D[Dalvik/ART Android]
🍎 Comparação: Swift
O Kotlin e o Swift são quase "gêmeos" na sintaxe moderna.
| Recurso | Kotlin | Swift |
|---|---|---|
| Constante | val |
let |
| Variável | var |
var |
| Opcional | String? |
String? |
| Função | fun |
func |
🎮 Playground da Aula
Acesse play.kotlinlang.org e teste:
- Crie uma variável que pode ser nula.
- Use o operador Elvis nela.
- Crie uma data class "Produto".
⚠️ Safe Call ?.
Chama o método apenas se não for nulo.
🏁 Conclusão
- Kotlin economiza tempo e dedos (menos código).
- Segurança contra nulos é o seu maior trunfo.
- É a linguagem do futuro do Android.
🚀 Próxima Aula: Anatomia de um App
Vamos abrir o Android Studio e ver como o Kotlin controla as telas!
Até a próxima! ⚡👋
Aula 04 - Estrutura de um App 🏗️
🧐 O que tem "debaixo do capô"?
Ao abrir um projeto no Android Studio, vemos muitas pastas. Não se desespere! Vamos entender cada uma.
📂 Visão Geral do Projeto
Existem dois modos de visão: Project e Android. Nós usaremos o modo Android (mais organizado).
1. O Manifesto 📜
app/src/main/AndroidManifest.xml
É o contrato do seu app com o sistema operacional.
- Nome e Ícone do App.
- Declaração de todas as Activities.
- Solicitação de Permissões (Câmera, GPS).
2. A Pasta java (ou kotlin) ⌨️
Onde a "mágica" acontece.
- Ficam as classes de lógica.
- Ficam as classes das telas (MainActivity).
- Organizado em pacotes (ex:
com.meuapp.telas).
3. A Pasta res (Resources) 🎨
Tudo o que o usuário vê ou ouve, mas que não é lógica.
- drawable: Imagens e ícones.
- layout: A interface visual (XML).
- mipmap: Ícones que aparecem no menu do celular.
- values: Strings, Cores e Temas.
🎨 Por que centralizar os values?
Evite escrever texto direto no código!
Facilita a tradução para outros idiomas (Internacionalização). 🌍
4. Gradle: O Gerente de Fábrica ⚙️
Não é código do seu app, é a configuração da "fábrica" que constrói ele.
build.gradle (Project): Configurações globais.build.gradle (Module): Configurações específicas do App.
📦 O que tem no Gradle?
- versionCode: Número interno (1, 2, 3...).
- versionName: Nome para o usuário (1.0.1...).
- Dependencies: Bibliotecas externas (Retrofit, Room).
🏗️ O Ciclo de Build
graph LR
A[Código Kotlin/Java] --> B[Compilador]
E[Recursos XML/Img] --> B
B --> C[Arquivo DEX]
C --> D[APK / AAB]
🆚 Estrutura: Android vs iOS
| Android | iOS | Papel |
|---|---|---|
AndroidManifest |
Info.plist |
Metadados |
res/layout |
Storyboard/XIB |
UI Visual |
gradle |
CocoaPods/SwiftPM |
Dependências |
res/values |
Localizable.strings |
Textos |
🔌 ViewBinding: O Link Seguro
Antigamente usava-se o findViewById (lento e perigoso).
Hoje usamos o ViewBinding.
Garante que você não tente acessar um ID que não existe na tela! 🛡️
🛠️ Prática: Explorando o Studio
- Abra o arquivo
Activity_main.xml. - Veja as abas Code, Split e Design.
- Mantenha no Split para aprender rápido!
⚠️ Cuidado com a pasta build
Ela é gerada automaticamente.
Nunca altere nada dentro dela manualmente. Se der erro, use o comando:
Build -> Clean Project.
🧩 Resumo
- Manifesto: Declarativo e essencial.
- Res: Visual e Multimídia.
- Gradle: Configuração e Bibliotecas.
- Java/Kotlin: Comportamento.
🚀 Desafio da Aula
- Adicione uma nova cor em
colors.xml. - Crie uma nova String em
strings.xml. - Use essa cor e essa string em um componente na tela inicial.
🏁 Conclusão
Entender a estrutura é o primeiro passo para não se perder em projetos grandes.
Próxima Aula: Interface Gráfica (Layouts)! 🎨👋
Aula 05 - Interface Gráfica (UI) 🎨
🏗️ A Hierarquia de Views
No Android, tudo o que você vê é baseado em uma árvore de elementos.
graph TD
Root[ViewGroup / Layout] --> Child1[TextView]
Root --> Child2[Button]
Root --> InnerVG[LinearLayout]
InnerVG --> GrandChild[ImageView]
🧱 Views vs ViewGroups
- View: O átomo da interface (Botão, Campo de Texto, Imagem).
- ViewGroup: O esqueleto que organiza os átomos (LinearLayout, ConstraintLayout).
📏 Unidades: dp vs sp
Regra de ouro: NUNCA use px.
- dp (Density-independent Pixels): Para tamanhos e margens.
- sp (Scale-independent Pixels): Para textos.
📐 LinearLayout
O mais simples. Organiza itens em fila.
- Vertical: Um abaixo do outro.
- Horizontal: Um ao lado do outro.
- Peso (layout_weight): Útil para preencher espaço proporcionalmente.
⚓ ConstraintLayout
O padrão da indústria moderna.
- Baseado em restrições (amarras).
- Evita aninhamento de layouts (performance 🚀).
- Flexível e responsivo para qualquer tamanho de tela.
Exemplo: Botão centralizado
<Button
android:id="@+id/btnCentro"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
🖼️ ImageView & Drawable
Como exibir imagens?
- Use vetores (SVG -> Vector Drawable) sempre que possível.
- Formatos bitmap (PNG/JPG) aumentam o tamanho do app.
- Escala:
scaleType="centerCrop"vsfitCenter.
⌨️ Entrada de Dados: EditText
- Use
inputType="textPassword"para senhas. - Use
inputType="emailAddress"para teclados customizados. - Dica:
TextInputLayout(Material Design) dá um visual premium.
💅 Temas e Estilos
Não repita código! Centralize o estilo.
🆚 Android XML vs iOS Auto Layout
| Recurso | Android | iOS |
|---|---|---|
| Pai | ViewGroup | UIView |
| Logic | Layout Params | Constraints |
| Unidade | dp | points |
| Arquivo | .xml | .storyboard / .xib |
🔗 ViewBinding na Prática
Adeus findViewById!
// Inicialização no onCreate
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// Uso
binding.btnSalvar.setOnClickListener { ... }
🖱️ Eventos de Clique
♿ Acessibilidade
O Android deve ser para todos.
- contentDescription: OBRIGATÓRIO para imagens (leitores de tela).
- Cores: Contraste adequado.
- Tamanhos: Botões com pelo menos 48dp de área de toque.
🛠️ Desafio da Aula: Tela de Cadastro
Crie uma tela com: 1. Nome (EditText) 2. E-mail (EditText) 3. Senha (Password) 4. Botão "Salvar" 5. Use ConstraintLayout para posicionar tudo.
🧪 Preview de Layout
O Android Studio permite testar seu layout em diferentes dispositivos (Pixel, Tablets, Dobráveis) sem rodar o app.
- Use a aba Design para ajustes rápidos.
- Use a aba Attributes para mudar propriedades sem digitar XML.
🏁 Conclusão
- Design atrativo retém usuários.
- ViewBinding é o padrão moderno de conexão.
- ConstraintLayout é sua ferramenta mais potente.
❓ Dúvidas?
Próxima Aula: Navegação entre Telas! 🗺️👋
Aula 06 - Navegação entre Telas 🗺️
📨 O que é uma Intent?
Seu App é um conjunto de telas. As Intents são as mensagens que conectam essas telas.
- "Quero abrir a tela X".
- "Quero passar este dado para a tela Y".
- "Quero que outro app resolva este link".
🚀 Intent Explícita
Você sabe exatamente para onde quer ir.
Usado para navegação interna do seu aplicativo.
🌍 Intent Implícita
Você diz O QUE quer fazer, não QUEM deve fazer.
- O sistema Android pergunta ao usuário qual navegador ele prefere usar.
Exemplos Implícitos
- ACTION_DIAL: Abrir o discador.
- ACTION_SEND: Compartilhar algo.
- ACTION_IMAGE_CAPTURE: Abrir a câmera.
📦 Passando Dados (Extras)
O "pacote" que viaja com a Intent.
// Tela A (Enviando)
intent.putExtra("NOME", "Android")
intent.putExtra("IDADE", 15)
// Tela B (Recebendo)
val nome = intent.getStringExtra("NOME")
val idade = intent.getIntExtra("IDADE", 0)
📚 A Pilha de Voltar (Back Stack)
O Android gerencia telas como uma pilha de pratos.
startActivitycoloca um prato no topo.- Botão "Back" (Voltar) tira o prato do topo.
- O prato que estava embaixo volta a ser visível.
O Comando finish() 🧹
Encerra a Activity atual e a remove da pilha.
startActivity(Intent(this, HomeActivity::class.java))
finish() // O usuário não consegue voltar para a tela anterior
Ideal para fluxos de Login e Splash Screens.
🆚 Navegação: Android vs iOS
| Conceito | Android | iOS |
|---|---|---|
| Componente | Activity | ViewController |
| Pilha | Back Stack | Navigation Controller |
| Ação | Intent | Segue / Push |
| Dados | Extras | Properties / PrepareForSegue |
🎨 Transições entre Telas
Dê vida ao seu app!
🧭 Navigation Component (Jetpack)
A forma moderna e visual.
- Navigation Graph: Mapa visual das telas.
- Fragments: Telas "leves" dentro de uma única Activity.
- Safe Args: Passagem de dados sem erros de digitação.
🛠️ Prática: Indo para os Detalhes
- Crie uma nova Activity chamada
DetalhesActivity. - No
MainActivity, adicione um botão. - No clique do botão, peça para abrir os Detalhes.
Código da Prática
binding.btnIr.setOnClickListener {
val intent = Intent(this, DetalhesActivity::class.java)
intent.putExtra("INFO", "Vindo da Main!")
startActivity(intent)
}
⚠️ Cuidado com a Memória
Abrir muitas Activities sem dar finish() pode deixar o app pesado e confuso.
Pergunte-se: "O usuário deve conseguir voltar para esta tela?"
🧬 Mermaid: Fluxo de Navegação
graph LR
S[Splash] -->|finish| L[Login]
L -->|finish| H[Home]
H <--> D[Detalhes]
H <--> P[Perfil]
P -->|Logout + clear_task| L
🚀 Desafio da Aula: O Mensageiro
- Crie uma tela com um
EditTexte umButton. - Ao clicar, abra uma segunda tela exibindo o texto que foi digitado.
- Na segunda tela, coloque um botão "Voltar" customizado que dá um
finish().
🏁 Resumo
- Intents: Mensageiros universais.
- Extras: O conteúdo da mensagem.
- Back Stack: A memória de onde viemos.
❓ Perguntas?
Próxima Aula: Listas Dinâmicas (RecyclerView)! 📋👋
Aula 07 - Arquitetura MVVM 🏗️
🦸 O Problema da God Activity
Sua Activity faz tudo? * Chama a internet. * Valida campos. * Salva no banco. * Desenha a tela.
Isso é um pesadelo de manutenção! 😱
📐 O Padrão MVVM
Recomendado pelo Google (Android Jetpack).
- Model: Dados e Lógica de Negócio.
- View: UI (Activity/XML). Burra e Visual.
- ViewModel: O cérebro. Faz a ponte entre os dois.
O Fluxo de Dados
graph LR
V[View] -->|Ações| VM[ViewModel]
VM -->|Observa| V
VM <-->|Dados| M[Model/Repo]
🧠 O ViewModel
Seu maior superpoder: Sobrevivência.
- Quando você gira a tela, a Activity morre e renasce.
- O ViewModel permanece vivo na memória.
- Os dados não são perdidos! 💎
📡 LiveData
O mensageiro que respeita a vida.
- É um container de dados observável.
- A View diz: "Me avise quando o dado mudar".
- Se a View estiver em background, o LiveData espera ela voltar para avisar.
Exemplo de LiveData
🏗️ Camada Model & Repository
Não deixe o ViewModel saber de ONDE vêm os dados.
- O Repository decide: "Vou buscar na Internet ou no Banco local?"
- O ViewModel apenas pede: "Me dê a lista de usuários".
🆚 MVVM vs Outros
| Padrão | Característica |
|---|---|
| MVC | Controller fica sobrecarregado. |
| MVP | Presenter e View muito acoplados. |
| MVVM | View observa o ViewModel (Desacoplado). |
🧪 Benefícios para Testes
Testar UI é lento e caro. Testar lógica no ViewModel é fast & cheap. ⚡
Com MVVM, você testa a lógica sem precisar abrir o emulador.
🧬 Data Binding (Avançado)
Imagine ligar o dado do ViewModel direto no XML.
- Menos
binding.textView.text = ...na Activity. - Código mais limpo.
🛠️ Prática da Aula: Contador MVVM
- Crie uma Activity com um botão e um texto.
- Crie um
MainViewModelcom umcounter: MutableLiveData<Int>. - No clique, chame
counter.value = (counter.value ?: 0) + 1. - Observe o contador na Activity.
O Segredo da Rotação 🔄
Teste seu app: 1. Clique 5 vezes (Contador = 5). 2. Gire o celular. 3. Se o contador continuar em 5, você implementou MVVM corretamente! ✅
🆚 MVVM no iOS
No iOS moderno usamos @StateObject e @Published.
O conceito de "Reatividade" é o mesmo!
📊 Vantagens Reais
- Manutenibilidade: Código organizado por pastas.
- Escalabilidade: Fácil adicionar novas telas.
- Performance: UI Thread fica livre para animações.
🏁 Conclusão
- Não seja um refém da
MainActivity. - Use o ViewModel para guardar o estado.
- Deixe o LiveData atualizar sua tela.
❓ Dúvidas?
Próxima Aula: Persistência de Dados (Room)! 💾👋
Aula 08 - Persistência de Dados 💾
💾 Onde guardamos os dados?
Apps precisam lembrar das coisas quando fechados.
- Configurações simples.
- Listas complexas.
- Arquivos multimídia.
1. SharedPreferences 🔑
A forma mais simples: Chave e Valor.
- "nome" -> "Ricardo"
- "notificacoes_on" -> true
- "tema" -> 1
Usando PreferenceManager
val prefs = getSharedPreferences("config", MODE_PRIVATE)
// Gravar
prefs.edit().putString("USER", "Android").apply()
// Ler
val user = prefs.getString("USER", "Ninguém")
Atenção: Não use para dados grandes ou listas!
🏛️ Banco de Dados: SQLite
O Android tem o SQLite no seu coração.
- Banco Relacional.
- Leve e embutido.
- Mas... o código puro é horrível (SQL strings).
🔨 Conheça o ROOM
A biblioteca do Jetpack que salva vidas.
- Entity: Sua tabela (Classe de dados).
- DAO: Seus comandos (Queries).
- Database: O gerente do banco.
Passo 1: A Entidade (@Entity)
Passo 2: O DAO (@Dao)
@Dao
interface UserDao {
@Insert
void save(User user)
@Query("SELECT * FROM User")
LiveData<List<User>> getAll()
}
🧵 A Regra de Ouro do Banco
NUNCA acesse o banco na Main Thread.
- O Room vai travar seu app (Crash) se você tentar.
- Use Coroutines ou LiveData.
- Por que? Porque ler o disco é lento e trava a tela.
🧬 Ciclo Completo: MVVM + Room
graph TD
UI[Activity/View] -->|Observa| VM[ViewModel]
VM -->|Pede| REPO[Repository]
REPO -->|Query| DB[(Room DB)]
DB -->|Retorna| REPO
REPO -->|State| VM
VM -->|LiveData| UI
📂 Arquivos Externos
Para fotos e vídeos.
- Cache: Temporário.
- Arquivos Privados: Só seu app vê.
- Arquivos Públicos: Galeria, Downloads (Precisa de permissão).
🆚 Persistência: Android vs iOS
| Recurso | Android | iOS |
|---|---|---|
| Simples | SharedPreferences | UserDefaults |
| Banco | Room (SQLite) | Core Data / SwiftData |
| Arquivos | Scoped Storage | Sandbox |
🕵️ Ferramenta: App Inspection
No Android Studio, você pode ver o banco de dados ao vivo.
- Rode o app.
- Aba
App Inspection->Database Inspector. - Você pode editar os dados e ver a tela do celular mudar! 🎩
🛠️ Prática: Lista de Tarefas
Vamos criar um banco para salvar textos.
- Configure o Room no
build.gradle. - Crie a Entity
Task. - Salve um texto vindo de um
EditText.
Dica: O Singleton do Banco
Não crie várias instâncias do banco. Use o padrão Singleton.
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
🏁 Conclusão
- Escolha a ferramenta certa para o dado certo.
- Room é o padrão para dados estruturados.
- Sempre use threads de background (IO).
❓ Dúvidas sobre Dados?
Próxima Aula: Listas com RecyclerView! 📋👋
Aula 09 - Listas Eficientes (RecyclerView) 📋
🐢 O Problema das Listas Gigantes
Imagine uma lista com 10.000 contatos. Criar 10.000 objetos de layout travaria qualquer celular.
- Memória cheia.
- Lag na rolagem.
- App fechando (Crash).
♻️ A Mágica da Reciclagem
O RecyclerView não cria 10.000 itens. Ele cria apenas o que cabe na tela (+ uns 2 ou 3 de reserva).
- Item sai por cima -> Entra na "piscina".
- Item entra por baixo -> Pega um layout da piscina e só troca o texto.
O Mecanismo visual
graph TD
A[Item 1 sai ↑] --> P((Piscina de Views))
P --> B[Item 12 entra ↓]
⚔️ Os 3 Pilares
Para fazer um RecyclerView, você precisa de:
- LayoutManager: Define o formato (Lista, Grade, etc).
- ViewHolder: Guarda as referências dos IDs (Gaveta).
- Adapter: Liga os dados às Views (O Cérebro).
📐 1. LayoutManager
Troque a cara da sua lista com 1 linha:
- LinearLayoutManager: Lista vertical/horizontal.
- GridLayoutManager: Grade (estilo galeria).
- StaggeredGridLayoutManager: Grade tipo Pinterest.
🗄️ 2. ViewHolder
Evita que o Android tenha que procurar o findViewById milhares de vezes.
class MeuViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val nome = view.findViewById<TextView>(R.id.txtNome)
}
🧠 3. Adapter
Onde a lógica acontece.
onCreateViewHolder: Infla o layout do XML.onBindViewHolder: Coloca os dados na tela.getItemCount: Diz quantos itens a lista tem.
👆 Lidando com Cliques
O RecyclerView não tem clique nativo. Nós criamos!
🆚 Android vs iOS
O mecanismo é IGUAL. Só mudam os nomes.
| Conceito | Android | iOS |
|---|---|---|
| Componente | RecyclerView | UITableView |
| Reciclagem | Scrap Heap | Reusable Cell |
| Dados | Adapter | Data Source |
| Gaveta | ViewHolder | UITableViewCell |
🚀 Otimização: ListAdapter & DiffUtil
notifyDataSetChanged() é coisa do passado.
- O DiffUtil calcula o que mudou.
- Animações automáticas de inserção e remoção.
- Muito mais rápido para o processador.
🛠️ Prática: Lista de Compras
- Crie um layout
item_produto.xml. - Crie a lista de objetos
Produto. - Implemente o Adapter e veja a mágica da rolagem fluida.
Dica: CardView 🃏
Use MaterialCardView nos seus itens para ganhar sombras e bordas arredondadas automaticamente!
<com.google.android.material.card.MaterialCardView ...>
<!-- Seus textos/imagens aqui -->
</com.google.android.material.card.MaterialCardView>
⚠️ Erro Comum
Tentar atualizar a lista e esquecer de avisar o Adapter.
Sempre que o dado do banco/internet chegar, use:
adapter.submitList(novaLista) (se usar ListAdapter).
🏁 Conclusão
- RecyclerView é obrigatório em 99% dos apps.
- O foco é performance e economia de memória.
- Masterize o Adapter e você dominará o Android.
❓ Perguntas sobre Listas?
Próxima Aula: Consumo de APIs com Retrofit! 🌍👋
Aula 10 - APIs REST & Retrofit 🌍
📡 O App e a Internet
Raramente um app vive sozinho. Ele precisa de dados externos.
- Previsão do tempo.
- Posts de redes sociais.
- Salvar pedidos em um servidor.
🍕 O Conceito de API REST
Pense em um restaurante (Servidor) e você (Cliente).
- Request: Você pede um prato.
- Endpoint: A mesa do restaurante (
/pedidos). - Response: O prato chega (JSON).
O Formato JSON 📦
É como o mundo troca dados hoje.
🚀 Conheça o Retrofit
A biblioteca da Square que é o padrão absoluto no Android.
- Transforma APIs em interfaces Kotlin.
- Faz o "parse" do JSON automaticamente.
- Suporte nativo a Coroutines.
🔨 Implementação em 3 Passos
1. A Data Class (O Modelo)
Deve ser o espelho do JSON.
2. A Interface (O Contrato)
interface ApiService {
@GET("posts")
suspend fun obterPosts(): List<Post>
@GET("posts/{id}")
suspend fun obterPostUnico(@Path("id") id: Int): Post
}
3. A Instância (O Cliente)
val retrofit = Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val api = retrofit.create(ApiService::class.java)
🧠 Chamando na ViewModel
Nunca trave a UI Thread!
viewModelScope.launch {
try {
val lista = api.obterPosts()
_posts.value = lista
} catch (e: Exception) {
// Tratar erro (falta de internet, 404...)
}
}
🔐 Autenticação (JWT Tokens)
A maioria das APIs exige login.
- Bearer Token: Um código que você envia no Header.
- Interceptor: Adiciona o token em TODAS as chamadas automaticamente.
🆚 Android vs iOS (Rede)
| Recurso | Android (Retrofit) | iOS (URLSession) |
|---|---|---|
| Linguagem | Interface + Annotations | Native Classes / URLRequest |
| Conversão | Gson / Moshi | Codable |
| Async | Coroutines (suspend) | Async / Await |
🌐 Permissão de Internet
No AndroidManifest.xml:
Esqueceu? O App crasha com SecurityException. 💥
🛠️ Ferramentas de Apoio
- Postman / Insomnia: Teste sua API antes de codar.
- JSON Placeholder: APIs falsas gratuitas para teste.
- QuickType.io: Gera a Data Class Kotlin direto do JSON.
🧪 Desafio da Aula: App de Repositórios
- Use a API pública do GitHub:
https://api.github.com/users/{seuUser}/repos. - Crie a Data Class e a Interface.
- Exiba o nome dos seus repositórios em uma
RecyclerView.
⚠️ Cuidado com o Main Thread
O Android não permite rede na Main Thread.
Sempre use viewModelScope.launch ou troque o Dispatcher para Dispatchers.IO.
🏁 Conclusão
- APIs conectam seu app ao mundo.
- Retrofit + Gson = Produtividade máxima.
- Atenção às permissões e erros de rede.
❓ Perguntas sobre Internet?
Próxima Aula: Threads e Coroutines! 🧵👋
Aula 11 - Threads e Coroutines 🧵
🛑 O Bloqueio da UI
O Android é um sistema exigente: ele redesenha a tela a cada 16ms (60fps).
- Main Thread: Onde tudo o que é visual acontece.
- Regra de Ouro: Nunca coloque código pesado na Main Thread.
O Erro ANR 💀
Se a Main Thread parar por +5 segundos... Application Not Responding. O sistema mata seu app.
- Download de arquivos.
- Leitura de banco de dados pesada.
- Processamento de imagens.
⚡ Kotlin Coroutines
"Threads leves".
- Você pode rodar milhões sem travar o celular.
- Código assíncrono que parece sequencial.
- Criado pela JetBrains para facilitar sua vida.
🏛️ Os 3 Pilares da Coroutine
- Job: A tarefa em si (o trabalho).
- Scope: Onde ela vive (morreu a tela, morre a tarefa).
- Dispatcher: Em qual pista ela corre (Threads).
🚦 Conheça os Dispatchers
- Main: Só para interface (UI).
- IO: Rede, Banco, Arquivos (Espera).
- Default: Cálculos pesados de CPU.
🛌 A palavra-chave suspend
"Esta função pode demorar, mas não vai travar o celular".
🧠 Coroutines na ViewModel
class MeuViewModel : ViewModel() {
fun carregar() {
viewModelScope.launch { // Inicia no Scope seguro
val dados = withContext(Dispatchers.IO) {
api.getDados() // Roda em background
}
binding.txt.text = dados // Volta pra Main e atualiza
}
}
}
🔌 Sockets (Tempo Real)
REST é: "Eu peço, você responde". Socket é: "Canal aberto, qualquer um fala".
- Full-Duplex: Envio e Recebimento simultâneo.
- Casos: Chat, GPS em tempo real, Bolsa de Valores.
Socket vs REST
sequenceDiagram
participant App
participant Server
Note over App,Server: REST (Request/Response)
App->>Server: Me dá os dados?
Server->>App: Aqui estão. (Fecha)
Note over App,Server: Socket (Persistent)
App->>Server: Abre conexão
Server->>App: Conectado!
Server->>App: Mensagem nova!
App->>Server: Valeu!
🆚 Android vs iOS (Async)
| Recurso | Android (Kotlin) | iOS (Swift) |
|---|---|---|
| Padrão | Coroutines | Async / Await |
| Palavra | suspend |
async |
| Chamada | launch |
Task |
| Espera | delay |
try await Task.sleep |
🚫 Cancelamento Automático
O viewModelScope é fantástico.
- Usuário abre a tela e começa o download.
- Usuário fecha o app ou muda de tela.
- O download é cancelado na hora. Economia de bateria e dados!
🛠️ Prática: O Simulador de Corrida
suspend fun corrida() {
println("3...")
delay(1000)
println("2...")
delay(1000)
println("1...")
delay(1000)
println("JÁ!")
}
- Chame isso num clique de botão e tente clicar em outro botão enquanto a contagem ocorre. Se funcionar, você venceu o ANR! 🏆
🏁 Conclusão
- Main Thread é sagrada.
- Coroutines trazem ordem ao caos assíncrono.
- Sempre use
viewModelScopepara segurança.
❓ Perguntas sobre Threads?
Próxima Aula: UX e Material Design 3! 🎨👋
Aula 12 - UX e Material Design 3 🎨
💄 O que é Material Design?
O sistema de design do Google.
- Criado em 2014.
- Inspirado em papel e tinta.
- Agora na versão 3: Material You.
🌸 Material You (M3)
A personalização elevada ao máximo.
- Cores Dinâmicas: O app suga as cores do papel de parede do usuário.
- Acessibilidade: Foco em contraste e tamanhos de toque.
- Expressividade: Formas orgânicas e arredondadas.
📐 O Grid de 8dp
No Android, medimos tudo em múltiplos de 8.
- 8, 16, 24, 32, 40...
- Isso garante alinhamento harmônico em qualquer tela.
- Regras de margem e padding seguem esse padrão.
🔘 Componentes Modernos
1. FAB (Floating Action Button)
O botão que "flutua" sobre o conteúdo.
- Representa a ação principal.
- Ex: Criar novo e-mail, Adicionar tarefa.
2. Cards 🃏
Agrupam informações relacionadas.
- Elevação (sombras).
- Bordas arredondadas (12dp a 28dp).
3. Bottom Navigation 🧭
Navegação principal ao alcance do polegar.
- Entre 3 e 5 destinos.
- Ideal para uso com uma mão só.
🌑 Dark Mode: Não é opcional!
O usuário ama o tema escuro.
- Economia de bateria (telas OLED).
- Descanso visual à noite.
- Como fazer: Pasta
values-night/colors.xml.
🆚 Material (Android) vs HIG (iOS)
| Característica | Android (Material) | iOS (HIG) |
|---|---|---|
| Foco | Elevação / Camadas | Transparência / Blur |
| Botões | FAB / Sombreados | Flat / Bordas finas |
| Navegação | Drawer / Bottom Nav | Tab Bar Superior/Inferior |
| Espírito | Papel e Tinta | Vidro e Minimalismo |
🔡 Tipografia: Roboto e Além
A fonte oficial do Android.
- Use pesos variados para criar hierarquia.
- Título: Bold / Grande.
- Corpo: Regular / 14sp ou 16sp.
🌊 Feedback Visual (Ripples)
"O app está me ouvindo?"
- Sempre que o usuário tocar, algo deve acontecer.
- Efeito Ripple (Onda) é o padrão.
🛠️ Prática: Estilizando com M3
- No
build.gradle, use Material 1.9.0+. - No XML, troque
ButtonporMaterialButton. - Teste o atributo
app:cornerRadiuse veja a mudança.
🧬 Mermaid: Camadas UI
graph TD
A[Barra de Status]
B[Barra de App - TopAppBar]
C[Conteúdo - RecyclerView]
D[Botão Flutuante - FAB]
E[Barra Inferior - BottomNav]
A --> B
B --> C
C --> D
D --> E
🧠 UX: Experiência do Usuário
UX não é só "bonito", é "funcional".
- Velocidade: Carregamento rápido.
- Clareza: Icons autoexplicativos.
- Prevenção: Não deixe o usuário errar (validações).
🏁 Conclusão
- Design ruim mata apps bons.
- Siga o grid de 8dp.
- Pense sempre na acessibilidade (Content Description!).
❓ Perguntas sobre Visual?
Próxima Aula: Sensores e Hardware! 📸👋
Aula 13 - Sensores e Hardware 📸
📱 Além da Tela
O smartphone é um laboratório de sensores. Apps nativos têm "superpoderes" para sentir o mundo físico.
- Onde eu estou? (GPS)
- O que eu estou vendo? (Câmera)
- Estou me movendo? (Acelerômetro)
🔑 O Porteiro: Permissões
No Android 6.0+, as permissões são dinâmicas.
- Normais: Declaradas no Manifest (Internet, BT).
- Perigosas: Pop-up em tempo de execução (GPS, Câmera, Microfone).
Sempre verifique se tem a permissão antes de usar o hardware! 🛡️
Pedindo Permissão (Moderno)
val launcher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { concedida ->
if (concedida) { /* Use o hardware */ }
}
launcher.launch(Manifest.permission.CAMERA)
🗺️ Localização e GPS
Use o Fused Location Provider.
- Por que? Ele mistura GPS, Wi-Fi e Células de rede.
- Vantagem: Menos gasto de bateria e maior precisão.
- Maps SDK: Exiba a localização visualmente.
📸 A Câmera com CameraX
Esqueça a dor de cabeça da Camera2 API.
- Preview: Imagem em tempo real.
- Capture: Tirar e salvar foto.
- Analysis: Analisar frames (QR Code, IA).
🎢 Sensores de Movimento
Acelerômetro e Giroscópio.
- Detectar o "Shake" (Balançar).
- Rodar a tela automaticamente.
- Realidade Aumentada (AR).
🔵 Bluetooth (Classic e BLE)
Conecte-se a tudo.
- Classic: Som, Arquivos grandes.
- BLE (Low Energy): Sensores, IoT, Smartwatches.
- Eddystone/iBeacons: Localização interna por proximidade.
📞 Telefonia e SMS
Sim, ainda é um telefone!
- SmsManager: Envie e receba mensagens programaticamente.
- TelephonyManager: Saiba a operadora e o estado da rede.
Cuidado: O Google Play é muito rígido com permissões de SMS. ⚠️
🔐 Biometria Segura
Impressão digital e Rosto.
- Use o
BiometricPrompt. - Nunca guarde a digital do usuário! O sistema apenas diz "Confere" ou "Não Confere".
🆚 Android vs iOS (Hardware)
| Recurso | Android | iOS |
|---|---|---|
| GPS | Fused Location | Core Location |
| Câmera | CameraX | AVFoundation |
| Sensores | SensorManager | Core Motion |
| Bluetooth | BluetoothAdapter | Core Bluetooth |
🧬 Mermaid: Ciclo de Hardware
graph TD
A[Usuário quer Foto] --> B{Tem Permissão?}
B -- Não --> C[Pedir Permissão]
C --> D{Aceitou?}
D -- Não --> E[Mostrar Aviso]
B -- Sim --> F[Abrir CameraX]
D -- Sim --> F
F --> G[Salvar Imagem]
🛠️ Prática: O Sensor de Luz
- Obtenha o
SensorManager. - Escolha o
Sensor.TYPE_LIGHT. - Se a luz baixar (colocar a mão sobre o sensor), mostre um aviso "Está escuro!".
🏁 Conclusão
- Hardware exige permissão e cuidado.
- CameraX e Fused Location são seus melhores amigos.
- Respeite a bateria do usuário! Pare de ouvir sensores no
onPause.
❓ Perguntas sobre Hardware?
Próxima Aula: Testes e Qualidade! 🐞👋
Aula 14 - Testes e Qualidade 🐞
🔍 Por que testar?
Erros custam caro.
- Perda de usuários.
- Má fama na loja (1 estrela).
- Prejuízo financeiro.
"Testar é o ato de provar que seu código faz o que você diz que ele faz."
📝 O Logcat Profissional
Pare de usar println. Use etiquetas!
- Log.d: Debug (lógica).
- Log.i: Informação (eventos).
- Log.w: Aviso (algo estranho).
- Log.e: Erro grave.
🛠️ O Modo Debug (Besouro)
Seu superpoder de investigação.
- Breakpoint: "Congele" o tempo naquela linha.
- Variables Panel: Veja o que tem dentro de cada objeto.
- Evaluate Expression: Execute código no meio da pausa! 🎩
🏔️ A Pirâmide de Testes
Não teste tudo da mesma forma.
- Unitários (70%): Lógica pura, rápidos.
- Integração (20%): Peças conversando.
- UI / Espresso (10%): O robô clica na tela.
Teste Unitário (JUnit) 🧪
@Test
fun login_comSenhaVazia_deveRetornarErro() {
val result = validador.verificar("", "123")
assertFalse(result)
}
- Roda no seu PC (JVM).
- Leva milissegundos.
Teste de UI (Espresso) ☕
O robô que simula o usuário.
onView(withId(R.id.btnEnter)).perform(click())
onView(withId(R.id.txtWelcome)).check(matches(isDisplayed()))
- Roda no Emulador/Celular.
- Lento, mas testa a experiência real.
🛡️ Tratamento de Exceções
Previna o "O App parou".
🆚 Android vs iOS (Qualidade)
| Ferramenta | Android | iOS |
|---|---|---|
| Unit Testing | JUnit / Mockito | XCTest |
| UI Testing | Espresso / Barista | XCUITest |
| Logs | Logcat | Console (os_log) |
| Profiler | Android Profiler | Xcode Instruments |
🏃 CI/CD: Automação
Nunca envie código quebrado para o GitHub.
- GitHub Actions: Roda seus testes a cada "Push".
- Lint: Analisa se o seu código está limpo e segue padrões.
🛠️ Prática: Meu Primeiro Teste
- Vá na pasta
src/test/java. - Crie uma função que soma dois números.
- Escreva um
@Testque useassertEquals. - Clique no "Play" verde ao lado da função.
🏁 Conclusão
- Programador bom é o que testa.
- Use logs com sabedoria.
- Aprenda a ler o Stack Trace (o relatório de erros).
❓ Perguntas sobre Qualidade?
Próxima Aula: Publicação na Google Play! 🚀👋
Aula 15 - Publicação na Google Play 🚀
🏁 A Reta Final
Seu app está pronto e testado. Agora, como o mundo vai baixá-lo?
- Google Play (Android).
- App Store (iOS).
- Distribuição Direta (APK/Enterprise).
📦 APK vs AAB
O passado e o futuro dos pacotes.
- APK: Um arquivo gigante para todos os celulares.
- AAB (App Bundle): O Google gera o APK sob medida para cada usuário.
- Resultado: Downloads até 50% menores! 💎
🔑 A Chave da Vida (Keystore)
Todo app de produção deve ser assinado.
- O arquivo
.jksé o seu RG. - AVISO CRÍTICO: Se perder a senha ou o arquivo, você nunca mais poderá atualizar o app. Guarde na nuvem, no HD e no papel! 💾
🎮 Google Play Console
O portal dos campeões.
- Taxa: $25 (Única e vitalícia).
- Análise: O Google revisa seu app (1 a 7 dias).
- Políticas: Cuidado com direitos autorais e privacidade.
🛡️ Ofuscação (R8 / ProGuard)
Proteja seu código original.
- Transforma
MinhaClasseDeLoginema.b.c. - Remove código morto.
- Dificulta a pirataria e engenharia reversa.
📈 Versão e Build
No build.gradle:
- versionCode: 1, 2, 3... (Sempre sobe).
- versionName: "1.0.0", "1.1.2" (O que o usuário vê).
🎨 Marketing na Loja (ASO)
Não basta ser bom, tem que parecer bom.
- Ícone: A cara do seu app (512px).
- Feature Graphic: O banner de impacto.
- Screenshots: Mostre as melhores telas!
🆚 Android vs iOS (Loja)
| Característica | Google Play | App Store |
|---|---|---|
| Custo | $25 (Única) | $99 (Anual) |
| Revisão | Média de 2 dias | Média de 24h a 48h |
| Rigidez | Moderada | Alta / Rigorosa |
| Formato | AAB / APK | IPA |
🧪 Canais de Teste
Teste com pessoas reais antes do lançamento.
- Teste Interno: Amigos e equipe.
- Teste Fechado (Beta): Grupo seleto.
- Produção: O mundo todo!
🏆 Checklist de Lançamento
- [ ] Removi todos os
Log.d? - [ ] O nome do app está correto?
- [ ] O ícone é o de produção (não o padrão)?
- [ ] Tenho os links de Política de Privacidade?
🏁 Conclusão
- Publicar é um processo burocrático mas gratificante.
- A segurança da Keystore é sua prioridade #1.
- Marketing (ASO) é o que traz downloads.
❓ Perguntas sobre Lançamento?
Próxima Aula: Projeto Final e Portfólio! 🎓👋
Aula 16 - A Grande Conclusão 🎓
🏆 Você Conseguiu!
De "Zero" a Desenvolvedor Mobile Nativo.
- Entendeu a base (Java/Kotlin).
- Dominou a estrutura (Manifest/Gradle/Res).
- Construiu interfaces (XML/Material).
- Conectou com o mundo (API/Rede).
🧠 Recapitulação: O Arsenal do Dev
- Linguagem: Kotlin Moderno.
- Arquitetura: MVVM (ViewModel + LiveData).
- Persistência: Room (Bancos Locais).
- Rede: Retrofit (Internet).
- UI: RecyclerView & ConstraintLayout.
🚀 O Próximo Nível
O aprendizado nunca termina.
- Jetpack Compose: UI Declarativa (O futuro).
- KMP (Kotlin Multiplatform): Compartilhe lógica com iOS.
- Hilt/Koin: Injeção de Dependências.
- Coroutines Avançado: Flow e StateFlow.
💼 Carreira e Portfólio
Como conseguir a primeira vaga?
- GitHub Ativo: Commits frequentes.
- README Impecável: Explique SEU projeto.
- Publicação: Ter um app na Play Store vale ouro.
📱 iOS: A Outra Metade
Agora que você sabe Android, aprender iOS será MUITO mais fácil.
- Swift ≈ Kotlin.
- SwiftUI ≈ Jetpack Compose.
- Lógica de negócio é a mesma!
⚔️ Nativo vs Híbrido
Você escolheu o caminho da performance e do controle total.
"Aplicações nativas entregam a melhor experiência possível que o hardware pode oferecer."
🎓 O Projeto Final
Sua obra-prima.
- Aplique tudo o que vimos.
- Resolva um problema real.
- Capriche no visual (UX/UI).
✨ Mensagem de Despedida
O mundo está no bolso das pessoas. Você agora tem a chave para entrar lá.
"A tecnologia move o mundo, mas são as pessoas que movem a tecnologia."
🏁 Fim da Jornada
Obrigado por nos acompanhar nesta trilha. Nos vemos na Play Store! 🚀
Ricardo TecPro & Equipe 👋
Configuração
Ambientes de Desenvolvimento 🛠️
Guia para configurar seu computador com as ferramentas necessárias para trabalhar com Bancos de Dados SQL e NoSQL.
-
PostgreSQL --- Instalação do SGBDR relacional e da interface pgAdmin 4.
-
MongoDB --- Instalação do banco de documentos NoSQL e MongoDB Compass.
Setup 01: PostgreSQL 🐘
O PostgreSQL é um dos bancos de dados relacionais mais avançados e utilizados no mundo.
1. Instalação no Windows
- Acesse o site oficial: postgresql.org/download/windows.
- Clique em Download the installer (EDB).
- Escolha a versão mais recente (ex: 16 ou 17).
- Durante a instalação, certifique-se de marcar:
- PostgreSQL Server
- pgAdmin 4 (Interface Gráfica)
- Command Line Tools
- IMPORTANTE: Defina uma senha para o usuário
postgrese não a esqueça. - Mantenha a porta padrão
5432.
2. Verificação
- Abra o pgAdmin 4.
- Conecte-se ao servidor local usando a senha definida.
- Abra o terminal (cmd ou powershell) e digite:
3. Configuração do Path (Opcional)
Para usar o psql em qualquer lugar do terminal:
1. Adicione o caminho da pasta bin do PostgreSQL (ex: C:\Program Files\PostgreSQL\16\bin) às Variáveis de Ambiente do Windows.
Setup 02: MongoDB 🍃
O MongoDB é o banco de dados NoSQL líder de mercado, baseado em documentos JSON (BSON).
1. Instalação no Windows
- Acesse mongodb.com/try/download/community.
- Baixe o instalador
.msi(versão Current). - Execute o instalador e escolha o tipo Complete.
- Marque a opção "Install MongoDB as a Service".
- Marque a opção "Install MongoDB Compass" (ferramenta visual).
2. MongoDB Shell (mongosh)
O shell não vem mais no instalador principal.
1. Baixe o MongoDB Shell separadamente em mongodb.com/try/download/shell.
2. Extraia o arquivo e adicione a pasta bin ao seu PATH.
3. Verificação
- Abra o MongoDB Compass.
- Clique em Connect (a URL padrão é
mongodb://localhost:27017). - No terminal, teste:
4. Dica de Uso 💡
Diferente do SQL, você não precisa criar um banco de dados explicitamente antes de usá-lo; o MongoDB o cria automaticamente ao inserir o primeiro documento.
Sobre
Sobre o Curso 🎓
Bem-vindo ao curso de Bancos de Dados SQL e NoSQL. Este programa foi desenvolvido para transformar iniciantes em profissionais capazes de lidar com diferentes arquiteturas de dados modernas.
🎯 Por que estudar Bancos de Dados?
Dados são o ativo mais precioso de qualquer aplicação moderna. Seja em uma rede social, um e-commerce ou um sistema financeiro, a forma como os dados são armazenados e consultados define o sucesso ou o fracasso de um produto.
O Diferencial deste Curso
Este curso não foca apenas na sintaxe. Nós exploramos a estratégia: * Quando usar uma tabela? * Quando usar um documento? * Como garantir que os dados não se percam? * Como escalar para milhões de usuários?
🧑💻 Perfil do Aluno
- Jovens e adultos que desejam ingressar na área de TI.
- Programadores que querem aprofundar seus conhecimentos em persistência.
- Curiosos sobre como gigantes como Google e Netflix lidam com dados.
🏆 Certificação e Conclusão
Ao concluir os 16 módulos e entregar o Projeto Final Integrador, você terá construído um portfólio sólido que demonstra competência teórica e prática em: 1. PostgreSQL (Líder em bancos relacionais open-source). 2. MongoDB (Padrão ouro em bancos NoSQL orientados a documentos). 3. Linguagem SQL Universal.
"Sem dados, você é apenas mais uma pessoa com uma opinião." — W. Edwards Deming
Roadmap do Projeto 🗺️
Acompanhe a sua evolução técnica através dos marcos do curso.
📍 Marcos de Aprendizado
🏁 Level 1: Arquiteto de Dados (Aulas 01-04)
- [x] Instalar ambiente (PostgreSQL).
- [ ] Criar primeiro Diagrama Entidade-Relacionamento.
- [ ] Normalizar uma base de dados complexa.
- [ ] Executar scripts DDL para criação de tabelas.
⚙️ Level 2: Mestre do SQL (Aulas 05-10)
- [ ] Popular banco com milhares de registros reais.
- [ ] Criar relatórios complexos com Agregações e JOINs.
- [ ] Implementar lógica de transações para sistemas críticos.
- [ ] Projeto Parcial: Mini-sistema de vendas ou biblioteca funcional.
🍃 Level 3: Especialista NoSQL (Aulas 11-15)
- [ ] Migrar dados relacionais para o formato Documento.
- [ ] Criar pipelines de agregação no MongoDB.
- [ ] Analisar performance de índices em grandes volumes.
- [ ] Entender fluxos de Big Data.
🚀 Level 4: Senior Integrador (Aula 16)
- [ ] Projeto Final: Sistema Híbrido.
- [ ] Relatório técnico comparativo (SQL vs NoSQL).
- [ ] Deploy e apresentação dos resultados.
📈 Metas de Competência
- Modelagem: Capacidade de traduzir regras de negócio em diagramas.
- Performance: Escrita de queries otimizadas.
- Versatilidade: Fluência entre os mundos Relacional e Não Relacional.
Materiais Complementares 📚
Recursos extras para aprofundar seu conhecimento em Bancos de Dados SQL e NoSQL.
🛠️ Ferramentas Recomendadas
PostgreSQL & Relacional
- pgAdmin 4: Ferramenta de gerenciamento para PostgreSQL.
- dbdiagram.io: Designer de banco de dados visual e rápido.
- DBeaver: Cliente SQL universal gratuito.
MongoDB & NoSQL
- MongoDB Compass: Interface GUI para exploração de dados no MongoDB.
- MongoDB Atlas: Banco de dados NoSQL totalmente gerenciado na nuvem.
📖 Leituras e Documentação
Oficial
- Documentação PostgreSQL: A "Bíblia" do Postgres.
- Manual SQL (MDN): Introdução geral a bancos de dados.
- Documentação MongoDB: Guia completo sobre documentos.
Comunidade & Artigos
- SQL School (W3Schools): Tutorial interativo de SQL.
- Normalização de Dados (Artigo): Entendendo as Formas Normais.
- NoSQL vs SQL (IBM): Quando escolher cada um.
🎥 Canais e Playlists
- PostgreSQL Tutorial (Texto e Vídeo).
- MongoDB University: Cursos gratuitos oficiais da MongoDB Inc.
Versão para Impressão
Esta página foi gerada automaticamente para impressão.