← Mundo bit Byte

Banco de Dados

Professor Ronaldo Lavestein
Início

História dos Bancos de Dados

Muito antes do SQL existir, escolas, bancos, hospitais, governos e empresas já enfrentavam o mesmo desafio: guardar informações de forma confiável, encontrá-las rapidamente e evitar erros. Este capítulo mostra por que os bancos de dados surgiram, quais problemas eles resolveram e como essa evolução preparou o caminho para a modelagem, o SQL e os SGBDs modernos.

1. Introdução — o mundo moderno funciona sobre dados

Neste exato momento, enquanto você lê este material, bancos estão processando transferências PIX, hospitais estão acessando exames de pacientes, aplicativos estão calculando rotas, redes sociais estão armazenando mensagens, lojas virtuais estão registrando pedidos e escolas estão controlando frequência e notas.

Tudo isso depende de algo fundamental: informações organizadas. Hoje estamos tão acostumados com sistemas digitais que parece natural encontrar qualquer informação em segundos. Mas durante grande parte da história humana isso era extremamente difícil.

E quanto mais a sociedade crescia, mais informações eram produzidas, mais registros precisavam ser controlados e mais complexa se tornava a administração dos dados. Os bancos de dados surgiram justamente para resolver esse problema.

Ideia principal

Banco de dados não é apenas armazenamento. Banco de dados é organização inteligente da informação.

Antes dos comandos

Antes de aprender SQL, tabelas, JOIN e normalização, é preciso entender por que essas ferramentas precisaram existir.

2. O problema da organização das informações

Imagine uma escola antes da informática. Tudo precisava ser controlado manualmente: matrículas, boletins, frequência, histórico escolar, biblioteca, pagamentos e documentos dos alunos.

As informações eram armazenadas em livros, fichários, pastas, armários e arquivos físicos. Em uma instituição com centenas, milhares ou dezenas de milhares de alunos, administrar tudo isso manualmente se tornava extremamente difícil.

Perda de informações

Documentos podiam rasgar, molhar, deteriorar, ser arquivados incorretamente ou desaparecer.

Informações inconsistentes

O endereço de um aluno podia ser atualizado na secretaria, mas continuar antigo no financeiro.

Dificuldade de busca

Procurar notas, pagamentos atrasados ou livros emprestados podia levar horas, dias ou semanas.

Repetição de informações

O nome de um mesmo aluno precisava aparecer na matrícula, no boletim, na biblioteca, no financeiro e no histórico escolar. Isso gerava redundância, isto é, repetição desnecessária de dados. E redundância aumenta erros, inconsistências, retrabalho e dificuldade de manutenção.

Solução buscada

Os bancos de dados foram criados para organizar informações, reduzir redundância, evitar inconsistências, facilitar consultas, proteger dados, permitir relacionamentos e melhorar a confiabilidade.

Analogia importante

Imagine uma biblioteca gigantesca sem categorias, códigos, índices ou prateleiras organizadas. Mesmo existindo milhares de livros importantes, encontrar uma informação se torna extremamente difícil. Os bancos de dados nasceram exatamente para evitar esse tipo de caos informacional.

3. O crescimento da sociedade e o aumento dos dados

Durante muito tempo, a quantidade de informações produzidas era relativamente pequena. Mas isso começou a mudar com crescimento populacional, industrialização, expansão das empresas, crescimento dos governos, avanço das telecomunicações e aumento das operações bancárias.

A sociedade começou a gerar dados em escala cada vez maior. Controlar manualmente todas as movimentações bancárias de um país, todos os exames de um hospital, todas as mensagens de uma rede social ou todas as vendas de um grande e-commerce seria praticamente impossível.

4. A chegada dos computadores

Conforme as empresas e instituições cresceram, os computadores começaram a ganhar importância. A ideia parecia revolucionária: armazenar informações digitalmente. Agora os dados poderiam ocupar menos espaço físico, ser copiados, pesquisados e processados mais rapidamente.

Na época, parecia que os computadores resolveriam todos os problemas administrativos. Mas existia um ponto importante: os primeiros sistemas ainda não possuíam bancos de dados modernos.

5. Os primeiros sistemas computacionais

Nos primeiros sistemas computacionais, cada programa armazenava suas informações em arquivos próprios.

Sistema financeiro  → financeiro.dat
Sistema acadêmico   → alunos.dat
Biblioteca          → livros.dat
Recursos humanos    → funcionarios.dat

Ideia principal

Os computadores resolveram parte do problema físico do armazenamento, mas apenas trocar papel por arquivos digitais não resolvia os problemas estruturais da organização dos dados.

6. Sistemas baseados em arquivos

Esse modelo ficou conhecido como sistema baseado em arquivos. Nele, cada programa possuía seus próprios dados, cada sistema controlava seus próprios arquivos e não existia gerenciamento centralizado das informações.

Sistema Financeiro
        │
        └── financeiro.dat

Sistema Acadêmico
        │
        └── alunos.dat

Biblioteca
        │
        └── livros.dat

Os sistemas funcionavam praticamente isolados.

7. O grande problema dos arquivos isolados

7.1 Redundância de dados

A mesma informação precisava ser armazenada várias vezes. Se o telefone de um cliente fosse atualizado em apenas um sistema, um setor teria o telefone novo e outro ainda teria o antigo.

7.2 Inconsistência de dados

Esse é um dos problemas mais perigosos dos sistemas antigos.

Financeiro: Rua das Flores, 100
Biblioteca: Rua das Flores, 180

Agora existem dois endereços diferentes para a mesma pessoa. Qual deles é verdadeiro?

7.3 Isolamento de informações

O sistema financeiro não compartilhava informações naturalmente com biblioteca, secretaria, recursos humanos ou estoque. Gerar relatórios integrados era extremamente difícil.

“Mostrar todos os alunos inadimplentes
que ainda possuem livros emprestados.”

7.4 Dependência entre programa e arquivo

Os programas conheciam exatamente o formato dos arquivos. Se a empresa desejasse adicionar um campo como email, o formato do arquivo mudava e frequentemente o programa precisava ser alterado também.

7.5 Segurança limitada

Cada programa implementava segurança da sua própria maneira. Não existia gerenciamento centralizado, controle integrado de usuários nem política unificada de acesso.

Sistema manual

  • lento;
  • físico;
  • difícil de consultar.

Sistema baseado em arquivos

  • digital;
  • mais rápido;
  • porém estruturalmente desorganizado.

8. A necessidade de um novo modelo

Os dados existiam, mas estavam espalhados, repetidos, inconsistentes, isolados e difíceis de integrar. A sociedade precisava de algo capaz de centralizar, organizar, relacionar e proteger informações.

9. O surgimento dos SGBDs

Esses sistemas especializados ficaram conhecidos como SGBD — Sistema Gerenciador de Banco de Dados, ou DBMS — Database Management System. O SGBD representou uma mudança gigantesca: antes cada programa controlava seus próprios arquivos; agora os dados passaram a ser administrados por um sistema especializado.

Programa
→
SGBD
→
Banco de Dados

O SGBD passou a armazenar dados, organizar informações, controlar acessos, evitar inconsistências, permitir consultas, proteger integridade, gerenciar concorrência e recuperar falhas.

10. A grande revolução: o modelo relacional

Mesmo com os SGBDs, ainda existia uma pergunta importante: qual a melhor maneira de organizar os dados? Diversos modelos surgiram, como o hierárquico, em rede e relacional.

10.1 Modelo hierárquico

No modelo hierárquico, os dados eram organizados como uma árvore: um elemento pai e vários elementos filhos.

Empresa
 ├── Departamento Financeiro
 │      ├── Funcionário A
 │      └── Funcionário B
 └── Departamento TI
        └── Funcionário C

Ele funcionava bem para estruturas rígidas, mas tinha dificuldade para representar relações complexas e conexões flexíveis.

10.2 Modelo em rede

O modelo em rede permitia relações mais complexas entre registros. Trouxe mais flexibilidade, mas também aumentou a complexidade de implementação e manutenção.

10.3 Modelo relacional

Na década de 1970, Edgar Frank Codd propôs uma ideia revolucionária: organizar os dados em tabelas relacionadas. Essa proposta mudou a história da computação.

id_alunonomeid_turma
1Ana10
2Bruno20
id_turmanome_turma
101A
201B

Ideia principal

O modelo relacional transformou dados em relações organizadas. Essas relações podiam ser consultadas, filtradas, combinadas e relacionadas.

11. O poder dos relacionamentos

A verdadeira força do modelo relacional não está apenas nas tabelas. Está nos relacionamentos entre elas.

TURMAS
 id_turma (PK)
       ▲
       │
ALUNOS
 id_turma (FK)

Quando um aplicativo mostra cliente, pedido, produto e pagamento, ele está relacionando várias tabelas ao mesmo tempo.

12. O surgimento do SQL

Com o crescimento dos bancos relacionais surgiu a necessidade de uma linguagem padronizada. Essa linguagem ficou conhecida como SQL — Structured Query Language.

SELECT nome
FROM alunos
WHERE id_turma = 10;

Esse comando busca os nomes dos alunos da turma 1A. O SQL é uma linguagem declarativa: normalmente dizemos o que queremos, e o SGBD decide como executar.

Analogia

Quando você pede “uma pizza de calabresa”, não precisa explicar como preparar a massa, o molho e o forno. Você declara o resultado desejado. O SQL funciona de forma parecida.

13. O modelo relacional mudou o mundo

O modelo relacional trouxe simplicidade, organização, integridade, flexibilidade e padronização. Isso permitiu a criação de bancos, redes sociais, hospitais, ERPs, e-commerce, sistemas acadêmicos e aplicativos.

Banco de Dados

Conjunto organizado de dados.

SGBD

Sistema que gerencia os dados.

SQL

Linguagem utilizada para manipular e consultar os dados.

14. A explosão dos dados e o mundo moderno

Depois que os bancos relacionais se consolidaram, o mundo mudou novamente. A sociedade passou a produzir dados em escala gigantesca por causa de computadores pessoais, internet, smartphones, redes sociais, serviços digitais, comércio eletrônico, sensores, streaming e GPS.

15. A internet mudou as regras do jogo

Antes da internet, muitos sistemas funcionavam localmente. Mas a internet trouxe milhões de usuários simultâneos. Agora os bancos de dados precisavam responder rapidamente, funcionar 24 horas, suportar milhares de acessos, manter integridade e processar operações em tempo real.

Problema real

Em uma Black Friday, milhares de pessoas acessam produtos, realizam pagamentos, alteram carrinhos, atualizam estoques e finalizam pedidos ao mesmo tempo.

16. O crescimento dos bancos relacionais

Os bancos relacionais continuaram evoluindo. SGBDs como Oracle, PostgreSQL, MySQL e SQL Server passaram a oferecer transações, recuperação de falhas, gerenciamento multiusuário, segurança avançada, controle de permissões e otimização de consultas.

17. Big Data — novos problemas de escala

Com internet, smartphones, sensores e serviços digitais, algumas organizações passaram a lidar com volumes, velocidades e variedades de dados muito maiores. O termo Big Data aparece nesse contexto para descrever desafios que não se resumem apenas a “ter muitos dados”.

18. NoSQL — outros modelos para outros problemas

Também surgiram bancos não relacionais, frequentemente agrupados sob o nome NoSQL — Not Only SQL. Eles não substituem automaticamente bancos relacionais: oferecem modelos diferentes para necessidades específicas.

Documento MongoDB   Chave-valor Redis   Grafos Neo4j   Colunas amplas (wide-column) Cassandra

19. Cloud Computing — bancos como serviço

A computação em nuvem também mudou a forma de operar bancos: em vez de manter toda a infraestrutura localmente, organizações podem usar serviços gerenciados, com recursos de disponibilidade, backup, monitoramento e escala fornecidos pela plataforma.

20. Dados e Inteligência Artificial

Sistemas de Inteligência Artificial também dependem de dados organizados, acessíveis e confiáveis. Isso aproxima bancos de dados de temas como análise, busca, recomendação e aplicações com IA.

Prévia, não destino final

Por enquanto, basta perceber que novos problemas produziram novas arquiteturas. No Capítulo 10 — Visão Moderna, voltaremos a Big Data, NoSQL, nuvem, analytics e IA com critérios de escolha e exemplos mais completos.

21. O mundo atual funciona sobre dados

Hoje praticamente toda área depende de bancos de dados: educação, medicina, bancos, logística, indústria, agronegócio, comércio, segurança, redes sociais e aplicativos.

Sistemas manuais
        ↓
Arquivos digitais
        ↓
SGBDs
        ↓
Modelo Relacional
        ↓
SQL
        ↓
Internet
        ↓
Big Data
        ↓
NoSQL
        ↓
Cloud Computing
        ↓
Inteligência Artificial

22. Resumo inteligente do capítulo

Neste capítulo aprendemos por que os bancos de dados surgiram, os problemas dos sistemas manuais, as limitações dos sistemas baseados em arquivos, como nasceram os SGBDs, como o modelo relacional revolucionou a computação, como surgiu o SQL e como os bancos evoluíram para Big Data, NoSQL, cloud e IA.

Mais importante: aprendemos que banco de dados não é apenas tecnologia. Banco de dados é organização inteligente da informação em escala global.

23. Checagem antes de avançar

  1. Qual problema central dos arquivos isolados levou à necessidade dos SGBDs?
  2. O que o modelo relacional mudou na organização dos dados?
  3. Qual é a diferença entre banco de dados, SGBD e SQL?
  4. Por que o surgimento de novas tecnologias não tornou o modelo relacional inútil?

Quer praticar mais?

Os exercícios completos, graduados e contextualizados deste capítulo estão em 99 Exercícios → Início.

24. Fechamento do capítulo

Neste capítulo você não aprendeu apenas “história”. Você começou a entender por que bancos de dados existem, quais problemas eles resolvem e por que se tornaram uma das tecnologias mais importantes da computação moderna.

Agora estamos prontos para estudar tabelas, registros, colunas/atributos, valores, chaves, integridade e estrutura relacional: os fundamentos internos dos bancos de dados modernos.

Capítulo 1

Fundamentos de Banco de Dados

Este capítulo apresenta os pilares fundamentais dos bancos de dados modernos: dados, informação, tabelas, registros, colunas/atributos, valores, chaves, relacionamentos, tipos de dados, integridade e funcionamento real dos sistemas.

BLOCO 1 — Dados e Informação

Antes de entender tabelas, comandos SQL ou sistemas gerenciadores, é preciso compreender algo mais básico: os dados.

Muitas pessoas começam Banco de Dados pensando diretamente em tabelas e comandos. Mas tudo nasce de algo mais simples: valores que precisam ser organizados para ganhar sentido.

O que é um dado?

Um dado é um valor bruto. Sozinho, normalmente possui pouco significado, porque ainda não está organizado dentro de um contexto.

João
15
Notebook
3500
2026
Aprovado

Esses valores existem, mas ainda não sabemos exatamente o que representam. O número 15 pode ser idade, quantidade, nota, código, número de parcelas ou estoque.

Problema

Dado isolado pode gerar interpretação errada. Sem contexto, o valor existe, mas não comunica claramente uma informação.

O que é informação?

Informação é o dado organizado com significado. Quando um dado recebe contexto, relação e finalidade, ele passa a comunicar algo útil.

O cliente João comprou um notebook por R$ 3500 em 2026.

Agora os dados possuem sentido. Existe um cliente, um produto, um valor e um período.

Ideia principal

Dado é um valor isolado. Informação é o dado interpretado dentro de um contexto.

Analogia importante

Imagine peças soltas de um quebra-cabeça. Cada peça existe, mas sozinha não mostra a imagem completa. Quando as peças são organizadas corretamente, surge uma imagem compreensível. Com dados acontece a mesma coisa.

O problema do dado desorganizado

Ter muitos dados não significa ter informação útil. Um hospital, uma escola, uma loja ou um banco podem possuir milhares de registros e, ainda assim, não conseguir usá-los bem se estiverem desorganizados.

Visão prática

Quando um aplicativo mostra histórico de compras, saldo, frequência, nota, pedido ou recomendação, ele está transformando dados armazenados em informação útil para o usuário.

Dados podem existir em muitos formatos

SistemaExemplos de dados armazenados
Escolaalunos, notas, frequência, turmas
Lojaprodutos, preços, estoque, vendas
Bancosaldo, transações, clientes, cartões
Hospitalpacientes, exames, consultas, prontuários
Streamingfilmes assistidos, preferências, recomendações

O mundo moderno é movido por dados. Mas o valor real aparece quando esses dados são organizados, protegidos, consultados e relacionados.

BLOCO 2 — Estrutura Fundamental dos Bancos

Depois de entender dados e informação, precisamos entender como os bancos relacionais organizam essas informações.

Nos bancos relacionais, a estrutura central é a tabela.

A tabela é o coração do modelo relacional

Uma tabela é uma estrutura organizada em linhas e colunas, usada para armazenar dados de um mesmo tipo de elemento.

id_alunonometurma
1João1A
2Maria1B
3Carlos2A

Essa tabela representa alunos. Cada linha representa um aluno específico. Cada coluna representa uma característica dos alunos.

Tabela, linha, coluna e valor

EstruturaSignificado
Tabelaconjunto organizado de dados sobre um tema
Linha / registrouma ocorrência completa, como um aluno específico
Coluna / atributouma característica prevista na estrutura, como nome ou data_nascimento
Valoro conteúdo armazenado no encontro entre uma linha e uma coluna

E o termo “campo”?

Em livros, ferramentas e equipes, campo pode aparecer como sinônimo de coluna ou como referência ao espaço que contém um valor. Para evitar ambiguidade, neste módulo usaremos preferencialmente coluna/atributo para a estrutura e valor para o conteúdo de uma célula.

TABELA: alunos

┌────┬────────┬───────┐
│ id │ nome   │ turma │
├────┼────────┼───────┤
│ 1  │ João   │ 1A    │
│ 2  │ Maria  │ 1B    │
└────┴────────┴───────┘

Atributo e domínio

Em modelagem, uma coluna também pode ser chamada de atributo. O domínio define quais valores são aceitáveis para aquele atributo ou coluna.

Atributo / colunaDomínio esperado
idadenúmeros inteiros positivos
notavalores entre 0 e 10
emailtexto em formato de e-mail
data_nascimentodatas válidas

Problema comum

Permitir “Azul” no campo idade ou “500” no campo nota mostra que a estrutura está sem regras adequadas.

A estrutura do banco não é apenas visual. Ela define como os dados serão armazenados, interpretados, validados e consultados.

BLOCO 3 — Chaves e Relacionamentos

Organizar dados em tabelas é essencial, mas não é suficiente. Em sistemas reais, as tabelas precisam se conectar.

É aqui que entram as chaves.

O que é uma chave?

Uma chave é um campo usado para identificação ou relacionamento. Ela ajuda o banco a localizar registros, evitar duplicidade e conectar informações.

Chave Primária

A chave primária identifica cada registro de forma única.

id_alunonome
1João
2Maria
3Carlos

A coluna/atributo id_aluno identifica cada aluno individualmente. Ela não pode repetir e não deve ficar vazia.

Por que não usar nome?

Nomes podem repetir. Pode existir mais de um João, mais de uma Maria ou mais de um Carlos. Por isso sistemas profissionais normalmente usam códigos ou IDs.

Chave Estrangeira

A chave estrangeira cria relacionamento entre tabelas.

id_turmanome_turma
101A
201B
id_alunonomeid_turma
1João10
2Maria20
TURMAS
 id_turma (PK)
       ▲
       │
ALUNOS
 id_turma (FK)

A coluna/atributo id_turma aparece na tabela alunos para indicar a qual turma cada aluno pertence.

Relacionamentos representam o mundo real

Relação realRepresentação no banco
Aluno pertence a uma turmaalunos → turmas
Cliente faz pedidoclientes → pedidos
Produto pertence a categoriaprodutos → categorias
Funcionário pertence a setorfuncionarios → setores

O pensamento relacional muda a forma de enxergar sistemas. O aluno começa a perceber que aplicativos, sites e sistemas são formados por informações conectadas.

BLOCO 4 — Tipos de Dados

Nem todo dado é igual. Idade não é texto, data não é telefone, preço não é nome e verdadeiro/falso não é CPF.

O tipo de dado define que tipo de informação uma coluna aceita.

Atributo / colunaTipo adequado
nomeVARCHAR
idadeINT
precoDECIMAL
data_nascimentoDATE
ativoBOOLEAN

Texto

Usado para nomes, e-mails, cidades, endereços, descrições e telefones.

VARCHAR(100) significa texto variável de até 100 caracteres.

Números

TipoUso
INTnúmeros inteiros
BIGINTnúmeros muito grandes
DECIMALvalores financeiros e precisos
FLOATnúmeros aproximados

Problema importante

Valores financeiros normalmente devem usar DECIMAL, não FLOAT, porque dinheiro exige precisão.

Datas

Datas são usadas para nascimento, cadastro, pagamento, entrega, login, vencimento e histórico.

TipoUso
DATEapenas data
TIMEapenas horário
DATETIMEdata e hora
TIMESTAMPregistro temporal

NULL

NULL não significa zero nem texto vazio. NULL significa ausência de informação.

ValorSignificado
0valor numérico
""texto vazio
NULLausência de informação

Escolher tipos corretamente melhora validação, desempenho, armazenamento e consistência.

BLOCO 5 — Integridade dos Dados

Integridade significa manter os dados corretos, válidos, coerentes e confiáveis.

Um banco de dados profissional não deve apenas guardar dados. Ele também deve proteger os dados contra erros.

Integridade de entidade

Garante que cada registro possa ser identificado corretamente. A chave primária não deve repetir e não deve ser nula.

Integridade referencial

Garante que os relacionamentos entre tabelas sejam válidos.

Exemplo de erro

Um aluno aparece com id_turma = 999, mas a turma 999 não existe. Isso é uma referência quebrada.

Integridade de domínio

Garante que os valores aceitos façam sentido para o atributo.

Atributo / colunaRegra esperada
idadenúmero positivo
notaentre 0 e 10
emailformato válido
datadata existente

Restrições comuns

RestriçãoFunção
NOT NULLimpede ausência de valor
UNIQUEimpede repetição
PRIMARY KEYidentificação única
FOREIGN KEYprotege relacionamentos
CHECKvalida regras
DEFAULTdefine valor padrão

Ideia profissional

Mesmo que a aplicação valide os dados, o banco também deve validar. O banco deve ser a última barreira de proteção.

BLOCO 6 — Como os Bancos Funcionam nos Sistemas Reais

O usuário enxerga telas, botões, formulários, listas e relatórios. Mas por trás dessas telas, o sistema está lendo e gravando dados em tabelas.

Usuário
   ↓
Tela
   ↓
Aplicação
   ↓
API / Servidor
   ↓
Banco de Dados
   ↓
Resposta

Exemplo: cadastro

O usuário vê um formulário com nome, e-mail e senha. A aplicação valida os dados e, antes de gravar a senha, transforma-a usando um mecanismo seguro de hash de senha.

-- Representação didática: a aplicação gera o hash antes do INSERT
INSERT INTO usuarios
(nome, email, senha_hash)
VALUES
('João', 'joao@email.com', '<hash_gerado_pela_aplicacao>');

Regra de segurança

Senha não deve ser armazenada em texto puro no banco. O banco guarda o resultado apropriado do processo de proteção realizado pela aplicação.

Exemplo: login

Quando alguém faz login, a aplicação localiza o usuário e verifica a senha informada de forma segura comparando-a com o hash armazenado. Não se deve buscar uma senha em texto puro no banco.

Exemplo: loja virtual

Quando alguém compra online, o sistema precisa localizar cliente, verificar estoque, registrar pedido, registrar pagamento e atualizar produtos.

clientes
↓
pedidos
↓
itens_pedido
↓
produtos
↓
pagamentos

Os bancos também ajudam empresas a gerar relatórios, dashboards, estatísticas, análises e decisões.

BLOCO 7 — Problemas Clássicos de Iniciantes

Os maiores problemas em banco de dados geralmente não começam no SQL, mas na estrutura.

Usar texto para tudo

Tipos incorretos prejudicam cálculos, filtros, validações e ordenações.

Guardar telefone como número puro

Telefones podem ter DDD, código internacional, espaços, hífens e zeros iniciais. Muitas vezes funcionam melhor como texto.

Usar nome como chave

Nomes podem repetir. IDs e códigos únicos são mais seguros.

Misturar informações

Uma coluna deve armazenar apenas um tipo de informação.

Exemplo ruim

cliente
João - 19 99999-8888 - Centro

Exemplo melhor

nometelefonebairro
João19 99999-8888Centro

Banco de Dados exige pensamento estrutural. Não é apenas código. É organização lógica da informação.

BLOCO 8 — Resumo Estrutural dos Fundamentos

Banco de Dados não funciona como conceitos isolados. Tudo trabalha junto.

Dados
↓
Informação
↓
Estrutura
↓
Tabelas
↓
Colunas / atributos
↓
Tipos
↓
Chaves
↓
Relacionamentos
↓
Integridade
↓
Sistema funcionando

Os próximos capítulos dependem desses fundamentos. Modelagem, normalização, SQL, JOIN, transações e projetos só fazem sentido quando essa base está clara.

BLOCO 9 — Como Pensar um Banco de Dados

O maior erro dos iniciantes é acreditar que criar um banco começa abrindo o MySQL e digitando comandos.

Profissionais normalmente fazem o contrário: primeiro pensam a estrutura.

Banco de Dados começa antes do computador

Antes de SQL, MySQL, tabelas ou código, vem a organização mental das informações.

Analogia

Ninguém constrói uma casa levantando paredes aleatoriamente. Primeiro se analisa, planeja e projeta. Com bancos acontece a mesma coisa.

Exemplo: sistema escolar

Escola
↓
Alunos
Professores
Turmas
Disciplinas
Notas
Frequência

Depois pensamos nas colunas/atributos, tipos, chaves, relacionamentos e regras de integridade.

Ideia principal

Banco de Dados começa na organização mental das informações.

Checagem antes de avançar

  1. Explique a diferença entre dado e informação.
  2. Diferencie tabela, registro, coluna/atributo e valor.
  3. Qual é a função de PK e FK?
  4. Por que integridade e tipos de dados importam?

Prática completa

Os exercícios graduados deste capítulo estão em 99 Exercícios → Capítulo 1.

FECHAMENTO DO CAPÍTULO 1

A partir deste ponto, o aluno já consegue enxergar sistemas como estruturas organizadas de informação.

Agora já é possível compreender tabelas, registros, relacionamentos, tipos, integridade e o funcionamento básico dos sistemas modernos.

Mais importante: o aluno começa a desenvolver pensamento estrutural.

Os próximos capítulos aprofundarão modelagem, representação visual, organização lógica e implementação profissional em bancos reais.

Capítulo 2

Modelagem Conceitual

Este capítulo ensina como transformar problemas reais em estruturas organizadas de informação, identificando entidades, atributos, relacionamentos, cardinalidades e representações visuais por DER.

BLOCO 1 — O que é Modelagem

Um dos maiores erros de quem começa Banco de Dados é acreditar que desenvolver um banco significa abrir o MySQL, criar tabelas e começar digitando SQL.

Em sistemas profissionais, normalmente acontece o contrário: antes de existir tabela, comando, banco físico ou código, existe planejamento estrutural.

Esse planejamento recebe o nome de modelagem.

Ideia principal

Modelagem é representar um problema real de forma organizada, antes de implementar fisicamente o banco de dados.

Por que modelar?

Antes de criar o banco, precisamos entender quais informações existem, quais relações existem, quais regras precisam ser respeitadas e como tudo se conecta.

A modelagem serve para:

  • organizar informações;
  • reduzir redundância;
  • evitar inconsistências;
  • facilitar manutenção;
  • melhorar comunicação entre equipes;
  • preparar a implementação correta do banco.

Analogia importante

Ninguém constrói uma casa, um hospital ou uma ponte levantando paredes aleatoriamente. Primeiro se analisa, planeja, desenha e organiza. Banco de Dados funciona da mesma forma.

Problema real
↓
Análise
↓
Modelagem
↓
Estrutura lógica
↓
Banco físico
↓
SQL

Pensar como usuário é diferente de pensar como analista

O usuário normalmente pensa em ações: cadastrar cliente, lançar nota, consultar pedido, emitir relatório.

O analista pensa estruturalmente:

  • quais entidades existirão?
  • quais atributos serão necessários?
  • como essas entidades se relacionam?
  • quais regras precisam ser respeitadas?
  • quais dados precisam ser armazenados?

Modelagem não é apenas desenhar caixas. É raciocínio estrutural.

BLOCO 2 — Entidades

Entidade é algo importante do mundo real que precisa ser representado no sistema.

Normalmente representa pessoas, objetos, eventos, processos ou elementos relevantes para o funcionamento do sistema.

SistemaPossíveis entidades
EscolaAluno, Professor, Turma, Disciplina
Loja virtualCliente, Produto, Pedido, Pagamento
HospitalPaciente, Médico, Consulta, Exame
BancoCliente, Conta, Transação, Cartão

Importante

Nem tudo vira entidade. Entidade representa algo relevante para o sistema e que precisa ter informações armazenadas.

Como identificar entidades?

O analista observa o problema real e procura elementos principais, normalmente substantivos importantes do processo.

Um cliente realiza pedidos em uma loja.

Possíveis entidades:

  • Cliente;
  • Pedido;
  • Produto;
  • Pagamento.

Entidade não é tabela ainda

Na modelagem conceitual, ainda não estamos criando tabelas físicas. Estamos analisando o mundo real e representando seus elementos importantes.

Mundo real
↓
Entidades
↓
Relacionamentos
↓
Modelo conceitual
↓
Modelo lógico
↓
Banco físico

Entidade associativa: quando a relação também precisa guardar dados

Alguns relacionamentos precisam ser representados por um elemento próprio. É o caso de ItemPedido, que liga Pedido e Produto e pode guardar informações da própria relação, como quantidade e preço praticado.

Esse tipo de estrutura é especialmente importante em relacionamentos N:N. Mais adiante veremos como ela se transforma em uma tabela associativa no modelo lógico.

BLOCO 3 — Atributos

As entidades sozinhas ainda não bastam. Depois de identificar uma entidade, precisamos definir quais informações ela precisa armazenar.

Essas informações são chamadas de atributos.

Ideia principal

Atributo é uma característica de uma entidade.

Exemplo: entidade Aluno

Aluno
 ├── id_aluno
 ├── nome
 ├── telefone
 ├── email
 └── data_nascimento

Exemplo: entidade Produto

Produto
 ├── id_produto
 ├── nome
 ├── preco
 ├── estoque
 └── estoque_minimo

Atributo ou entidade?

Se “categoria” tiver identidade e informações próprias e vários produtos puderem pertencer a ela, é melhor modelá-la como entidade Categoria relacionada a Produto, e não como um simples atributo textual repetido.

Tipos de atributos

TipoDescriçãoExemplo
Simplesnão precisa ser divididoidade, salário, CPF
Compostopode ser dividido em partesendereço → rua, número, bairro
Multivaloradopode possuir vários valorestelefones de uma pessoa
Derivadopode ser calculado a partir de outro dadoidade calculada pela data de nascimento

Problema clássico

Misturar várias informações em um único atributo dificulta busca, filtro, validação e atualização.

Exemplo ruim

cliente
João - 19 99999-8888 - Centro

Exemplo melhor

nometelefonebairro
João19 99999-8888Centro

Cada atributo deve armazenar apenas um tipo de informação.

BLOCO 4 — Relacionamentos

As entidades não vivem isoladas. No mundo real, alunos pertencem a turmas, clientes fazem pedidos, produtos pertencem a categorias e médicos realizam consultas.

Relacionamento é a associação entre entidades.

Antes de desenhar: descubra a regra de negócio

Relacionamentos e cardinalidades não devem ser escolhidos por aparência. Eles nascem das regras de negócio: frases que explicam como o sistema realmente funciona.

Exemplo: cliente e pedidos

“Um cliente pode realizar vários pedidos, mas cada pedido pertence a um único cliente.” Essa frase já indica o relacionamento Cliente–Pedido e prepara a cardinalidade 1:N.

Antes de traçar uma linha no DER, pergunte: quem se relaciona com quem, isso é obrigatório e quantas ocorrências podem participar?

Mundo realModelagem
Cliente faz pedidoCliente → Pedido
Produto pertence à categoriaProduto → Categoria
Médico realiza consultaMédico → Consulta
Aluno frequenta turmaAluno → Turma

Por que relacionamentos são importantes?

Sem relacionamentos, as tabelas ficam isoladas, os dados não conversam e o sistema perde sentido.

Cliente
   ↓
Pedido
   ↓
Produto
   ↓
Pagamento

Relacionamentos reduzem redundância, melhoram organização, ajudam na integridade e representam regras reais do negócio.

Relacionamento também comunica regra

A ligação entre Cliente e Pedido não é apenas visual. Ela significa que um pedido pertence a um cliente, e que o sistema deve respeitar essa relação.

BLOCO 5 — Cardinalidade

Depois de identificar o relacionamento, precisamos responder uma pergunta essencial: quantas ocorrências de uma entidade podem se relacionar com outra?

Isso é chamado de cardinalidade.

Ideia principal

Cardinalidade define quantas ocorrências de uma entidade podem se relacionar com outra.

Relacionamento 1:1

Uma ocorrência se relaciona com apenas uma outra ocorrência.

FUNCIONARIO 1 ─── 1 CRACHA

Esse exemplo só será 1:1 se a regra da organização disser que cada funcionário possui no máximo um crachá ativo e cada crachá pertence a um único funcionário.

Relacionamento 1:N

É um dos relacionamentos mais comuns.

Cliente 1 ─── N Pedido

Um cliente pode fazer vários pedidos, mas cada pedido pertence a um cliente.

Relacionamento N:N

Uma ocorrência de uma entidade pode se relacionar com várias ocorrências da outra, e vice-versa.

Aluno N ─── N Disciplina

Em bancos relacionais, normalmente resolvemos N:N criando uma tabela intermediária.

Aluno
↓
Matricula
↓
Disciplina

A tabela intermediária pode ter informações próprias

id_alunoid_disciplinanotafrequencia
1108.592%

Cardinalidade depende das regras do negócio. Não deve ser inventada sem entender o funcionamento real do sistema.

Cardinalidade mínima e máxima: é obrigatório ou opcional?

Além de saber se a relação é 1:1, 1:N ou N:N, precisamos descobrir se a participação é obrigatória ou opcional.

NotaçãoLeitura
0..1pode não existir ou existir uma ocorrência
1..1deve existir exatamente uma ocorrência
0..Npode não existir nenhuma ou podem existir várias
1..Ndeve existir pelo menos uma e podem existir várias

Exemplo de leitura

Um cliente novo pode ainda não ter feito pedidos: Cliente → Pedido pode ser 0..N. Já um pedido válido deve pertencer a exatamente um cliente: Pedido → Cliente é 1..1.

Essa leitura evita um erro comum: saber apenas “um para muitos”, mas não saber se o relacionamento é obrigatório.

BLOCO 6 — DER (Diagrama Entidade Relacionamento)

Depois de entender entidades, atributos, relacionamentos e cardinalidade, precisamos representar tudo isso visualmente.

DER significa Diagrama Entidade Relacionamento.

Ideia principal

O DER funciona como um mapa estrutural do sistema.

O que o DER mostra?

  • entidades;
  • atributos;
  • relacionamentos;
  • cardinalidades;
  • organização lógica do sistema.

Exemplo simplificado

CLIENTE 1 ─── N PEDIDO
PEDIDO  1 ─── N ITEM_PEDIDO
PRODUTO 1 ─── N ITEM_PEDIDO
CATEGORIA 1 ─── N PRODUTO

O DER não é SQL, não é MySQL e ainda não é o banco físico. Ele é uma representação visual da estrutura pensada.

Problema real
↓
Modelagem
↓
DER
↓
Banco físico
↓
SQL

Por que o DER é importante?

Ele ajuda a visualizar o sistema inteiro, comunicar a estrutura para outras pessoas, encontrar erros antes da implementação e documentar o projeto.

BLOCO 6.1 — Exemplo visual de DER: Sistema Comercial

A seguir temos um exemplo visual de DER para um sistema comercial simples. O objetivo é mostrar, de forma parecida com ferramentas de modelagem, como entidades, atributos, relacionamentos, chaves primárias e cardinalidades aparecem no desenho.

TEM FORNECEDOR PRODUTO TEM CATEGORIA (1,1) (1,n) (1,n) (1,1) ID_FORNECEDOR NOME TELEFONE QTDE PRECO DESCRICAO ID_PRODUTO ID_CATEGORIA NOME LEGENDA: Entidade Relacionamento Chave Primária (PK) Atributo (1,1) (1,n) Cardinalidade

Leitura do modelo

  • FORNECEDOR (1) — (N) PRODUTO: um fornecedor pode fornecer vários produtos, mas cada produto está ligado a um fornecedor neste modelo simplificado.
  • Regra simplificada: este desenho considera um fornecedor por produto apenas para a primeira leitura do DER. Se o negócio permitir vários fornecedores para o mesmo produto, a regra muda para N:N e o modelo precisará ser refinado — exatamente o que faremos no próximo capítulo.
  • CATEGORIA (1) — (N) PRODUTO: uma categoria pode possuir vários produtos, mas cada produto pertence a uma categoria.
  • PRODUTO possui atributos como descrição, preço e quantidade em estoque.
  • As chaves primárias estão destacadas em azul escuro.

Importante

Este DER representa o modelo conceitual do sistema. No próximo capítulo, esse desenho poderá ser transformado em tabelas relacionais, com chaves primárias, chaves estrangeiras e outras restrições.

BLOCO 7 — Problemas Clássicos de Modelagem

Muitos problemas em sistemas começam na modelagem: lentidão, redundância, inconsistência, dificuldade de manutenção e retrabalho.

Entidade demais

Transformar tudo em entidade gera complexidade desnecessária e excesso de tabelas.

Poucas entidades

Colocar tudo em uma estrutura única mistura responsabilidades e gera caos.

Atributos misturados

Guardar várias informações em uma única coluna dificulta consultas e validações.

Cardinalidade errada

Definir 1:1 quando o correto é 1:N limita o sistema e exige retrabalho.

Exemplo de estrutura problemática

alunoturmaprofessordisciplinanota
João1AProfessor ABanco de Dados8.0

Essa estrutura mistura aluno, turma, professor, disciplina e nota em uma única tabela. Isso pode gerar redundância, inconsistência e dificuldade de manutenção.

Fluxo correto

Problema real
↓
Análise
↓
Modelagem
↓
DER
↓
Banco físico
↓
SQL

Modelagem ruim custa caro, porque corrigir a estrutura do banco depois pode afetar todo o sistema.

BLOCO 8 — Pensando Como Analista

O verdadeiro trabalho do analista é transformar problemas reais em estruturas organizadas de informação.

O sistema ainda não foi programado, não possui banco e não possui interface. Mesmo assim, o analista já começa a visualizar a estrutura.

Primeiro passo: entender o problema real

Antes de pensar em SQL, tabelas ou MySQL, o analista pensa no negócio.

Exemplo: uma escola deseja cadastrar alunos, controlar notas, registrar frequência e organizar turmas.

O analista começa perguntando:

  • quais informações precisam existir?
  • quais entidades aparecem?
  • quais atributos são necessários?
  • como as entidades se relacionam?
  • quais regras precisam ser respeitadas?

O analista aprende a separar responsabilidades

Em vez de criar uma “tabela geral”, o analista separa alunos, professores, disciplinas, turmas, notas e frequência.

Aluno
↓
Turma
↓
Disciplina
↓
Nota

Modelagem é pensamento, não ferramenta

A ferramenta pode ser Draw.io, brModelo, MySQL Workbench, Oracle Data Modeler ou papel e caneta. O principal é o raciocínio estrutural.

O objetivo não é decorar diagramas. O objetivo é desenvolver pensamento analítico.

Checagem antes de avançar

  1. Identifique entidades, atributos e relacionamentos em um sistema simples.
  2. Escreva uma regra de negócio antes de definir uma cardinalidade.
  3. Diferencie 1:1, 1:N e N:N.
  4. Explique o que 0..N e 1..1 acrescentam à leitura da cardinalidade.

Prática completa

Os exercícios graduados deste capítulo estão em 99 Exercícios → Capítulo 2.

FECHAMENTO DO CAPÍTULO 2

A partir deste ponto, o aluno já consegue transformar problemas reais em estruturas organizadas de informação.

Agora já é possível identificar entidades, definir atributos, criar relacionamentos, compreender cardinalidades, interpretar DERs, analisar problemas de modelagem e desenvolver visão estrutural de sistemas.

Mais importante: o aluno começa a desenvolver pensamento analítico profissional.

O foco deixa de ser apenas tabelas, comandos e diagramas, e passa a ser organização lógica da informação.

Os próximos capítulos aprofundarão a transformação do modelo conceitual em estruturas relacionais mais próximas da implementação, preparando o caminho para normalização, SQL e projetos completos.

Capítulo 3

Modelagem Lógica e Normalização

Transformação da modelagem conceitual em estrutura relacional organizada, refinada e preparada para implementação física em SQL. Neste capítulo, o DER comercial do capítulo anterior será convertido em tabelas, chaves, relacionamentos, tabelas associativas e formas normais.

BLOCO 1 — Da Modelagem Conceitual para as Tabelas

No capítulo anterior, a modelagem conceitual nos ajudou a enxergar o sistema antes da implementação. Identificamos entidades, atributos, relacionamentos, cardinalidades e representamos tudo visualmente por meio de DER.

Agora a pergunta muda. O aluno já não pergunta apenas “quais entidades existem?”. A pergunta passa a ser: como isso vira uma estrutura relacional real?

Problema real
        ↓
Modelagem Conceitual
        ↓
Modelagem Lógica
        ↓
Modelagem Física
        ↓
SQL no SGBD

A modelagem lógica é a ponte entre o desenho conceitual e o banco físico. Ela ainda não é o SQL final, mas já começa a pensar em tabelas, colunas, registros, chaves primárias, chaves estrangeiras e relações implementáveis.

Ideia principal

A modelagem lógica transforma o modelo conceitual em uma estrutura relacional organizada, ainda antes da criação física no MySQL.

O sistema comercial como referência

Para manter coerência com o DER do capítulo anterior, usaremos o mesmo sistema comercial simples:

  • PRODUTO — representa os itens vendidos ou controlados em estoque;
  • CATEGORIA — agrupa produtos semelhantes;
  • FORNECEDOR — representa quem fornece produtos;
  • PRODUTO_FORNECEDOR — será usada quando um produto puder ter vários fornecedores.

Entidade vira tabela

Na modelagem conceitual, falávamos em entidades. Na modelagem lógica, essas entidades começam a se transformar em tabelas.

Entidade conceitualTabela lógica
PRODUTOproduto
CATEGORIAcategoria
FORNECEDORfornecedor

Atributo vira coluna

Os atributos da entidade passam a ser colunas da tabela.

EntidadeAtributos conceituaisColunas lógicas
PRODUTOdescrição, preço, quantidadedescricao, preco, qtde
CATEGORIAnomenome
FORNECEDORnome, telefonenome, telefone

Ocorrência vira registro

Cada ocorrência de uma entidade vira um registro, ou seja, uma linha dentro da tabela.

id_produtodescricaoprecoqtde
1Mouse Gamer89.9015
2Teclado Mecânico259.908

Cada linha representa um produto real armazenado no banco.

Relacionamento vira chave estrangeira

No DER, víamos uma linha conectando CATEGORIA e PRODUTO. Na modelagem lógica, esse relacionamento precisa aparecer dentro das tabelas.

CATEGORIA 1 ─── N PRODUTO

A forma lógica de representar isso é colocar a chave da categoria dentro da tabela produto.

id_produtodescricaoprecoqtdeid_categoria
1Mouse Gamer89.90152

Agora o relacionamento deixou de ser apenas visual. Ele virou estrutura relacional.

Leitura correta

O produto possui uma coluna id_categoria porque cada produto pertence a uma categoria. Essa coluna será a chave estrangeira da tabela produto.

BLOCO 2 — PK e FK na Estrutura Relacional

Agora precisamos aprofundar dois conceitos centrais da modelagem lógica: PK e FK.

PK — Chave Primária

PK significa Primary Key, ou chave primária. Sua função é identificar cada registro de forma única dentro de uma tabela.

id_produtodescricao
1Mouse
2Mouse

Mesmo que dois produtos tenham descrições parecidas, seus identificadores são diferentes. Isso permite alterar, consultar, relacionar ou excluir exatamente o registro correto.

Problema sem PK

Se a tabela produto tivesse apenas a descrição “Mouse”, o sistema não saberia com segurança qual Mouse alterar, vender, atualizar ou relacionar com fornecedor.

Características de uma PK

  • não deve repetir;
  • não deve ser nula;
  • deve identificar apenas um registro;
  • deve permanecer estável sempre que possível.

FK — Chave Estrangeira

FK significa Foreign Key, ou chave estrangeira. Sua função é conectar uma tabela à outra.

id_categorianome
1Informática
2Periféricos
id_produtodescricaoid_categoria
10Mouse Gamer2
11SSD 1TB1

A coluna id_categoria em produto aponta para id_categoria em categoria.

produto.id_categoria
        ↓
categoria.id_categoria

Integridade referencial

A chave estrangeira ajuda a garantir que um produto não aponte para uma categoria inexistente.

id_produtodescricaoid_categoria
10Mouse99

Se a categoria 99 não existe, o relacionamento está quebrado.

Solução relacional

Com FK, o banco pode impedir que um produto seja gravado com uma categoria inexistente. Isso protege a consistência da estrutura.

PK identifica. FK relaciona.

ElementoFunção
PKidentifica o registro dentro da própria tabela
FKrelaciona o registro com outra tabela

BLOCO 3 — Relacionamento N:N e Tabela Associativa

Nem todo relacionamento é simples. No DER original, podemos simplificar dizendo que um fornecedor possui vários produtos e que um produto pertence a um fornecedor. Porém, em um sistema comercial mais realista, isso pode ser diferente.

Um produto pode ter vários fornecedores, e um fornecedor pode fornecer vários produtos.

PRODUTO N ─── N FORNECEDOR

O problema do N:N

Bancos relacionais não implementam relacionamento muitos-para-muitos diretamente dentro de uma única coluna.

id_produtodescricaofornecedores
10Mouse GamerTech, Alpha, Mega

Esse modelo é ruim porque guarda vários valores em uma única coluna.

A solução: tabela associativa

Criamos uma tabela intermediária para representar o relacionamento.

PRODUTO
   ↓
PRODUTO_FORNECEDOR
   ↓
FORNECEDOR
id_produtodescricao
10Mouse Gamer
id_fornecedornome
1Tech Distribuidora
2Alpha Tecnologia
id_produtoid_fornecedor
101
102

Agora o relacionamento N:N foi transformado em dois relacionamentos 1:N.

Chave composta na tabela associativa

Na tabela produto_fornecedor, a combinação id_produto + id_fornecedor pode identificar cada relação de forma única. Quando uma chave é formada por mais de uma coluna, chamamos de chave composta.

PRIMARY KEY (id_produto, id_fornecedor)

Assim, o mesmo par produto–fornecedor não pode aparecer duplicado, embora o mesmo produto possa aparecer com fornecedores diferentes.

A relação também pode ter atributos

Às vezes, a tabela associativa não serve apenas para ligar duas tabelas. Ela também pode guardar informações próprias da relação.

id_produtoid_fornecedorpreco_custoprazo_entrega
10155.005 dias
10258.003 dias

O preço de custo não pertence apenas ao produto. Ele depende da combinação entre produto e fornecedor.

Ideia principal

Quando uma informação depende da relação entre duas entidades, ela deve ficar na tabela associativa.

BLOCO 4 — Redundância e o Nascimento da Normalização

Agora que já temos tabelas, PK, FK e relacionamentos, começamos a enxergar problemas estruturais com mais clareza.

O principal deles é a redundância.

O que é redundância?

Redundância é repetição desnecessária de informações.

id_produtodescricaocategoria
10Mouse GamerPeriféricos
11Teclado MecânicoPeriféricos
12HeadsetPeriféricos

A categoria “Periféricos” aparece repetida. Em uma tabela pequena isso parece simples, mas em um sistema real com milhares de produtos, o problema cresce.

Problemas causados pela redundância

  • desperdício de armazenamento;
  • risco de inconsistência;
  • dificuldade de atualização;
  • retrabalho;
  • relatórios incorretos.

Anomalia de atualização

Se a categoria “Periféricos” mudar para “Acessórios”, todas as linhas precisam ser atualizadas. Se uma linha ficar para trás, o banco passa a ter informações inconsistentes.

Anomalia de inserção

Se categoria e produto estiverem misturados na mesma tabela, talvez não seja possível cadastrar uma categoria nova enquanto ainda não existir produto para ela.

Anomalia de exclusão

Se o último produto de uma categoria for apagado, talvez a informação da própria categoria desapareça junto.

Origem da normalização

A normalização nasce exatamente para reduzir redundância, evitar anomalias e organizar melhor as dependências entre os dados.

BLOCO 5 — Primeira Forma Normal (1FN)

A Primeira Forma Normal resolve problemas de valores múltiplos e grupos repetitivos.

Ideia central da 1FN

Cada coluna deve armazenar apenas um valor atômico por registro.

Valor atômico

Valor atômico é um valor indivisível no contexto da tabela. Ou seja, uma mesma célula não deve guardar listas ou vários valores misturados.

Exemplo incorreto

id_produtodescricaofornecedores
10Mouse GamerTech, Alpha, Mega

A coluna fornecedores possui vários valores dentro de uma única célula. Isso viola a 1FN.

Exemplo correto

id_produtodescricao
10Mouse Gamer
id_fornecedornome
1Tech
2Alpha
3Mega
id_produtoid_fornecedor
101
102
103

Grupos repetitivos

Outro problema comum é criar colunas repetidas.

id_pedidoproduto1produto2produto3
100MouseSSDHeadset

Isso limita o crescimento. E se o pedido tiver dez produtos?

Solução

id_pedidoid_produto
10010
10011
10012

Agora o crescimento acontece em linhas, não em colunas repetidas.

BLOCO 6 — Segunda Forma Normal (2FN)

Antes da 2FN, precisamos tornar explícita uma ideia que já estamos usando: dependência funcional.

Dependência funcional, sem complicar

Dizemos que um dado depende de outro quando conhecer o identificador correto determina qual valor deve aparecer. Por exemplo: id_fornecedor → nome_fornecedor. O ID do fornecedor determina qual é o seu nome.

Em uma tabela associativa com chave composta, precisamos perguntar se cada atributo depende da combinação inteira da chave ou somente de uma parte dela.

A Segunda Forma Normal resolve justamente problemas de dependência parcial.

Ideia central da 2FN

Um atributo deve depender da chave inteira, e não apenas de parte dela.

A 2FN aparece principalmente em tabelas com chave composta, como tabelas associativas.

Exemplo problemático

id_produtoid_fornecedornome_fornecedorpreco_custo
101Tech Distribuidora55.00
111Tech Distribuidora70.00

Se a chave da tabela é formada por id_produto + id_fornecedor, a coluna nome_fornecedor não depende da combinação inteira. Ele depende apenas de id_fornecedor.

Isso é dependência parcial.

Estrutura correta

id_fornecedornome
1Tech Distribuidora
id_produtoid_fornecedorpreco_custo
10155.00
11170.00

Agora nome do fornecedor fica na tabela fornecedor, e preço de custo fica na tabela que representa a relação produto-fornecedor.

Regra prática

Se uma informação depende apenas de parte da chave composta, ela provavelmente está na tabela errada.

BLOCO 7 — Terceira Forma Normal (3FN)

A Terceira Forma Normal resolve problemas de dependência transitiva.

Ideia central da 3FN

Um atributo não deve depender de outro atributo não-chave. Ele deve depender da chave da tabela.

Exemplo problemático

id_fornecedornomeid_cidadenome_cidadeestado
1Tech Distribuidora10CampinasSP
2Alpha Tecnologia10CampinasSP

O nome da cidade e o estado não dependem diretamente do fornecedor. Eles dependem de id_cidade.

id_fornecedor
      ↓
id_cidade
      ↓
nome_cidade / estado

Isso é dependência transitiva.

Estrutura correta

id_cidadenome_cidadeestado
10CampinasSP
id_fornecedornomeid_cidade
1Tech Distribuidora10
2Alpha Tecnologia10

Agora a cidade fica centralizada em uma tabela própria.

Outro exemplo no sistema comercial

id_produtodescricaoid_categorianome_categoria
10Mouse Gamer2Periféricos

O nome da categoria depende de id_categoria, não diretamente de id_produto. Portanto, deve ficar na tabela categoria.

BLOCO 8 — Refinamento Lógico e Visão Profissional

Depois de aplicar modelagem lógica e normalização, o sistema comercial começa a ficar realmente organizado.

TabelaResponsabilidade
categoriaguardar os dados das categorias
cidadeguardar os dados das cidades
fornecedorguardar os dados dos fornecedores
produtoguardar os dados dos produtos
produto_fornecedorguardar a relação entre produto e fornecedor
CATEGORIA 1 ─── N PRODUTO
CIDADE    1 ─── N FORNECEDOR
PRODUTO   1 ─── N PRODUTO_FORNECEDOR
FORNECEDOR 1 ─ N PRODUTO_FORNECEDOR

Modelo lógico refinado

TabelaColunas principais
categoriaid_categoria, nome
cidadeid_cidade, nome_cidade, estado
fornecedorid_fornecedor, nome, telefone, id_cidade
produtoid_produto, descricao, preco, qtde, id_categoria
produto_fornecedorid_produto, id_fornecedor, preco_custo, prazo_entrega

Agora cada tabela possui responsabilidade clara. Essa é uma característica importante de uma boa modelagem lógica.

Equilíbrio profissional

Normalizar não significa criar tabelas infinitas. O objetivo é equilíbrio: reduzir redundância, manter clareza e permitir manutenção futura.

Resultado esperado

Um banco bem modelado é mais fácil de consultar, alterar, manter, documentar e implementar em SQL.

Checagem antes de avançar

  1. Explique como entidade, atributo e relacionamento chegam ao modelo lógico.
  2. Por que um N:N costuma exigir tabela associativa?
  3. Diferencie 1FN, 2FN e 3FN pelo problema que cada uma evita.
  4. Explique por que dependência funcional ajuda a decidir onde um dado deve ficar.

Prática completa

Os exercícios graduados deste capítulo estão em 99 Exercícios → Capítulo 3.

FECHAMENTO DO CAPÍTULO 3

Ao longo deste capítulo, o aluno deixou de enxergar o banco de dados apenas como tabelas isoladas e passou a compreender a estrutura relacional de forma muito mais profissional.

Agora já é possível:

  • transformar entidades em tabelas;
  • compreender PK e FK;
  • implementar relacionamentos;
  • resolver relacionamentos N:N;
  • utilizar tabelas associativas;
  • identificar redundância;
  • compreender 1FN, 2FN e 3FN;
  • analisar dependências;
  • refinar estruturalmente um banco relacional.

Mais importante: o aluno começou a desenvolver pensamento lógico relacional.

Próximo passo

Agora SQL deixará de ser apenas comandos decorados e passará a ser implementação prática de uma estrutura lógica já compreendida.

Capítulo 4

SQL com MySQL

Implementação física do modelo comercial refinado no MySQL usando SQL, com foco em terminal CLI, criação e evolução de estruturas, cinco tabelas relacionadas, restrições, inserção dos dados existentes, consultas, filtros, alterações, exclusões, chaves estrangeiras, JOIN, agregações, GROUP BY e boas práticas.

BLOCO 1 — Modelagem Física

Até aqui trabalhamos a modelagem conceitual e a modelagem lógica. Agora entramos na modelagem física, que é a implementação concreta do banco dentro de um SGBD real.

Modelagem Conceitual
↓
Modelagem Lógica e Normalização
↓
Modelagem Física
↓
SQL no MySQL

Na modelagem física, decisões como tipos reais, chaves, restrições e estrutura das tabelas deixam de ser apenas ideia e passam a existir dentro do MySQL.

Ideia principal

SQL será usado para transformar a estrutura lógica do sistema comercial em um banco físico real.

BLOCO 2 — O que é SQL?

SQL significa Structured Query Language, ou Linguagem de Consulta Estruturada. SQL não é o banco; SQL é a linguagem usada para conversar com o banco.

ConceitoSignificado
SQLlinguagem usada para criar, consultar e manipular dados
MySQLSGBD que executa comandos SQL
Bancoconjunto organizado de tabelas e dados

Usaremos SQL sempre conectado ao sistema comercial já modelado: categoria, cidade, fornecedor, produto e produto_fornecedor. O objetivo é implementar o mesmo modelo refinado no capítulo anterior, sem voltar para uma estrutura simplificada.

BLOCO 3 — O que é MySQL e o que é SGBD?

SGBD significa Sistema Gerenciador de Banco de Dados. O MySQL é um SGBD relacional. Ele executa comandos SQL, armazena dados, controla permissões, protege integridade e gerencia as tabelas fisicamente.

Aluno escreve SQL
↓
MySQL interpreta
↓
MySQL executa
↓
Banco físico é alterado

Neste tutorial, os exemplos principais serão pensados para o CLI do MySQL, aquela tela preta de terminal, para que o aluno aprenda SQL de forma direta.

BLOCO 4 — Preparando o Ambiente MySQL

Para executar os comandos deste capítulo, o computador precisa ter o MySQL Server instalado e configurado. No Windows, a instalação oficial atual pode ser feita pelo pacote MSI e pelo MySQL Configurator.

  1. Instale o MySQL Server.
  2. Durante a configuração, defina e guarde a senha administrativa solicitada.
  3. Confirme que o serviço do MySQL está iniciado.
  4. Abra o Prompt de Comando ou o terminal do MySQL.
mysql -u root -p

Depois de informar a senha, o aluno estará dentro do ambiente interativo do MySQL.

Se “mysql” não for reconhecido

O executável do MySQL pode não estar no PATH do Windows. Nesse caso, use o cliente instalado pelo MySQL ou configure o diretório bin da instalação no PATH. O caminho exato depende da versão e do local escolhido na instalação.

A administração completa de instalação, usuários, permissões, backup e restauração será aprofundada no Capítulo 6. Aqui fazemos apenas o necessário para conseguir praticar SQL desde já.

Regra dos laboratórios: preserve a base de referência

O banco comercio será reutilizado nos próximos capítulos. Por isso, exemplos que alteram dados devem terminar deixando a base novamente em um estado conhecido. Enquanto ainda estamos aprendendo SQL básico, usaremos principalmente registros temporários + limpeza ou tabelas de laboratório separadas. No Capítulo 7, depois de aprender transações, também usaremos ROLLBACK para desfazer testes com segurança.

BLOCO 5 — CREATE DATABASE e USE

O primeiro passo físico é criar o banco de dados do sistema comercial.

CREATE DATABASE comercio;
SHOW DATABASES;
USE comercio;

CREATE DATABASE cria o banco. SHOW DATABASES lista os bancos existentes. USE seleciona o banco ativo.

Query OK, 1 row affected
Database changed

BLOCO 6 — CREATE TABLE: criando as tabelas do sistema comercial

Agora criaremos as cinco tabelas do modelo lógico refinado. A ordem importa: primeiro as tabelas que não dependem de outras; depois as que possuem chaves estrangeiras; por último, a tabela associativa.

CATEGORIA    CIDADE
    ↓          ↓
 PRODUTO   FORNECEDOR
      ↘    ↙
 PRODUTO_FORNECEDOR
CREATE TABLE categoria (
    id_categoria INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(50) NOT NULL UNIQUE
);

CREATE TABLE cidade (
    id_cidade INT PRIMARY KEY AUTO_INCREMENT,
    nome_cidade VARCHAR(80) NOT NULL,
    estado CHAR(2) NOT NULL,
    UNIQUE (nome_cidade, estado)
);

CREATE TABLE fornecedor (
    id_fornecedor INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(80) NOT NULL,
    telefone VARCHAR(20),
    id_cidade INT,

    FOREIGN KEY (id_cidade)
        REFERENCES cidade(id_cidade)
);

CREATE TABLE produto (
    id_produto INT PRIMARY KEY AUTO_INCREMENT,
    descricao VARCHAR(100) NOT NULL,
    preco DECIMAL(10,2) NOT NULL,
    qtde INT NOT NULL DEFAULT 0,
    id_categoria INT NOT NULL,
    estoque_minimo INT NOT NULL DEFAULT 0,

    CONSTRAINT chk_produto_preco CHECK (preco >= 0),
    CONSTRAINT chk_produto_qtde CHECK (qtde >= 0),
    CONSTRAINT chk_produto_estoque_minimo CHECK (estoque_minimo >= 0),

    FOREIGN KEY (id_categoria)
        REFERENCES categoria(id_categoria)
);

CREATE TABLE produto_fornecedor (
    id_produto INT NOT NULL,
    id_fornecedor INT NOT NULL,
    preco_custo DECIMAL(10,2),
    prazo_entrega INT,

    PRIMARY KEY (id_produto, id_fornecedor),

    FOREIGN KEY (id_produto)
        REFERENCES produto(id_produto),

    FOREIGN KEY (id_fornecedor)
        REFERENCES fornecedor(id_fornecedor),

    CONSTRAINT chk_preco_custo CHECK (preco_custo >= 0),
    CONSTRAINT chk_prazo_entrega CHECK (prazo_entrega >= 0)
);

Agora o SQL respeita exatamente o raciocínio do capítulo anterior: produto não possui id_fornecedor. A relação N:N fica em produto_fornecedor.

AUTO_INCREMENT

Permite que o MySQL gere automaticamente o próximo ID quando a aplicação não informa um valor. Mesmo assim, ainda podemos inserir IDs explícitos quando precisamos preservar códigos de uma base existente.

Restrições reais

NOT NULL exige valor, UNIQUE impede duplicidade, DEFAULT fornece um valor padrão e CHECK rejeita valores que violem uma regra definida.

SHOW TABLES;
DESCRIBE categoria;
DESCRIBE cidade;
DESCRIBE fornecedor;
DESCRIBE produto;
DESCRIBE produto_fornecedor;

BLOCO 6.1 — ALTER TABLE: quando a estrutura precisa evoluir

CREATE TABLE cria a estrutura inicial. Mas sistemas evoluem. ALTER TABLE modifica a estrutura de uma tabela que já existe.

Para aprender sem alterar o modelo comercial, use uma tabela de laboratório:

CREATE TABLE estrutura_lab (
    id INT PRIMARY KEY
);

ALTER TABLE estrutura_lab
ADD COLUMN observacao VARCHAR(100);

DESCRIBE estrutura_lab;

ALTER TABLE estrutura_lab
DROP COLUMN observacao;

DROP TABLE estrutura_lab;

Mudança de estrutura não é um Ctrl+Z

ALTER TABLE, DROP TABLE e outros comandos que mudam a estrutura podem causar commit implícito no MySQL. Por isso o laboratório usa uma tabela descartável. Mais adiante, quando estudarmos transações, veremos por que não devemos contar com ROLLBACK para recuperar uma estrutura removida.

BLOCO 7 — INSERT INTO: inserindo os dados da base

Agora o banco deixa de ser apenas estrutura e começa a receber dados. Vamos preservar os dados existentes de categoria, fornecedor e produto e transformar a antiga ligação produto–fornecedor em registros da tabela associativa.

Não inventar dado que não existe

A base recebida não informa a cidade de cada fornecedor nem preço de custo/prazo de entrega por fornecedor. Por isso esses campos ficarão NULL até existirem dados reais. A estrutura está pronta, mas não vamos preencher informações fictícias apenas para “completar” a tabela.

Inserindo categorias

INSERT INTO categoria (id_categoria, nome)
VALUES
(1, 'DOCE'),
(2, 'SALGADO'),
(3, 'BEBIDA'),
(4, 'LIMPEZA'),
(5, 'PERFUMARIA'),
(6, 'UTENSILIO'),
(7, 'FRUTAS'),
(8, 'VERDURA'),
(9, 'CARNE'),
(10, 'FRIOS'),
(11, 'PADARIA'),
(12, 'HIGIENE'),
(13, 'CONGELADOS'),
(14, 'MATINAIS'),
(15, 'LATICINIOS'),
(16, 'ENLATADOS'),
(17, 'TEMPEROS'),
(18, 'MASSAS'),
(19, 'BISCOITOS'),
(20, 'DOCES E SOBREMESAS'),
(21, 'PET SHOP'),
(22, 'UTILIDADES DOMESTICAS'),
(23, 'PAPELARIA'),
(24, 'DESCARTAVEIS'),
(25, 'HORTIFRUTI'),
(26, 'MERCEARIA');

Cidades

A tabela cidade já existe, mas a base atual não informa a cidade verdadeira dos fornecedores. Portanto, ela ficará vazia por enquanto. Quando houver esses dados, eles deverão ser cadastrados antes de associá-los aos fornecedores.

Inserindo fornecedores

INSERT INTO fornecedor (id_fornecedor, nome, telefone)
VALUES
(3, 'ARMAZEM DO COMERCIO', '(19) 9999-1001'),
(4, 'COCA-COLA FEMSA', '(19) 9999-1002'),
(5, 'NESTLE BRASIL', '(19) 9999-1003'),
(6, 'AMBEV DISTRIBUIDORA', '(19) 9999-1004'),
(7, 'SADIA ALIMENTOS', '(19) 9999-1005'),
(8, 'PERDIGAO DISTRIBUICAO', '(19) 9999-1006'),
(9, 'YPE PRODUTOS', '(19) 9999-1007'),
(10, 'UNILEVER BRASIL', '(19) 9999-1008'),
(11, 'PEPSICO', '(19) 9999-1009'),
(12, 'BAUDUCCO', '(19) 9999-1010'),
(13, 'CASA DO MERCADO', '(19) 9999-1011'),
(18, 'DISTRIBUIDORA CENTRAL', '(19) 9999-1012'),
(19, 'MAX ALIMENTOS', '(19) 9999-1013'),
(20, 'BOM PRECO ATACADO', '(19) 9999-1014'),
(21, 'NOVA ERA COMERCIAL', '(19) 9999-1015'),
(22, 'SUPERMIX DISTRIBUIDORA', '(19) 9999-1016'),
(23, 'REAL COMERCIO', '(19) 9999-1017'),
(24, 'ALFA DISTRIBUICAO', '(19) 9999-1018'),
(25, 'COMERCIAL BRASIL', '(19) 9999-1019'),
(26, 'ESTRELA DO LAR', '(19) 9999-1020'),
(27, 'TOP BEBIDAS', '(19) 9999-1021'),
(28, 'VALE ALIMENTOS', '(19) 9999-1022'),
(29, 'PRIME DISTRIBUIDORA', '(19) 9999-1023'),
(30, 'IDEAL COMERCIO', '(19) 9999-1024'),
(31, 'TOTAL LIMPEZA', '(19) 9999-1025');

Inserindo produtos

A tabela produto deve ser inserida depois de categoria, porque possui uma FK apontando para ela. O fornecedor não fica mais dentro de produto.

INSERT INTO produto (id_produto, descricao, preco, qtde, id_categoria, estoque_minimo)
VALUES
(12, 'BALA 7 BELO', 0, 12, 1, 5),
(13, 'PIRULITO', 1, 25, 1, 5),
(14, 'CHICLETE', 0, 8, 1, 10),
(15, 'PACOCA', 1, 6, 1, 10),
(16, 'BOMBOM', 2, 15, 1, 10),
(17, 'COXINHA', 8, 20, 2, 5),
(18, 'QUIBE', 10, 18, 2, 5),
(19, 'MISTAO', 15, 2, 2, 3),
(20, 'PASTEL', 9, 4, 2, 5),
(21, 'ENROLADINHO', 6, 7, 2, 5),
(22, 'COCA COLA LATA', 5, 120, 3, 20),
(23, 'GUARANA LATA', 4, 15, 3, 20),
(24, 'SUCO DE LARANJA', 6, 9, 3, 10),
(25, 'AGUA MINERAL', 2, 18, 3, 30),
(26, 'ENERGETICO', 9, 3, 3, 5),
(27, 'DETERGENTE', 3, 25, 4, 10),
(28, 'SABAO EM PO', 18, 5, 4, 8),
(29, 'AGUA SANITARIA', 5, 6, 4, 8),
(30, 'DESINFETANTE', 7, 4, 4, 8),
(31, 'ESPONJA', 2, 30, 4, 15),
(32, 'SHAMPOO', 15, 12, 5, 5),
(33, 'CONDICIONADOR', 17, 9, 5, 5),
(34, 'SABONETE', 3, 40, 5, 10),
(35, 'CREME DENTAL', 6, 8, 12, 10),
(36, 'DESODORANTE', 12, 2, 5, 5),
(37, 'PRATO DESCARTAVEL', 8, 35, 24, 10),
(38, 'COPO DESCARTAVEL', 6, 10, 24, 15),
(39, 'GUARDANAPO', 4, 12, 24, 20),
(40, 'PAPEL ALUMINIO', 9, 4, 22, 5),
(41, 'FILME PVC', 7, 3, 22, 5),
(42, 'MACA', 8, 20, 7, 10),
(43, 'BANANA', 6, 18, 7, 10),
(44, 'LARANJA', 5, 22, 7, 10),
(45, 'MAMAO', 9, 4, 7, 5),
(46, 'UVA', 14, 2, 7, 5),
(47, 'ALFACE', 3, 15, 8, 8),
(48, 'TOMATE', 7, 7, 8, 10),
(49, 'BATATA', 5, 9, 8, 12),
(50, 'CEBOLA', 6, 6, 8, 10),
(51, 'CENOURA', 4, 5, 8, 8),
(52, 'PICANHA', 65, 1, 9, 2),
(53, 'FRANGO', 18, 8, 9, 5),
(54, 'LINGUICA', 22, 4, 9, 5),
(55, 'CARNE MOIDA', 35, 3, 9, 5),
(56, 'BISTECA', 28, 2, 9, 3),
(57, 'PRESUNTO', 32, 6, 10, 5),
(58, 'MUSSARELA', 45, 4, 10, 5),
(59, 'MORTADELA', 16, 12, 10, 5),
(60, 'IOGURTE', 7, 5, 15, 8),
(61, 'REQUEIJAO', 12, 2, 15, 5),
(62, 'PAO FRANCES', 1, 130, 11, 20),
(63, 'SONHO', 6, 4, 11, 5),
(64, 'BOLO DE CHOCOLATE', 25, 1, 11, 2),
(65, 'ROSCA DOCE', 12, 2, 11, 2),
(66, 'PAO DE FORMA', 9, 6, 11, 5),
(67, 'PAPEL HIGIENICO', 18, 8, 12, 10),
(68, 'ABSORVENTE', 9, 3, 12, 5),
(69, 'ALGODAO', 5, 2, 12, 5),
(70, 'COTONETE', 4, 2, 12, 5),
(71, 'ESCOVA DENTAL', 7, 4, 12, 5);

Inserindo as relações produto–fornecedor

No arquivo antigo, cada produto carregava um id_fornecedor. Agora preservamos essa informação no lugar correto: a tabela produto_fornecedor.

INSERT INTO produto_fornecedor (id_produto, id_fornecedor)
VALUES
(12, 5),
(13, 5),
(14, 5),
(15, 5),
(16, 5),
(17, 13),
(18, 13),
(19, 13),
(20, 13),
(21, 13),
(22, 4),
(23, 6),
(24, 11),
(25, 27),
(26, 6),
(27, 9),
(28, 9),
(29, 9),
(30, 10),
(31, 31),
(32, 10),
(33, 10),
(34, 10),
(35, 10),
(36, 10),
(37, 25),
(38, 25),
(39, 25),
(40, 25),
(41, 25),
(42, 28),
(43, 28),
(44, 28),
(45, 28),
(46, 28),
(47, 28),
(48, 28),
(49, 28),
(50, 28),
(51, 28),
(52, 19),
(53, 7),
(54, 8),
(55, 19),
(56, 7),
(57, 7),
(58, 7),
(59, 7),
(60, 5),
(61, 5),
(62, 12),
(63, 12),
(64, 12),
(65, 12),
(66, 12),
(67, 10),
(68, 10),
(69, 10),
(70, 10),
(71, 10);

Hoje cada produto da base possui uma associação conhecida. A estrutura, porém, já aceita que no futuro o mesmo produto tenha outros fornecedores, sem alterar a tabela produto.

Os IDs começam em valores já existentes porque o banco veio de uma base usada em Access. Isso não é problema: chaves primárias não precisam ser sequenciais perfeitas; precisam ser únicas. Como usamos AUTO_INCREMENT, novos cadastros sem ID explícito poderão continuar a sequência automaticamente.

BLOCO 8 — SELECT: consultando dados

SELECT consulta dados no banco. Ele não altera, não apaga e não insere registros.

SELECT * FROM categoria;
SELECT * FROM cidade;
SELECT * FROM fornecedor;
SELECT * FROM produto;
SELECT * FROM produto_fornecedor;

Também podemos consultar apenas algumas colunas:

SELECT descricao, preco, qtde
FROM produto;

DISTINCT e LIMIT

DISTINCT elimina repetições no resultado e LIMIT restringe quantas linhas serão exibidas.

SELECT DISTINCT id_categoria
FROM produto;

SELECT descricao, preco
FROM produto
ORDER BY id_produto
LIMIT 10;

BLOCO 9 — WHERE: filtrando dados

WHERE aplica condições. Ele permite buscar apenas os registros que interessam.

SELECT *
FROM produto
WHERE id_categoria = 3;

SELECT *
FROM produto
WHERE qtde <= estoque_minimo;

SELECT descricao, preco
FROM produto
WHERE preco > 20;

Com esses dados, já é possível identificar bebidas, produtos caros e itens com estoque baixo.

Combinando condições

SELECT *
FROM produto
WHERE preco >= 5 AND preco <= 20;

SELECT *
FROM produto
WHERE id_categoria IN (3, 7, 8);

SELECT *
FROM produto
WHERE preco BETWEEN 10 AND 30;

SELECT *
FROM fornecedor
WHERE id_cidade IS NULL;

SELECT *
FROM produto
WHERE NOT id_categoria = 3;

SELECT *
FROM produto
WHERE id_categoria = 3 OR id_categoria = 15;

AND exige as duas condições; OR aceita uma ou outra; NOT nega uma condição; IN testa uma lista; BETWEEN testa um intervalo; e valores nulos são verificados com IS NULL ou IS NOT NULL, nunca com = NULL.

BLOCO 10 — ORDER BY: ordenando resultados

ORDER BY organiza o resultado da consulta.

SELECT descricao, preco
FROM produto
ORDER BY descricao;

SELECT descricao, preco
FROM produto
ORDER BY preco DESC;

SELECT descricao, qtde
FROM produto
ORDER BY qtde;

ASC é crescente. DESC é decrescente. Quando omitimos, o MySQL usa ordem crescente por padrão.

BLOCO 11 — LIKE: pesquisas textuais

LIKE permite procurar padrões em campos de texto. O símbolo % funciona como coringa.

SELECT descricao
FROM produto
WHERE descricao LIKE 'P%';

SELECT descricao
FROM produto
WHERE descricao LIKE '%COLA%';

SELECT nome
FROM fornecedor
WHERE nome LIKE '%BRASIL%';

SELECT nome
FROM categoria
WHERE nome LIKE '%DOCE%';

Esse tipo de busca aparece em sistemas reais quando o usuário digita parte do nome de um produto, fornecedor ou categoria.

BLOCO 12 — UPDATE: alterando registros

UPDATE modifica dados existentes. O uso do WHERE é essencial. Para praticar sem alterar um produto real da base, criaremos um registro temporário apenas para este teste.

INSERT INTO produto
(id_produto, descricao, preco, qtde, id_categoria, estoque_minimo)
VALUES
(1001, 'PRODUTO TEMPORARIO UPDATE', 5, 1, 3, 0);

SELECT *
FROM produto
WHERE id_produto = 1001;

UPDATE produto
SET preco = 6
WHERE id_produto = 1001;

SELECT *
FROM produto
WHERE id_produto = 1001;

-- limpeza do laboratório
DELETE FROM produto
WHERE id_produto = 1001;

Cuidado

UPDATE sem WHERE altera todos os registros da tabela. Em um banco real, isso pode causar grande impacto.

Por que usamos um produto temporário?

O objetivo é aprender UPDATE sem modificar a base que será usada nos capítulos seguintes. O comando DELETE usado apenas para limpeza será explicado detalhadamente no próximo bloco.

BLOCO 13 — DELETE: removendo registros

DELETE remove registros. Assim como UPDATE, precisa de muito cuidado com WHERE.

Para praticar sem destruir um produto real da base, crie primeiro um registro temporário sem fornecedor associado.

INSERT INTO produto
(id_produto, descricao, preco, qtde, id_categoria, estoque_minimo)
VALUES
(1000, 'PRODUTO TEMPORARIO', 5, 1, 3, 0);

SELECT *
FROM produto
WHERE id_produto = 1000;

DELETE FROM produto
WHERE id_produto = 1000;

SELECT *
FROM produto
WHERE id_produto = 1000;

Cuidado extremo

DELETE FROM produto; sem WHERE apaga todos os produtos.

Se tentarmos apagar um produto que ainda aparece em produto_fornecedor, ou uma categoria que possui produtos vinculados, a FK pode impedir a exclusão. Isso não é erro do banco: é proteção da integridade referencial.

BLOCO 14 — FOREIGN KEY: integridade referencial real

A FOREIGN KEY é a implementação física do relacionamento entre tabelas. Ela impede referências para registros que não existem. Usaremos um produto temporário e o removeremos ao final.

-- deve funcionar: categoria 3 existe
INSERT INTO produto
(id_produto, descricao, preco, qtde, id_categoria, estoque_minimo)
VALUES
(900001, 'PRODUTO TESTE', 5, 10, 3, 5);

-- deve falhar: categoria 999 não existe
INSERT INTO produto
(id_produto, descricao, preco, qtde, id_categoria, estoque_minimo)
VALUES
(900002, 'PRODUTO INVALIDO', 5, 10, 999, 5);

-- deve funcionar: produto e fornecedor existem
INSERT INTO produto_fornecedor (id_produto, id_fornecedor)
VALUES (900001, 4);

-- deve falhar: fornecedor 999 não existe
INSERT INTO produto_fornecedor (id_produto, id_fornecedor)
VALUES (900001, 999);

-- limpeza dos testes válidos
DELETE FROM produto_fornecedor
WHERE id_produto = 900001;

DELETE FROM produto
WHERE id_produto = 900001;

Os comandos inválidos são rejeitados pelas restrições. Os dois DELETEs finais removem somente os registros de laboratório que foram aceitos, preservando a base comercio.

O erro é parte do laboratório

Quando a FK ou o CHECK bloqueia um dado inválido, o banco está fazendo exatamente o que foi modelado: protegendo integridade.

BLOCO 15 — JOIN: unindo tabelas relacionadas

JOIN é usado para unir dados de tabelas relacionadas. Aqui o banco relacional mostra seu verdadeiro valor.

SELECT
    produto.descricao,
    categoria.nome AS categoria
FROM produto
INNER JOIN categoria
    ON produto.id_categoria = categoria.id_categoria;

Agora o aluno não vê apenas o número da categoria; vê o nome real da categoria.

SELECT
    produto.descricao,
    categoria.nome AS categoria,
    fornecedor.nome AS fornecedor
FROM produto
INNER JOIN categoria
    ON produto.id_categoria = categoria.id_categoria
INNER JOIN produto_fornecedor
    ON produto.id_produto = produto_fornecedor.id_produto
INNER JOIN fornecedor
    ON produto_fornecedor.id_fornecedor = fornecedor.id_fornecedor
ORDER BY produto.descricao;

Perceba o caminho: produto chega ao fornecedor por meio de produto_fornecedor. Essa consulta comprova que a implementação física respeita o N:N modelado anteriormente.

Primeiro contato, não capítulo completo

Aqui usamos INNER JOIN apenas para que o aluno consiga consultar o banco que acabou de construir. LEFT JOIN, RIGHT JOIN, múltiplas estratégias de junção e interpretação de resultados serão aprofundados no Capítulo 5.

BLOCO 16 — Funções de agregação

Funções de agregação resumem dados. As principais são COUNT, SUM, AVG, MIN e MAX.

SELECT COUNT(*) FROM produto;

SELECT SUM(qtde) FROM produto;

SELECT AVG(preco) FROM produto;

SELECT MIN(preco) FROM produto;

SELECT MAX(preco) FROM produto;

Com essas consultas, o banco começa a produzir indicadores: quantidade de produtos, estoque total, média de preço e maior ou menor valor.

BLOCO 17 — GROUP BY: agrupando dados

GROUP BY agrupa registros para produzir relatórios por categoria, fornecedor ou outro campo.

SELECT
    categoria.nome AS categoria,
    COUNT(*) AS total_produtos
FROM produto
INNER JOIN categoria
    ON produto.id_categoria = categoria.id_categoria
GROUP BY categoria.nome
ORDER BY total_produtos DESC;
SELECT
    categoria.nome AS categoria,
    SUM(produto.qtde) AS total_estoque,
    AVG(produto.preco) AS preco_medio
FROM produto
INNER JOIN categoria
    ON produto.id_categoria = categoria.id_categoria
GROUP BY categoria.nome
ORDER BY total_estoque DESC;
SELECT
    fornecedor.nome AS fornecedor,
    COUNT(*) AS total_produtos
FROM produto_fornecedor
INNER JOIN fornecedor
    ON produto_fornecedor.id_fornecedor = fornecedor.id_fornecedor
GROUP BY fornecedor.id_fornecedor, fornecedor.nome
ORDER BY total_produtos DESC;

HAVING: filtrando grupos

WHERE filtra linhas antes do agrupamento. HAVING filtra o resultado dos grupos depois do GROUP BY.

SELECT
    categoria.nome AS categoria,
    COUNT(*) AS total_produtos
FROM produto
INNER JOIN categoria
    ON produto.id_categoria = categoria.id_categoria
GROUP BY categoria.id_categoria, categoria.nome
HAVING COUNT(*) >= 3
ORDER BY total_produtos DESC;

BLOCO 18 — Boas Práticas e Visão Profissional

SQL profissional não é apenas escrever comandos que funcionam. É escrever comandos organizados, seguros e coerentes com a modelagem.

  • use nomes claros;
  • organize consultas longas em várias linhas;
  • teste SELECT antes de UPDATE ou DELETE;
  • use PK, FK e demais restrições para proteger integridade;
  • prefira listar explicitamente as colunas em INSERTs importantes;
  • mantenha coerência entre modelagem, tabelas e comandos;
  • não decore SQL sem entender a estrutura.

Fluxo seguro

Consultar → alterar/remover → consultar novamente. Esse hábito evita muitos erros em bancos reais.

BLOCO 19 — Fechamento do Capítulo SQL com MySQL

Neste capítulo, o banco deixou de ser apenas desenho e estrutura lógica. Ele virou implementação física real no MySQL.

Aprendemos modelagem física, SQL, MySQL, SGBD, CREATE DATABASE, CREATE TABLE, ALTER TABLE, AUTO_INCREMENT, restrições, INSERT, SELECT, DISTINCT, LIMIT, WHERE, AND, OR, NOT, IN, BETWEEN, IS NULL, ORDER BY, LIKE, UPDATE, DELETE, FOREIGN KEY, JOIN, funções de agregação, GROUP BY, HAVING e boas práticas.

Mais importante: entendemos como transformar uma modelagem relacional completa em um banco físico real utilizando SQL no MySQL.

Capítulo 5

Relacionamentos e JOIN

Separar para organizar. Juntar para consultar. Neste capítulo, os relacionamentos modelados nos capítulos anteriores passam a ser usados de forma consciente em consultas com INNER JOIN, LEFT JOIN, RIGHT JOIN e múltiplas junções.

BLOCO 1 — Por que JOIN existe?

Nos capítulos anteriores, aprendemos que um banco relacional não deve guardar tudo em uma única tabela. Categorias ficam em categoria, fornecedores em fornecedor, produtos em produto e a relação N:N entre produto e fornecedor fica em produto_fornecedor.

Essa separação reduz redundância e melhora a integridade. Mas cria uma nova necessidade: quando queremos enxergar uma informação completa, precisamos consultar várias tabelas relacionadas ao mesmo tempo.

Guardar corretamente
↓
separar os dados em tabelas relacionadas
↓
consultar quando necessário
↓
JOIN reúne as informações no resultado

Ideia principal

JOIN não mistura nem funde as tabelas fisicamente. Ele apenas monta um resultado de consulta usando as relações existentes entre elas.

BLOCO 2 — Relacionamento e JOIN não são a mesma coisa

Um relacionamento pertence à estrutura do banco. Ele nasce das regras de negócio e normalmente é representado por PKs e FKs. Um JOIN pertence à consulta: usamos SQL para percorrer esse relacionamento e mostrar informações que estão separadas.

RelacionamentoJOIN
faz parte da modelagem do bancofaz parte de uma consulta SQL
explica como as tabelas se relacionamusa essa relação para combinar resultados
pode ser protegido por FOREIGN KEYnão altera a estrutura das tabelas
existe mesmo sem uma consulta sendo executadaexiste apenas enquanto a consulta é executada

No nosso banco comercial, o caminho principal é:

CATEGORIA 1 ─── N PRODUTO
                    ↓
                    N
           PRODUTO_FORNECEDOR
                    N
                    ↓
               FORNECEDOR
                    ↓
              CIDADE (opcional)

Antes de escrever qualquer JOIN, pergunte: qual informação eu quero e por quais relacionamentos preciso passar para chegar até ela?

BLOCO 3 — Anatomia de um JOIN

Vamos começar sem abreviações. Queremos mostrar o produto e o nome de sua categoria.

SELECT produto.descricao, categoria.nome
FROM produto
INNER JOIN categoria
    ON produto.id_categoria = categoria.id_categoria;
TrechoFunção
FROM produtodefine a tabela inicial da consulta
INNER JOIN categoriaindica a tabela que será relacionada
ONdefine a condição usada para encontrar a correspondência
produto.id_categoria = categoria.id_categorialiga a FK do produto à PK da categoria

Não escolha colunas pelo nome parecido

A junção deve seguir o relacionamento real do modelo. Neste caso, produto.id_categoria é FK e aponta para categoria.id_categoria.

BLOCO 4 — INNER JOIN: somente quem possui correspondência

O INNER JOIN retorna apenas as linhas que encontram correspondência dos dois lados da junção.

PRODUTO           CATEGORIA
   22  ───────────  3 BEBIDA     ✓ aparece
   27  ───────────  4 LIMPEZA    ✓ aparece
   ?   ── sem correspondência    ✗ não aparece
SELECT
    produto.id_produto,
    produto.descricao,
    categoria.nome AS categoria
FROM produto
INNER JOIN categoria
    ON produto.id_categoria = categoria.id_categoria
ORDER BY produto.descricao;

Como id_categoria em produto é obrigatório e protegido por FOREIGN KEY, todos os produtos válidos devem encontrar uma categoria. Isso mostra como integridade e JOIN trabalham juntos.

BLOCO 5 — INNER JOIN em um relacionamento N:N

Produto e fornecedor possuem relacionamento N:N. Por isso, não existe uma FK de fornecedor dentro de produto. Para chegar de produto até fornecedor precisamos atravessar a tabela associativa.

PRODUTO
   ↓ id_produto
PRODUTO_FORNECEDOR
   ↓ id_fornecedor
FORNECEDOR
SELECT
    produto.descricao AS produto,
    fornecedor.nome AS fornecedor
FROM produto
INNER JOIN produto_fornecedor
    ON produto.id_produto = produto_fornecedor.id_produto
INNER JOIN fornecedor
    ON produto_fornecedor.id_fornecedor = fornecedor.id_fornecedor
ORDER BY produto.descricao;

Leitura da consulta

Começamos em produto → encontramos suas linhas em produto_fornecedor → dessas linhas descobrimos os fornecedores correspondentes.

Erro conceitual

Não tente escrever produto.id_fornecedor = fornecedor.id_fornecedor. Essa coluna não existe em produto porque o modelo correto é N:N.

BLOCO 6 — Aliases: abreviando sem perder o sentido

Depois que o caminho ficou claro, podemos usar aliases para reduzir a repetição dos nomes das tabelas. Alias é apenas um apelido válido durante aquela consulta.

SELECT
    p.descricao AS produto,
    f.nome AS fornecedor
FROM produto AS p
INNER JOIN produto_fornecedor AS pf
    ON p.id_produto = pf.id_produto
INNER JOIN fornecedor AS f
    ON pf.id_fornecedor = f.id_fornecedor
ORDER BY p.descricao;
AliasTabela
pproduto
pfproduto_fornecedor
ffornecedor

Primeiro entender, depois abreviar

Aliases ajudam muito em consultas longas, mas não devem esconder de onde os dados estão vindo. Se a consulta ficar confusa, volte temporariamente aos nomes completos.

BLOCO 7 — LEFT JOIN: preserve tudo que está à esquerda

O LEFT JOIN preserva todas as linhas da tabela que está à esquerda da junção, mesmo quando não existe correspondência do lado direito.

Na base atual existem fornecedores cadastrados que ainda não possuem produto associado. Isso nos permite observar o comportamento do LEFT JOIN sem inventar registros.

SELECT
    f.id_fornecedor,
    f.nome AS fornecedor,
    pf.id_produto
FROM fornecedor AS f
LEFT JOIN produto_fornecedor AS pf
    ON f.id_fornecedor = pf.id_fornecedor
ORDER BY f.nome;

Quando um fornecedor não possui produto relacionado, ele continua aparecendo. As colunas vindas de produto_fornecedor aparecem como NULL.

FORNECEDOR                    PRODUTO_FORNECEDOR
COCA-COLA FEMSA      ──────── produto 22
AMBEV DISTRIBUIDORA  ──────── produto 23
ARMAZEM DO COMERCIO  ──────── NULL   ← continua aparecendo

BLOCO 8 — Encontrando quem NÃO possui correspondência

LEFT JOIN fica especialmente útil quando queremos descobrir registros sem relação correspondente.

SELECT
    f.id_fornecedor,
    f.nome AS fornecedor
FROM fornecedor AS f
LEFT JOIN produto_fornecedor AS pf
    ON f.id_fornecedor = pf.id_fornecedor
WHERE pf.id_produto IS NULL
ORDER BY f.nome;

A lógica é:

preserve todos os fornecedores
↓
tente encontrar produto_fornecedor
↓
onde não encontrou, pf.id_produto ficou NULL
↓
WHERE ... IS NULL mostra somente esses casos

Pergunta de negócio

“Quais fornecedores estão cadastrados, mas ainda não fornecem nenhum produto?” Esse tipo de pergunta é exatamente o que um LEFT JOIN pode responder.

BLOCO 9 — RIGHT JOIN: preserve tudo que está à direita

O RIGHT JOIN faz a ideia inversa: preserva todas as linhas da tabela que aparece à direita da junção.

SELECT
    f.id_fornecedor,
    f.nome AS fornecedor,
    pf.id_produto
FROM produto_fornecedor AS pf
RIGHT JOIN fornecedor AS f
    ON pf.id_fornecedor = f.id_fornecedor
ORDER BY f.nome;

Essa consulta preserva todos os fornecedores e, portanto, produz a mesma ideia da consulta anterior escrita com LEFT JOIN e as tabelas em ordem invertida.

LEFT JOIN

Preserva a tabela da esquerda.

RIGHT JOIN

Preserva a tabela da direita.

Qual usar no dia a dia?

É importante saber ler RIGHT JOIN, mas normalmente podemos reorganizar a consulta e usar LEFT JOIN. O próprio manual do MySQL recomenda LEFT JOIN quando queremos manter maior portabilidade entre bancos.

BLOCO 10 — ON e WHERE têm papéis diferentes

Uma regra prática ajuda muito:

  • ON explica como as tabelas se relacionam;
  • WHERE filtra quais linhas do resultado queremos manter.
SELECT
    p.descricao,
    c.nome AS categoria,
    p.preco
FROM produto AS p
INNER JOIN categoria AS c
    ON p.id_categoria = c.id_categoria
WHERE p.preco >= 20
ORDER BY p.preco DESC;

Cuidado especial com LEFT JOIN

Se você filtrar no WHERE uma coluna da tabela que pode ficar NULL, poderá eliminar justamente as linhas sem correspondência que queria preservar. Primeiro pense no objetivo da consulta; depois escolha onde cada condição deve ficar.

BLOCO 11 — Múltiplas junções: percorrendo o banco inteiro

Uma consulta pode atravessar vários relacionamentos. Vamos mostrar produto, categoria, fornecedor e, quando existir, a cidade do fornecedor.

SELECT
    p.id_produto,
    p.descricao AS produto,
    c.nome AS categoria,
    f.nome AS fornecedor,
    ci.nome_cidade,
    ci.estado
FROM produto AS p
INNER JOIN categoria AS c
    ON p.id_categoria = c.id_categoria
INNER JOIN produto_fornecedor AS pf
    ON p.id_produto = pf.id_produto
INNER JOIN fornecedor AS f
    ON pf.id_fornecedor = f.id_fornecedor
LEFT JOIN cidade AS ci
    ON f.id_cidade = ci.id_cidade
ORDER BY p.descricao, f.nome;

Observe que usamos INNER JOIN enquanto a correspondência é necessária para montar o caminho produto → categoria → fornecedor. Para cidade usamos LEFT JOIN porque id_cidade é opcional no modelo.

Resultado esperado na base atual

Como as cidades reais dos fornecedores ainda não foram informadas, nome_cidade e estado aparecerão como NULL. Isso não é erro: é a consulta respeitando uma relação opcional sem inventar dados.

BLOCO 12 — JOIN com GROUP BY: incluindo também quem tem zero

Já aprendemos funções de agregação e GROUP BY. Agora podemos combiná-las com LEFT JOIN para criar relatórios mais completos.

SELECT
    f.id_fornecedor,
    f.nome AS fornecedor,
    COUNT(pf.id_produto) AS total_produtos
FROM fornecedor AS f
LEFT JOIN produto_fornecedor AS pf
    ON f.id_fornecedor = pf.id_fornecedor
GROUP BY f.id_fornecedor, f.nome
ORDER BY total_produtos DESC, f.nome;

Usamos COUNT(pf.id_produto), e não COUNT(*), porque queremos contar somente produtos realmente encontrados. Quando não existe correspondência, pf.id_produto é NULL e não entra nessa contagem.

SELECT
    f.id_fornecedor,
    f.nome AS fornecedor,
    COUNT(pf.id_produto) AS total_produtos
FROM fornecedor AS f
LEFT JOIN produto_fornecedor AS pf
    ON f.id_fornecedor = pf.id_fornecedor
GROUP BY f.id_fornecedor, f.nome
HAVING COUNT(pf.id_produto) = 0
ORDER BY f.nome;

BLOCO 13 — Erros comuns em JOIN

ErroProblemaComo pensar
juntar colunas sem seguir a relação realresultados incorretossiga PK, FK e a regra de negócio
pular produto_fornecedorquebra o N:Npercorra a tabela associativa
esquecer a condição de junçãopode gerar combinações indevidas entre linhaspergunte “qual coluna liga estas tabelas?”
usar SELECT * em consulta granderesultado poluído e colunas ambíguasliste apenas as colunas necessárias
filtrar NULL incorretamente após LEFT JOINpode perder linhas que queria preservarentenda primeiro o papel de ON e WHERE
abusar de aliases curtosconsulta fica difícil de leruse abreviações consistentes

Produto cartesiano acidental

Quando tabelas são combinadas sem uma condição correta, uma linha pode ser combinada com muitas linhas da outra tabela. O resultado cresce rapidamente e geralmente não representa a regra de negócio desejada.

BLOCO 14 — Como escolher o JOIN?

PerguntaEscolha inicial
Quero apenas registros que possuem correspondência dos dois lados.INNER JOIN
Quero todos da tabela principal, mesmo sem correspondência.LEFT JOIN, colocando a tabela que quero preservar à esquerda
Quero preservar a tabela que está à direita.RIGHT JOIN ou reorganizar a consulta como LEFT JOIN
Quero descobrir quem não possui correspondência.LEFT JOIN + IS NULL
Preciso atravessar várias relações.múltiplos JOINs, um relacionamento por vez
1. O que eu quero descobrir?
2. Qual tabela contém o ponto de partida?
3. Qual relacionamento leva ao próximo dado?
4. Preciso somente de correspondências ou preservar ausentes?
5. Escrevo o JOIN.
6. Confiro se o resultado faz sentido.

BLOCO 15 — Laboratório final: relatório comercial completo

Agora reunimos o que aprendemos em uma consulta que percorre o modelo relacional completo.

SELECT
    p.id_produto,
    p.descricao AS produto,
    p.preco,
    p.qtde,
    c.nome AS categoria,
    f.nome AS fornecedor,
    pf.preco_custo,
    pf.prazo_entrega,
    ci.nome_cidade,
    ci.estado
FROM produto AS p
INNER JOIN categoria AS c
    ON p.id_categoria = c.id_categoria
INNER JOIN produto_fornecedor AS pf
    ON p.id_produto = pf.id_produto
INNER JOIN fornecedor AS f
    ON pf.id_fornecedor = f.id_fornecedor
LEFT JOIN cidade AS ci
    ON f.id_cidade = ci.id_cidade
ORDER BY c.nome, p.descricao, f.nome;

Leia essa consulta de cima para baixo e tente responder:

  1. Qual é a tabela de partida?
  2. Por que categoria usa INNER JOIN?
  3. Por que precisamos passar por produto_fornecedor?
  4. Por que cidade usa LEFT JOIN?
  5. Se um produto passasse a ter dois fornecedores, quantas linhas ele poderia gerar nesse relatório?

O que deve ficar na cabeça

O banco continua normalizado e separado. A consulta percorre os relacionamentos e monta a visão necessária sem destruir essa organização.

BLOCO 16 — Fechamento do Capítulo

Neste capítulo, relacionamentos deixaram de ser apenas linhas de um DER e passaram a orientar consultas reais.

Aprendemos a diferença entre relacionamento e JOIN, a condição ON, INNER JOIN, LEFT JOIN, RIGHT JOIN, aliases, relações N:N por tabela associativa, múltiplas junções, ausência de correspondência com NULL e JOIN combinado com GROUP BY.

Próxima ponte

Agora que sabemos estruturar, popular e consultar um banco relacional, podemos aprender a administrar o SGBD: instalação, ferramentas, usuários, permissões, backup e restauração.

Capítulo 6

Administração e SGBD

Fazer consultas é apenas uma parte do trabalho. Agora vamos entender quem mantém o MySQL funcionando: servidor, serviço, conexões, usuários, privilégios, ferramentas, backup e restauração.

BLOCO 1 — Usar um banco e administrar um SGBD são coisas diferentes

Até aqui trabalhamos principalmente como usuários do banco: criamos tabelas, inserimos dados e escrevemos consultas. A administração começa quando passamos a cuidar do ambiente que torna tudo isso possível.

Uso do bancoAdministração do SGBD
SELECT, INSERT, UPDATE, DELETEinstalação e operação do servidor
criação das tabelas do sistemacontas, autenticação e privilégios
consultas e relatóriosbackup, restauração e disponibilidade
trabalho dentro de um bancocuidado com o ambiente inteiro

Ideia principal

Banco de dados é onde os dados e objetos ficam organizados. SGBD é o software que controla armazenamento, acesso, segurança, concorrência e recuperação desses dados. Administrar é cuidar desse SGBD.

BLOCO 2 — Quem é quem no MySQL?

Quando dizemos simplesmente “MySQL”, podemos estar falando de programas diferentes. Para administrar corretamente, precisamos separá-los.

Aplicação / Workbench / cliente mysql
              ↓ conexão
        MYSQL SERVER
           (mysqld)
              ↓
   bancos, tabelas e dados
ComponenteFunção
MySQL Serveré o servidor do SGBD; recebe conexões, executa SQL e controla os dados
mysqldé o processo principal do MySQL Server
mysqlé um cliente de linha de comando usado para conversar com o servidor
MySQL Workbenché uma ferramenta gráfica cliente para SQL, modelagem e tarefas administrativas
Aplicaçãoconecta ao servidor usando um driver/connector e uma conta autorizada

Workbench não é o banco

Fechar o Workbench não apaga nem necessariamente desliga o MySQL Server. Da mesma forma, instalar apenas uma ferramenta cliente não significa que exista um servidor MySQL funcionando naquela máquina.

BLOCO 3 — Instalação atual do MySQL no Windows

Neste curso adotamos o MySQL 8.4 LTS como referência estável. No Windows, a documentação oficial recomenda a instalação pelo pacote MSI e a configuração pelo MySQL Configurator.

  1. Baixe o MySQL Community Server para Windows no site oficial.
  2. Execute o instalador MSI.
  3. Ao final da instalação, execute o MySQL Configurator.
  4. Configure o servidor como serviço do Windows.
  5. Defina uma senha forte para a conta administrativa root.
  6. Conclua a configuração e confirme que o serviço iniciou.

Atenção a tutoriais antigos

Em versões antigas do MySQL 8.0 era muito comum encontrar o programa MySQL Installer. Para MySQL 8.1 ou superior, incluindo 8.4, a configuração atual é feita pelo MySQL Configurator. Não estranhe se vídeos antigos mostrarem telas diferentes.

O diretório padrão de uma instalação MSI do MySQL 8.4 costuma ficar em C:\Program Files\MySQL\MySQL Server 8.4. Não é necessário decorar esse caminho; precisamos apenas saber que a pasta bin contém programas como mysql, mysqld e mysqldump.

BLOCO 4 — Serviço do Windows: o servidor precisa estar funcionando

Em uma instalação normal no Windows, o MySQL Server é configurado como um serviço. Assim, ele pode iniciar automaticamente com o sistema operacional.

Windows inicia
     ↓
serviço do MySQL inicia
     ↓
mysqld fica aguardando conexões
     ↓
clientes podem se conectar

Uma forma simples de verificar é abrir Serviços do Windows (services.msc) e localizar o serviço configurado para o MySQL.

O nome pode variar

Não memorize um nome de serviço como se fosse universal. Ele depende da versão e de como a instalação foi configurada. O importante é reconhecer o serviço MySQL e verificar seu estado.

“mysql não conecta”

Antes de culpar a senha ou o SQL, pergunte: o servidor está iniciado? Cliente funcionando e servidor parado são situações completamente diferentes.

BLOCO 5 — CMD ou mysql>? Saiba onde executar cada comando

Este é um dos erros mais comuns de quem começa. Existem comandos do sistema operacional e comandos enviados ao servidor MySQL.

Onde apareceO que executar aliExemplo
CMDprogramas do Windows/MySQLmysql -u root -p
CMDbackup e restauração com redirecionamentomysqldump ... > arquivo.sql
mysql>SQL e comandos do cliente conectadoSHOW DATABASES;
mysql>administração por SQLCREATE USER ...;

Não misture os ambientes

mysqldump não é um comando SQL. Ele deve ser executado no CMD, fora do prompt mysql>.

BLOCO 6 — Primeira verificação administrativa

Com o servidor iniciado, abra o CMD e conecte:

mysql -u root -p

Depois de informar a senha e aparecer o prompt mysql>, execute:

SELECT VERSION();
SELECT CURRENT_USER();
SHOW DATABASES;
ComandoO que confirma
VERSION()qual versão do servidor respondeu
CURRENT_USER()qual conta autenticada determina os privilégios da sessão
SHOW DATABASESquais bancos aquela conta pode enxergar

Você também pode usar:

SHOW PROCESSLIST;

Esse comando permite observar conexões/sessões que o usuário atual tem permissão para enxergar. Não precisamos administrar concorrência ainda; por enquanto basta reconhecer que o servidor pode atender vários clientes.

BLOCO 7 — root é administrador, não usuário comum da aplicação

A conta root possui grande poder administrativo. Ela é útil para tarefas que realmente exigem administração, mas não deve ser a conta normal usada por um aplicativo, site ou aluno para todas as atividades.

ROOT
  ↓ administra
cria contas + concede somente o necessário
  ↓
USUÁRIO DA APLICAÇÃO / OPERADOR / CONSULTA

Princípio do menor privilégio

Cada conta deve receber somente os privilégios necessários para realizar sua função. Menos privilégio significa menor impacto caso a senha vaze, a aplicação tenha uma falha ou alguém execute um comando errado.

Evite a prática “GRANT ALL para tudo”

Dar acesso total global apenas para fazer uma aplicação funcionar é simples, mas inseguro e didaticamente errado. Primeiro descobrimos o que a conta precisa; depois concedemos exatamente isso.

BLOCO 8 — Conta MySQL = usuário + origem

No MySQL, uma conta é identificada por algo como 'usuario'@'host'. Isso significa que nome e origem da conexão fazem parte da identidade da conta.

ContaIdeia
'operador'@'localhost'operador conectando na própria máquina do servidor
'operador'@'algum-host-autorizado'mesmo nome, mas outra origem autorizada

Para nosso laboratório local, criaremos uma conta restrita a localhost:

CREATE USER 'operador_comercio'@'localhost'
IDENTIFIED BY 'Exemplo-Apenas-Troque-Agora#2026';

Senha do exemplo

A senha acima existe apenas para mostrar a sintaxe. Não reutilize senhas publicadas em material didático. Na prática, crie uma senha própria, forte e exclusiva.

Uma conta recém-criada não ganha automaticamente acesso ao banco comercio. Primeiro criamos a identidade; depois concedemos privilégios.

BLOCO 9 — GRANT: concedendo apenas o necessário

Suponha que operador_comercio precise consultar e manter os dados comerciais, mas não precise criar bancos, excluir tabelas ou administrar usuários.

GRANT SELECT, INSERT, UPDATE, DELETE
ON comercio.*
TO 'operador_comercio'@'localhost';

Leia a instrução:

SELECT, INSERT, UPDATE, DELETE  → o que pode fazer
comercio.*                      → em todas as tabelas do banco comercio
'operador_comercio'@'localhost'→ quem recebe

Agora crie também uma conta somente para consultas:

CREATE USER 'consulta_comercio'@'localhost'
IDENTIFIED BY 'Exemplo-Leitura-Troque-Agora#2026';

GRANT SELECT
ON comercio.*
TO 'consulta_comercio'@'localhost';

Isso materializa uma regra simples: quem só precisa ler não deve receber UPDATE ou DELETE.

BLOCO 10 — SHOW GRANTS e REVOKE: conferir antes de confiar

Depois de conceder privilégios, confirme o resultado:

SHOW GRANTS FOR 'operador_comercio'@'localhost';
SHOW GRANTS FOR 'consulta_comercio'@'localhost';

Se um privilégio deixou de ser necessário, retire-o com REVOKE:

REVOKE DELETE
ON comercio.*
FROM 'operador_comercio'@'localhost';

Administrar também é revisar

Segurança não termina no CREATE USER. Contas mudam de função, pessoas saem de projetos e aplicações evoluem. Privilégios antigos que não são mais necessários devem ser removidos.

Precisa executar FLUSH PRIVILEGES?

Não depois de CREATE USER, GRANT ou REVOKE. Esses comandos de gerenciamento de contas entram em vigor pelo próprio mecanismo do MySQL. FLUSH PRIVILEGES é necessário em situações específicas, como alterações diretas nas tabelas internas de privilégios — prática que não devemos usar para a administração normal.

BLOCO 11 — Roles: quando várias contas possuem a mesma função

Se muitas contas precisarem do mesmo conjunto de privilégios, repetir GRANT usuário por usuário aumenta o trabalho. Uma role é um conjunto nomeado de privilégios que pode ser concedido a contas.

CREATE ROLE 'leitura_comercio';

GRANT SELECT
ON comercio.*
TO 'leitura_comercio';

CREATE USER 'analista_comercio'@'localhost'
IDENTIFIED BY 'Exemplo-Role-Troque-Agora#2026';

GRANT 'leitura_comercio'
TO 'analista_comercio'@'localhost';

SET DEFAULT ROLE 'leitura_comercio'
TO 'analista_comercio'@'localhost';

Primeiro contato

Você não precisa usar roles em todo exercício pequeno. O conceito fica importante quando vários usuários compartilham responsabilidades. Em vez de administrar permissões uma a uma, administramos a função.

BLOCO 12 — Ciclo de vida das contas

Além de criar e conceder acesso, o administrador precisa saber alterar, bloquear e remover contas.

ALTER USER 'operador_comercio'@'localhost'
IDENTIFIED BY 'NOVA_SENHA_FORTE_E_EXCLUSIVA';

ALTER USER 'operador_comercio'@'localhost' ACCOUNT LOCK;

ALTER USER 'operador_comercio'@'localhost' ACCOUNT UNLOCK;

Quando uma conta realmente deixou de existir:

DROP USER 'operador_comercio'@'localhost';

Bloquear ou excluir?

Se existe dúvida ou necessidade temporária de impedir acesso, bloquear preserva a conta. DROP USER remove a conta. Em ambiente real, essa decisão deve seguir a política da organização.

BLOCO 13 — Administração segura: quatro regras que evitam muitos problemas

  1. Não use root na aplicação. Crie uma conta própria para cada finalidade.
  2. Não conceda mais privilégios do que o necessário.
  3. Não exponha o servidor diretamente à Internet só para “fazer conectar”. Acesso remoto envolve rede, firewall, origem da conta e proteção da conexão.
  4. Não altere arquivos internos do diretório de dados manualmente. Use ferramentas e procedimentos próprios do SGBD.

Porta 3306 aberta não é solução mágica

A porta padrão do protocolo MySQL é frequentemente 3306, mas simplesmente liberá-la publicamente pode ampliar a superfície de ataque. Neste curso, nossos laboratórios administrativos permanecem locais; acesso remoto deve ser configurado conscientemente em ambiente apropriado.

BLOCO 14 — Backup: uma cópia capaz de permitir recuperação

Backup não é apenas “salvar um arquivo”. O objetivo é conseguir recuperar dados e objetos depois de erro, falha, corrupção ou perda.

Banco funcionando
      ↓
criar backup
      ↓
guardar em local adequado
      ↓
testar restauração
      ↓
ter confiança de recuperação
ConceitoSignificado
backup lógicorepresenta estruturas e dados em formato que pode ser recriado, como comandos SQL
mysqldumputilitário tradicional do MySQL para produzir backup lógico
restauraçãoprocesso de usar o backup para reconstruir os objetos/dados
teste de restauraçãoprova prática de que o backup realmente pode ser utilizado

Copiar só a pasta do projeto não protege o banco

HTML, Java, PHP ou qualquer outro código da aplicação não substitui os dados armazenados no servidor. Código e banco precisam de estratégias de proteção próprias.

BLOCO 15 — Laboratório: backup lógico com mysqldump

Saia do prompt mysql> ou abra outro CMD. Para criar uma cópia lógica do banco comercio:

mysqldump -u root -p --single-transaction comercio > comercio_backup.sql

Depois de pressionar Enter, o programa pedirá a senha. O arquivo comercio_backup.sql será criado na pasta atual do CMD.

TrechoFunção
mysqldumpexecuta o utilitário de backup
-u root -pconecta com uma conta e solicita sua senha
--single-transactioné apropriado para obter uma visão consistente de tabelas transacionais InnoDB sem bloquear as tabelas durante todo o dump
comerciobanco que será copiado
> comercio_backup.sqlredireciona a saída para um arquivo

O que esse arquivo representa?

Esse dump contém a estrutura e os dados do banco selecionado. Ele não é uma imagem completa da máquina nem uma estratégia completa de recuperação do servidor. Configurações, certificados, contas administrativas e outros componentes exigem planejamento próprio.

BLOCO 16 — Laboratório seguro: restaure sem destruir o banco original

Um backup que nunca foi restaurado ainda não foi realmente testado. Em vez de sobrescrever o banco original, vamos restaurar em outro banco.

1. No prompt mysql>, crie um banco vazio para o teste:

CREATE DATABASE comercio_teste_restore;

2. No CMD, carregue o arquivo nele:

mysql -u root -p comercio_teste_restore < comercio_backup.sql

3. De volta ao mysql>, valide:

USE comercio_teste_restore;
SHOW TABLES;
SELECT COUNT(*) FROM produto;
SELECT COUNT(*) FROM fornecedor;
SELECT COUNT(*) FROM produto_fornecedor;

Compare as quantidades com o banco original. Abra algumas tabelas, execute JOINs e confirme se estrutura e dados foram recuperados.

Backup confiável

Fazer o dump é metade do trabalho. Conseguir restaurá-lo e validar o resultado é a outra metade.

Depois do laboratório e somente se tiver certeza de que não precisa mais do banco de teste, ele pode ser removido:

DROP DATABASE comercio_teste_restore;

Confira o nome antes de DROP DATABASE

Esse comando apaga o banco indicado. No laboratório, remova apenas comercio_teste_restore. Nunca transforme comandos destrutivos em hábito automático.

BLOCO 17 — Outra forma de dump: levando o próprio nome do banco

Quando usamos a opção --databases, o arquivo de dump inclui comandos para criar e selecionar o banco durante a restauração.

mysqldump -u root -p --single-transaction --databases comercio > comercio_com_database.sql

Nesse caso, a restauração pode ser feita no CMD sem informar um banco de destino:

mysql -u root -p < comercio_com_database.sql

Por que começamos pelo outro método?

Sem --databases, conseguimos restaurar a cópia em comercio_teste_restore e testar sem apontar diretamente para o banco original. Primeiro aprendemos de forma segura; depois conhecemos a alternativa.

BLOCO 18 — Workbench: interface gráfica para tarefas administrativas

O MySQL Workbench permite executar SQL e também oferece telas administrativas. Entre elas estão controle do serviço, status do servidor, usuários e privilégios, exportação e importação de dados.

No WorkbenchIdeia correspondente
Users and PrivilegesCREATE USER, GRANT, REVOKE e administração de contas
Server Statusestado e informações do servidor
Data Exportexportação SQL para backup/transferência
Data Importcarregamento de dump SQL

Interface não substitui conceito

Workbench facilita o trabalho, mas você deve saber o que está fazendo. Se entende usuário, privilégio, dump e restauração no conceito e na linha de comando, consegue interpretar melhor qualquer interface gráfica.

BLOCO 19 — Logs, configuração e diagnóstico: saiba onde olhar

Um administrador não precisa decorar centenas de variáveis. Precisa desenvolver uma sequência de diagnóstico.

Servidor não responde
        ↓
serviço está iniciado?
        ↓
consigo conectar localmente?
        ↓
usuário/senha/origem estão corretos?
        ↓
qual mensagem de erro apareceu?
        ↓
logs e configuração ajudam a explicar

O MySQL mantém arquivos de configuração e logs do servidor. Em Windows, instalações padrão armazenam dados de configuração e informações operacionais em diretórios próprios do MySQL. Não altere arquivos no escuro. Leia a mensagem de erro, faça backup da configuração e consulte a documentação da versão utilizada antes de mudar parâmetros.

Como diagnosticar

Não comece “tentando qualquer coisa”. Identifique a camada: serviço, conexão, autenticação, privilégio, banco, SQL ou dado. Corrigir a camada errada costuma criar um segundo problema sem resolver o primeiro.

BLOCO 20 — Política mínima de backup

Em ambiente real, um backup manual feito uma única vez não basta. Uma política precisa responder:

  1. O quê? Quais bancos e objetos precisam ser protegidos?
  2. Quando? Qual frequência atende a quantidade de dados que a organização aceita perder?
  3. Onde? Onde as cópias ficarão guardadas para não desaparecerem junto com o servidor?
  4. Por quanto tempo? Quais versões históricas serão mantidas?
  5. Quem? Quem é responsável por verificar o processo?
  6. Como testar? Quando e onde a restauração será validada?

“Backup concluído” não significa “recuperação garantida”

Arquivo vazio, incompleto, inacessível ou nunca testado pode dar falsa sensação de segurança. O objetivo final não é produzir arquivos; é recuperar o serviço e os dados quando necessário.

BLOCO 21 — Laboratório integrador de administração

Agora execute o ciclo administrativo completo usando o banco comercio:

  1. confirme que o serviço MySQL está iniciado;
  2. conecte como administrador;
  3. confirme versão e conta atual;
  4. crie uma conta somente de leitura para comercio;
  5. conceda apenas SELECT;
  6. confira com SHOW GRANTS;
  7. entre com essa nova conta e teste um SELECT;
  8. tente um UPDATE e observe que ele deve ser negado;
  9. volte à conta administrativa;
  10. faça um dump do banco;
  11. restaure em comercio_teste_restore;
  12. valide tabelas, quantidades e um JOIN;
  13. remova somente o banco de teste quando finalizar.

O que esse laboratório prova?

Você deixa de ser alguém que apenas “sabe SQL” e passa a entender o ciclo básico de operação: servidor → autenticação → autorização → uso → proteção → recuperação.

BLOCO 22 — Fechamento do Capítulo

Neste capítulo, aprendemos a separar MySQL Server, processo mysqld, cliente mysql e Workbench; instalar e reconhecer o serviço; identificar onde cada comando deve ser executado; administrar contas e privilégios; aplicar menor privilégio; usar roles; criar backup lógico; restaurar com segurança; validar recuperação e organizar um diagnóstico básico.

O próximo passo é entender algo que acontece dentro do trabalho concorrente com os dados: como várias alterações podem formar uma unidade segura e como o banco decide confirmar ou desfazer mudanças.

Próxima ponte

No Capítulo 7 entraremos em Transações e ACID: COMMIT, ROLLBACK, atomicidade, consistência, isolamento, durabilidade e problemas de concorrência.

Capítulo 7

Transações e ACID

Como fazer várias operações funcionarem como uma única unidade segura, controlar COMMIT e ROLLBACK e entender o que acontece quando vários usuários acessam os mesmos dados ao mesmo tempo.

BLOCO 1 — O problema: duas operações que precisam dar certo juntas

Imagine uma transferência bancária de R$ 100 entre duas contas. O sistema precisa retirar R$ 100 da conta A e acrescentar R$ 100 na conta B.

Conta A: - 100
        ↓
Conta B: + 100

Se a primeira operação for gravada e a segunda falhar, o dinheiro simplesmente desaparece. O problema não está em um UPDATE isolado: está no conjunto das operações.

Ideia central

Uma transação agrupa operações relacionadas para que sejam tratadas como uma única unidade de trabalho: ou o conjunto é confirmado, ou o conjunto é desfeito.

BLOCO 2 — O que é uma transação?

Uma transação é uma sequência de operações que pertence ao mesmo processo de negócio. Exemplos:

  • transferir dinheiro entre contas;
  • registrar um pedido e seus itens;
  • baixar estoque depois de uma venda;
  • registrar matrícula e pagamento inicial;
  • reservar uma vaga sem permitir que duas pessoas ocupem o mesmo lugar.
START TRANSACTION
      ↓
operação 1
      ↓
operação 2
      ↓
COMMIT  ou  ROLLBACK

COMMIT confirma as alterações. ROLLBACK desfaz as alterações ainda não confirmadas da transação.

BLOCO 3 — InnoDB: o mecanismo que usaremos

No MySQL, o mecanismo InnoDB oferece transações ACID, bloqueios em nível de linha e controle de concorrência. É o mecanismo padrão nas instalações atuais do MySQL.

SHOW TABLE STATUS FROM comercio;

Na coluna Engine, as tabelas do nosso laboratório devem aparecer como InnoDB.

Por que o mecanismo de armazenamento importa?

Nem todo mecanismo de armazenamento possui exatamente o mesmo comportamento transacional. Neste capítulo, nossas experiências e explicações consideram tabelas InnoDB.

BLOCO 4 — AUTOCOMMIT: existe uma transação mesmo quando você não percebe

Por padrão, uma nova conexão do MySQL inicia com autocommit ligado. Nesse modo, cada comando SQL bem-sucedido é tratado como uma pequena transação e confirmado automaticamente.

SELECT @@autocommit;

Resultado 1 significa autocommit ligado.

Consequência prática

Se você executar um UPDATE comum com autocommit ligado e ele for concluído, um ROLLBACK executado depois não volta no tempo para desfazer aquilo que já foi confirmado.

Quando várias instruções precisam formar uma única unidade, use uma transação explícita.

BLOCO 5 — Sua primeira transação explícita

Vamos experimentar sem deixar alteração permanente. Primeiro consulte um produto existente:

SELECT id_produto, descricao, qtde
FROM produto
WHERE id_produto = 22;

START TRANSACTION;

UPDATE produto
SET qtde = qtde - 1
WHERE id_produto = 22;

SELECT id_produto, descricao, qtde
FROM produto
WHERE id_produto = 22;

ROLLBACK;

SELECT id_produto, descricao, qtde
FROM produto
WHERE id_produto = 22;

Dentro da transação, sua própria sessão enxerga a alteração. Depois do ROLLBACK, a quantidade deve voltar ao valor anterior.

Entender antes de decorar

START TRANSACTION abre a unidade de trabalho; os comandos alteram os dados; ROLLBACK cancela o conjunto ainda não confirmado.

BLOCO 6 — COMMIT: quando a alteração passa a valer

Agora veremos o caminho oposto. Para evitar alterar a base principal do curso, criaremos uma pequena tabela de laboratório. A criação é feita antes da transação.

CREATE TABLE conta_lab (
  id_conta INT PRIMARY KEY,
  titular VARCHAR(60) NOT NULL,
  saldo DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB;

INSERT INTO conta_lab VALUES
(1, 'ANA', 1000.00),
(2, 'BRUNO', 500.00);

Agora faça uma transferência de R$ 100:

START TRANSACTION;

UPDATE conta_lab
SET saldo = saldo - 100
WHERE id_conta = 1;

UPDATE conta_lab
SET saldo = saldo + 100
WHERE id_conta = 2;

SELECT * FROM conta_lab;

COMMIT;

Depois do COMMIT, a transação termina e suas alterações ficam confirmadas.

BLOCO 7 — ROLLBACK: falhou? volte o conjunto

Repita a ideia, mas imagine que algo deu errado antes de concluir:

START TRANSACTION;

UPDATE conta_lab
SET saldo = saldo - 50
WHERE id_conta = 1;

-- imagine que uma validação da aplicação falhou aqui

ROLLBACK;

SELECT * FROM conta_lab;

O saldo volta ao estado existente antes dessa transação.

Erro de raciocínio comum

ROLLBACK não é um “desfazer universal”. Ele desfaz alterações da transação atual que ainda não foram confirmadas.

BLOCO 8 — SAVEPOINT: voltar apenas até um ponto

Às vezes queremos preservar parte do trabalho realizado dentro da transação. Um SAVEPOINT funciona como um marco intermediário.

START TRANSACTION;

UPDATE conta_lab
SET saldo = saldo + 20
WHERE id_conta = 1;

SAVEPOINT depois_primeiro_ajuste;

UPDATE conta_lab
SET saldo = saldo + 30
WHERE id_conta = 2;

ROLLBACK TO SAVEPOINT depois_primeiro_ajuste;

COMMIT;

O segundo ajuste é desfeito, mas o primeiro pode ser confirmado pelo COMMIT final.

BLOCO 9 — ACID: quatro propriedades para confiar na transação

LetraPropriedadePergunta prática
AAtomicidadeO conjunto inteiro confirma ou é desfeito?
CConsistênciaAs regras e restrições continuam válidas antes e depois?
IIsolamentoTransações simultâneas interferem de forma inadequada umas nas outras?
DDurabilidadeDepois do COMMIT, a alteração confirmada deve sobreviver a falhas?

ACID não são quatro comandos SQL. São quatro propriedades usadas para pensar sobre a confiabilidade das transações.

BLOCO 10 — Atomicidade e consistência no exemplo da transferência

Na transferência, atomicidade significa não aceitar “saiu da conta A, mas não entrou na B”. Já a consistência significa que o banco deve sair de um estado válido e chegar a outro estado válido, respeitando regras como chaves, restrições e regras de negócio.

Consistência não é mágica

O SGBD protege as regras que foram realmente declaradas no banco. Regras que existem apenas na cabeça do desenvolvedor ou apenas no papel não são verificadas automaticamente.

BLOCO 11 — Isolamento: agora entram dois usuários

Até aqui executamos tudo em uma única conexão. Sistemas reais possuem vários usuários e processos ao mesmo tempo.

Sessão A ─┐
          ├── Banco de Dados
Sessão B ─┘

O desafio é permitir concorrência sem deixar uma transação enxergar ou sobrescrever dados de forma inadequada.

Experimento recomendado

Abra dois CMDs ou duas abas de consulta do Workbench, conecte ambos ao banco comercio e trate cada janela como uma sessão diferente.

BLOCO 12 — Três fenômenos clássicos de concorrência

FenômenoO que significa em linguagem simples
Dirty readuma transação lê uma alteração de outra que ainda não foi confirmada
Non-repeatable reada mesma linha é lida duas vezes e aparece diferente porque outra transação confirmou uma mudança entre as leituras
Phantom reada mesma consulta por conjunto encontra linhas novas ou ausentes porque outra transação inseriu ou removeu registros

Esses nomes parecem abstratos até pensarmos em duas pessoas comprando o último item, dois caixas alterando o mesmo saldo ou dois atendentes reservando a mesma vaga.

BLOCO 13 — Os quatro níveis de isolamento

O MySQL/InnoDB oferece os quatro níveis tradicionais de isolamento. Eles representam escolhas entre maior liberdade de concorrência e maior proteção entre transações.

NívelIdeia geral para o iniciante
READ UNCOMMITTEDmais permissivo; pode permitir leitura de dados ainda não confirmados
READ COMMITTEDcada leitura considera dados já confirmados naquele momento
REPEATABLE READmantém uma visão consistente para leituras repetidas da transação; é o padrão do InnoDB
SERIALIZABLEmais restritivo; aumenta a sensação de execução em série, com menor concorrência
SELECT @@transaction_isolation;

Em uma instalação padrão do MySQL 8.4, o resultado esperado é REPEATABLE-READ.

Não transforme a tabela em receita

O comportamento real do InnoDB também envolve MVCC, tipos de leitura e bloqueios. Neste momento, o objetivo é entender por que níveis de isolamento existem, não decorar uma matriz de fenômenos.

BLOCO 14 — Alterando o isolamento de uma transação

Podemos definir o nível para a próxima transação:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;

SELECT * FROM conta_lab;

COMMIT;

Não mude níveis apenas para “resolver erro”. Primeiro identifique o problema de concorrência e só depois decida qual comportamento faz sentido.

BLOCO 15 — SELECT ... FOR UPDATE: ler e reservar para alteração

Imagine que uma aplicação consulta o estoque e, alguns milissegundos depois, decide diminuí-lo. Outra transação pode alterar a mesma linha nesse intervalo.

Quando a leitura serve de base para uma alteração que virá em seguida, o InnoDB oferece a leitura bloqueante FOR UPDATE.

START TRANSACTION;

SELECT id_produto, descricao, qtde
FROM produto
WHERE id_produto = 22
FOR UPDATE;

UPDATE produto
SET qtde = qtde - 1
WHERE id_produto = 22
  AND qtde > 0;

COMMIT;

Enquanto a transação mantém o bloqueio apropriado, outra sessão que tente alterar a mesma linha pode precisar aguardar.

BLOCO 16 — Laboratório de duas sessões

Abra duas conexões. Na Sessão A:

START TRANSACTION;

SELECT id_produto, qtde
FROM produto
WHERE id_produto = 22
FOR UPDATE;

-- não dê COMMIT ainda

Na Sessão B, também abra uma transação antes de tentar alterar:

START TRANSACTION;

UPDATE produto
SET qtde = qtde - 1
WHERE id_produto = 22;

-- quando o UPDATE finalmente concluir, execute:
ROLLBACK;

A Sessão B deve ficar aguardando enquanto A mantém o bloqueio. Volte à Sessão A e execute ROLLBACK;. O UPDATE da Sessão B então pode prosseguir; em seguida, execute o ROLLBACK indicado nela para que nenhuma baixa fique gravada.

O conceito ficou visível sem sujar a base

Duas conexões disputando a mesma linha permitem enxergar bloqueio e espera. As duas terminam com ROLLBACK, portanto o produto permanece com a quantidade original.

BLOCO 17 — Deadlock: quando cada transação espera pela outra

Um deadlock ocorre quando transações ficam presas em uma dependência circular de bloqueios.

Transação A bloqueia linha 1
          e espera linha 2
                 ↑
                 │
Transação B bloqueia linha 2
          e espera linha 1

O InnoDB normalmente detecta o deadlock e escolhe uma transação para desfazer, permitindo que a outra prossiga.

Aplicações precisam estar preparadas

Deadlock não significa necessariamente “banco quebrado”. Em sistemas concorrentes ele pode acontecer, e a aplicação deve estar preparada para repetir a transação quando apropriado.

BLOCO 18 — Como reduzir deadlocks e esperas desnecessárias

  • mantenha transações curtas;
  • não espere interação humana com uma transação aberta;
  • acesse registros em uma ordem consistente;
  • use filtros e índices adequados;
  • bloqueie somente o que realmente precisa;
  • trate falhas e possibilidade de repetição na aplicação.

Para investigar o último deadlock detectado pelo InnoDB, um administrador pode consultar:

SHOW ENGINE INNODB STATUS;

BLOCO 19 — Cuidado: nem tudo obedece ao ROLLBACK como um UPDATE

Comandos de definição de estrutura, como vários CREATE, ALTER, DROP e TRUNCATE, podem causar COMMIT implícito no MySQL. Por isso, não use DDL no meio de um laboratório esperando que um ROLLBACK reverta tudo como se fossem comandos DML comuns.

Exemplo perigoso de expectativa

START TRANSACTION; DROP TABLE ...; ROLLBACK; não deve ser tratado como estratégia de segurança para recuperar uma tabela apagada.

Por isso criamos conta_lab antes de iniciar as transações do laboratório.

BLOCO 20 — Laboratório integrador

Faça o ciclo completo:

  1. confirme que conta_lab usa InnoDB;
  2. consulte saldos iniciais;
  3. execute uma transferência com START TRANSACTION;
  4. confira os valores antes de confirmar;
  5. teste uma transferência com ROLLBACK;
  6. teste outra com COMMIT;
  7. use SAVEPOINT em uma operação com três etapas;
  8. abra duas sessões e observe um bloqueio com FOR UPDATE;
  9. consulte o nível de isolamento atual;
  10. explique onde aparecem atomicidade, consistência, isolamento e durabilidade.

Pergunta de revisão

Se você consegue explicar qual problema cada comando resolve, já está entendendo transações. Decorar START TRANSACTION, COMMIT e ROLLBACK sem enxergar o problema de negócio seria apenas decorar sintaxe.

BLOCO 21 — Fechamento do Capítulo

Neste capítulo, aprendemos que transação é uma unidade de trabalho; vimos autocommit, START TRANSACTION, COMMIT, ROLLBACK e SAVEPOINT; relacionamos ACID a situações reais; observamos concorrência em duas sessões; conhecemos níveis de isolamento, FOR UPDATE, bloqueios, deadlocks e o cuidado com comandos que provocam commit implícito.

Agora o SQL básico e o comportamento transacional estão sólidos o suficiente para avançar para consultas e recursos que ampliam o poder da linguagem.

Próxima ponte

No Capítulo 8 entraremos em SQL Avançado: subconsultas, UNION, CTEs, funções de janela, views, índices, EXPLAIN, triggers, procedures e functions.

Capítulo 8

SQL Avançado

Agora vamos ampliar o que já sabemos sem transformar SQL em uma coleção de truques. O objetivo é aprender recursos que ajudam a organizar consultas complexas, criar relatórios melhores, reutilizar lógica e investigar desempenho.

BLOCO 1 — SQL avançado não significa SQL incompreensível

Até aqui já usamos SELECT, filtros, JOIN, GROUP BY, HAVING e transações. SQL avançado começa quando uma pergunta deixa de caber confortavelmente em uma consulta simples.

Pergunta de negócio
        ↓
consulta simples resolve?
        ↓ não
subconsulta / CTE / janela / view / índice / rotina
        ↓
solução mais clara, reutilizável ou eficiente

Ideia principal

O melhor SQL não é o que parece mais sofisticado. É o que resolve o problema com clareza, correção e desempenho adequado.

BLOCO 2 — Subconsulta: um SELECT dentro de outro comando

Uma subconsulta é um SELECT usado dentro de outra instrução. Comece pensando em duas perguntas separadas.

Exemplo: quais produtos custam mais do que o preço médio de todos os produtos?

SELECT id_produto, descricao, preco
FROM produto
WHERE preco > (
    SELECT AVG(preco)
    FROM produto
)
ORDER BY preco DESC;

A consulta interna calcula um único valor: a média. A consulta externa compara cada produto com esse resultado.

Leia de dentro para fora

Primeiro responda o SELECT interno. Depois pergunte como o resultado será usado pela consulta externa.

BLOCO 3 — IN, EXISTS e NOT EXISTS

Subconsultas não servem apenas para retornar um único valor. Elas também podem responder se existe ou não uma correspondência.

IN com subconsulta

No Capítulo 4 usamos IN com uma lista fixa. Agora a própria lista pode vir de outro SELECT:

SELECT id_produto, descricao, id_categoria
FROM produto
WHERE id_categoria IN (
    SELECT id_categoria
    FROM categoria
    WHERE nome LIKE '%DOCE%'
)
ORDER BY descricao;

A consulta interna retorna os IDs das categorias cujo nome contém “DOCE”; a consulta externa procura produtos que pertencem a qualquer uma delas.

Fornecedores que possuem pelo menos um produto

SELECT f.id_fornecedor, f.nome
FROM fornecedor AS f
WHERE EXISTS (
    SELECT 1
    FROM produto_fornecedor AS pf
    WHERE pf.id_fornecedor = f.id_fornecedor
)
ORDER BY f.nome;

Fornecedores sem produtos associados

SELECT f.id_fornecedor, f.nome
FROM fornecedor AS f
WHERE NOT EXISTS (
    SELECT 1
    FROM produto_fornecedor AS pf
    WHERE pf.id_fornecedor = f.id_fornecedor
)
ORDER BY f.nome;

EXISTS pergunta se a subconsulta encontra pelo menos uma linha. NOT EXISTS pergunta o contrário.

BLOCO 4 — JOIN ou subconsulta?

Muitas perguntas podem ser resolvidas de mais de uma forma. Isso não significa que exista sempre uma única sintaxe correta.

Quando pensar primeiro em JOINQuando pensar primeiro em subconsulta
quando precisa exibir colunas de várias tabelasquando precisa comparar com um resultado calculado
quando o caminho entre tabelas é parte central da respostaquando a pergunta é naturalmente “existe?”, “não existe?” ou “maior que a média?”
quando quer combinar linhas relacionadasquando dividir o raciocínio torna a consulta mais clara

Evite regras absolutas

“JOIN é sempre mais rápido” ou “subconsulta é sempre mais simples” são generalizações perigosas. Clareza vem primeiro; depois, quando desempenho importar, confirme o plano com EXPLAIN.

BLOCO 5 — UNION e UNION ALL: empilhando resultados

JOIN coloca colunas relacionadas lado a lado. UNION combina resultados compatíveis colocando linhas de uma consulta abaixo das linhas de outra.

SELECT 'CATEGORIA' AS tipo, nome AS descricao
FROM categoria
UNION ALL
SELECT 'FORNECEDOR' AS tipo, nome AS descricao
FROM fornecedor
ORDER BY tipo, descricao;
OperadorComportamento
UNIONcombina os resultados e elimina linhas duplicadas
UNION ALLcombina os resultados e preserva duplicidades

As consultas precisam retornar quantidade compatível de colunas, em posições correspondentes e com tipos que possam ser combinados.

SQL de conjuntos

MySQL 8.4 também oferece operações como INTERSECT e EXCEPT. Neste capítulo, o foco principal será UNION e UNION ALL, porque eles aparecem com mais frequência em sistemas e relatórios.

BLOCO 6 — CTE: dando nome a uma etapa da consulta

Uma CTE — Common Table Expression é definida com WITH. Ela permite dar um nome temporário a um resultado e usá-lo logo depois.

WITH estoque_baixo AS (
    SELECT id_produto, descricao, qtde, estoque_minimo
    FROM produto
    WHERE qtde <= estoque_minimo
)
SELECT *
FROM estoque_baixo
ORDER BY qtde, descricao;

Por que usar?

CTE ajuda a quebrar uma consulta grande em etapas nomeadas. Ela não cria uma tabela permanente; existe apenas durante aquela instrução.

BLOCO 7 — CTEs podem trabalhar em sequência

Quando o raciocínio possui etapas, podemos declarar mais de uma CTE.

WITH resumo_categoria AS (
    SELECT
        id_categoria,
        COUNT(*) AS total_produtos,
        AVG(preco) AS preco_medio
    FROM produto
    GROUP BY id_categoria
),
resultado AS (
    SELECT
        c.nome AS categoria,
        r.total_produtos,
        r.preco_medio
    FROM resumo_categoria AS r
    INNER JOIN categoria AS c
        ON c.id_categoria = r.id_categoria
)
SELECT *
FROM resultado
ORDER BY preco_medio DESC;

O importante é conseguir explicar o papel de cada etapa. Se uma CTE apenas deixa a consulta maior sem melhorar a leitura, ela não está ajudando.

BLOCO 8 — Funções de janela: calcular sem perder as linhas

GROUP BY agrupa várias linhas e produz uma linha por grupo. Uma função de janela calcula usando linhas relacionadas, mas mantém as linhas individuais no resultado.

GROUP BY

Resume o grupo. Dez produtos de uma categoria podem virar uma única linha.

Função de janela

Mantém os dez produtos e acrescenta cálculos relacionados à categoria em cada linha.

SELECT
    p.descricao,
    c.nome AS categoria,
    p.preco,
    AVG(p.preco) OVER (
        PARTITION BY p.id_categoria
    ) AS media_categoria
FROM produto AS p
INNER JOIN categoria AS c
    ON c.id_categoria = p.id_categoria
ORDER BY c.nome, p.preco DESC;

PARTITION BY divide as linhas em grupos lógicos para o cálculo, sem reduzir o número de linhas exibidas.

BLOCO 9 — ROW_NUMBER e RANK: criando posições

Funções de janela também permitem criar rankings.

SELECT
    c.nome AS categoria,
    p.descricao,
    p.preco,
    ROW_NUMBER() OVER (
        PARTITION BY p.id_categoria
        ORDER BY p.preco DESC
    ) AS posicao
FROM produto AS p
INNER JOIN categoria AS c
    ON c.id_categoria = p.id_categoria
ORDER BY c.nome, posicao;

ROW_NUMBER() gera uma sequência sem empates de numeração. RANK() atribui a mesma posição a valores empatados e pode pular números depois do empate.

WITH ranking AS (
    SELECT
        p.id_categoria,
        p.descricao,
        p.preco,
        ROW_NUMBER() OVER (
            PARTITION BY p.id_categoria
            ORDER BY p.preco DESC
        ) AS posicao
    FROM produto AS p
)
SELECT
    c.nome AS categoria,
    r.descricao,
    r.preco,
    r.posicao
FROM ranking AS r
INNER JOIN categoria AS c
    ON c.id_categoria = r.id_categoria
WHERE r.posicao <= 3
ORDER BY c.nome, r.posicao;

BLOCO 10 — Acumulados com SUM OVER

Outra aplicação útil é calcular valores acumulados sem perder cada linha.

SELECT
    id_produto,
    descricao,
    preco,
    SUM(preco) OVER (
        ORDER BY id_produto
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS preco_acumulado
FROM produto
ORDER BY id_produto;

Janela tem contexto

A cláusula OVER(...) define quais linhas participam do cálculo e em que ordem. Alterar PARTITION BY, ORDER BY ou o frame pode mudar o significado do resultado.

BLOCO 11 — VIEW: salvando uma consulta com nome

Uma view é uma consulta armazenada no banco e acessada como se fosse uma tabela virtual.

CREATE OR REPLACE VIEW vw_produto_categoria AS
SELECT
    p.id_produto,
    p.descricao,
    p.preco,
    p.qtde,
    c.nome AS categoria
FROM produto AS p
INNER JOIN categoria AS c
    ON c.id_categoria = p.id_categoria;

Depois:

SELECT *
FROM vw_produto_categoria
WHERE preco > 20
ORDER BY preco DESC;

View não é uma cópia automática dos dados

Em uma view comum, a definição da consulta é armazenada. Os dados continuam nas tabelas de origem. Também não se cria índice diretamente sobre uma view comum no MySQL.

BLOCO 12 — Índices: atalhos para localizar linhas

Um índice é uma estrutura mantida pelo SGBD para encontrar determinadas linhas com menos trabalho. Sem um índice útil, uma consulta pode precisar examinar muitas linhas.

Sem índice adequado
linha 1 → linha 2 → linha 3 → ...

Com índice adequado
valor procurado → caminho mais direto até as linhas

Para experimentar:

CREATE INDEX idx_produto_descricao
ON produto(descricao);

SHOW INDEX FROM produto;

Esse índice pode ajudar consultas que pesquisam pela descrição, dependendo do filtro, da quantidade de dados e das decisões do otimizador.

Índice não é grátis

Índices ocupam espaço e precisam ser mantidos em INSERT, UPDATE e DELETE. Criar índice em toda coluna pode piorar o sistema em vez de melhorar.

BLOCO 13 — EXPLAIN: pergunte ao MySQL como ele pretende executar

EXPLAIN mostra o plano escolhido pelo otimizador. Ele ajuda a investigar ordem de leitura das tabelas, índices possíveis, índice escolhido e estimativa de linhas examinadas.

EXPLAIN
SELECT id_produto, descricao, preco
FROM produto
WHERE descricao LIKE 'A%';

Algumas colunas importantes da saída tradicional:

ColunaO que observar
tablequal tabela está sendo analisada
possible_keysíndices que poderiam ser usados
keyíndice realmente escolhido
rowsestimativa de linhas examinadas
Extrainformações adicionais do plano

Base pequena, resultado pequeno

Em uma tabela didática com poucas dezenas de linhas, o MySQL pode preferir ler a tabela inteira. Isso não torna o índice “errado”. O objetivo é aprender a medir em vez de adivinhar.

BLOCO 14 — EXPLAIN ANALYZE: plano e execução real

No MySQL 8.4, EXPLAIN ANALYZE executa uma consulta SELECT e mostra informações reais da execução em formato de árvore.

EXPLAIN ANALYZE
SELECT id_produto, descricao, preco
FROM produto
WHERE descricao LIKE 'A%';

ANALYZE executa a consulta

Use em SELECTs e em ambiente apropriado. A ideia aqui é comparar estimativas e execução real, não transformar otimização em tentativa aleatória.

BLOCO 15 — TRIGGER: uma ação automática ligada a uma tabela

Um trigger é executado automaticamente quando ocorre um evento de INSERT, UPDATE ou DELETE na tabela associada. Vamos criar um laboratório de auditoria de preço.

CREATE TABLE IF NOT EXISTS auditoria_preco (
    id_auditoria INT PRIMARY KEY AUTO_INCREMENT,
    id_produto INT NOT NULL,
    preco_anterior DECIMAL(10,2) NOT NULL,
    preco_novo DECIMAL(10,2) NOT NULL,
    alterado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
DROP TRIGGER IF EXISTS trg_produto_audita_preco;

DELIMITER //
CREATE TRIGGER trg_produto_audita_preco
AFTER UPDATE ON produto
FOR EACH ROW
BEGIN
    IF NEW.preco <> OLD.preco THEN
        INSERT INTO auditoria_preco
            (id_produto, preco_anterior, preco_novo)
        VALUES
            (NEW.id_produto, OLD.preco, NEW.preco);
    END IF;
END//
DELIMITER ;

OLD representa os valores anteriores da linha; NEW, os valores novos.

Lógica automática precisa ser visível para a equipe

Triggers podem ser úteis para auditoria e regras próximas aos dados, mas também podem esconder comportamento. Use quando houver motivo claro e documente.

BLOCO 16 — PROCEDURE: uma rotina chamada com CALL

Uma stored procedure agrupa instruções SQL no servidor e pode receber parâmetros.

DROP PROCEDURE IF EXISTS sp_produtos_por_categoria;

DELIMITER //
CREATE PROCEDURE sp_produtos_por_categoria(IN p_id_categoria INT)
BEGIN
    SELECT id_produto, descricao, preco, qtde
    FROM produto
    WHERE id_categoria = p_id_categoria
    ORDER BY descricao;
END//
DELIMITER ;

Para executar:

CALL sp_produtos_por_categoria(1);

O parâmetro permite reutilizar a mesma rotina para categorias diferentes.

BLOCO 17 — FUNCTION: uma rotina que devolve um valor

Uma stored function retorna um valor e pode ser usada dentro de expressões SQL.

DROP FUNCTION IF EXISTS fn_status_estoque;

DELIMITER //
CREATE FUNCTION fn_status_estoque(
    p_qtde INT,
    p_minimo INT
)
RETURNS VARCHAR(10)
DETERMINISTIC
RETURN CASE
    WHEN p_qtde <= p_minimo THEN 'REPOR'
    ELSE 'OK'
END//
DELIMITER ;

Depois:

SELECT
    descricao,
    qtde,
    estoque_minimo,
    fn_status_estoque(qtde, estoque_minimo) AS status_estoque
FROM produto
ORDER BY descricao;

BLOCO 18 — VIEW, PROCEDURE, FUNCTION e TRIGGER: não confunda

RecursoIdeia principalComo aparece
VIEWconsulta armazenadaSELECT FROM nome_da_view
PROCEDURErotina que executa um conjunto de instruçõesCALL nome(...)
FUNCTIONrotina que retorna um valornome(...) dentro de expressão
TRIGGERrotina acionada automaticamente por evento em tabeladispara em INSERT, UPDATE ou DELETE

Escolha pelo problema

Não use stored objects apenas porque são “avançados”. Cada recurso aumenta responsabilidades de manutenção, segurança, teste e documentação.

BLOCO 19 — Laboratório integrador

Monte um pequeno painel analítico do banco comercio:

  1. use uma subconsulta para identificar produtos acima da média de preço;
  2. use NOT EXISTS para localizar fornecedores sem produtos;
  3. use uma CTE para separar produtos com estoque baixo;
  4. use ROW_NUMBER para criar ranking de preço por categoria;
  5. crie uma view de produto + categoria;
  6. observe uma consulta com EXPLAIN antes e depois de um índice de laboratório;
  7. crie a função de status de estoque;
  8. execute a procedure de produtos por categoria;
  9. teste o trigger de auditoria alterando conscientemente um preço e depois restaurando o valor.

O que deve ficar na cabeça

SQL avançado é composição: dividir problemas, reutilizar resultados, analisar conjuntos sem perder detalhes, medir planos e automatizar apenas o que realmente merece ficar no banco.

BLOCO 20 — Resumo e próxima etapa

Neste capítulo usamos subconsultas, EXISTS e NOT EXISTS, UNION, CTEs, funções de janela, views, índices, EXPLAIN, triggers, procedures e functions.

O próximo passo será reunir modelagem, regras de negócio, implementação, consultas e validação em um Projeto Integrador completo.

Capítulo 9

Projeto Integrador

Chegou o momento de juntar tudo em um único trabalho: entender um problema real, transformar regras de negócio em modelo, implementar no MySQL, consultar, testar, proteger e preparar o banco para uma aplicação.

BLOCO 1 — O projeto: sistema de vendas de uma pequena loja

Uma pequena loja precisa substituir planilhas separadas por um sistema capaz de controlar clientes, produtos, categorias, pedidos, itens vendidos e estoque.

Problemas atuais

  • clientes aparecem repetidos em várias planilhas;
  • o preço atual do produto é confundido com o preço pelo qual ele foi vendido no passado;
  • pedidos e itens são anotados juntos, dificultando consultas;
  • o estoque pode ficar negativo;
  • é difícil descobrir faturamento, produtos vendidos e histórico de cada cliente.

Objetivo

Construir um banco relacional chamado loja_integrador que resolva esses problemas e possa ser usado futuramente por uma aplicação.

BLOCO 2 — Antes do DER: requisitos

Requisito descreve algo que o sistema precisa permitir ou garantir. Antes de desenhar tabelas, escreva o que o negócio precisa.

  1. cadastrar clientes;
  2. cadastrar categorias e produtos;
  3. registrar pedidos de clientes;
  4. registrar vários produtos em um pedido;
  5. guardar quantidade e preço praticado em cada item vendido;
  6. controlar estoque atual dos produtos;
  7. consultar histórico de pedidos;
  8. calcular total de cada pedido;
  9. identificar produtos nunca vendidos;
  10. permitir que uma aplicação acesse o banco com uma conta própria.

Requisito não é tabela

“Calcular o total do pedido” não significa necessariamente criar uma coluna total. Primeiro entendemos a informação; depois decidimos se ela deve ser armazenada ou calculada.

BLOCO 3 — Regras de negócio

Agora transformamos os requisitos em regras mais precisas.

RegraConsequência no modelo
um cliente pode realizar vários pedidosCLIENTE 1:N PEDIDO
cada pedido pertence a um único clientePEDIDO possui FK para CLIENTE
uma categoria pode possuir vários produtosCATEGORIA 1:N PRODUTO
um pedido pode conter vários produtos e um produto pode aparecer em vários pedidosPEDIDO N:N PRODUTO, resolvido por ITEM_PEDIDO
quantidade de item deve ser maior que zeroCHECK na quantidade
estoque não pode ficar negativoCHECK + lógica transacional da operação de venda
o preço histórico da venda não deve mudar quando o cadastro do produto mudarITEM_PEDIDO guarda preco_unitario

BLOCO 4 — Cardinalidade mínima e máxima

CLIENTE   0..N ───── 1..1 PEDIDO
CATEGORIA 0..N ───── 1..1 PRODUTO
PEDIDO    1..N ───── 0..N PRODUTO
              via ITEM_PEDIDO

Em uma implementação real, um pedido pode existir temporariamente sem itens enquanto está sendo montado. A regra “pedido finalizado precisa ter pelo menos um item” normalmente exige validação da aplicação ou um processo transacional; uma simples FK não garante isso sozinha.

Modelar também é reconhecer limites

Nem toda regra de negócio cabe naturalmente em uma única constraint. O importante é saber onde cada regra será garantida: banco, transação, aplicação ou combinação dessas camadas.

BLOCO 5 — DER conceitual

CLIENTE
  │ 1
  │
  │ N
PEDIDO ──────── ITEM_PEDIDO ──────── PRODUTO
                   N            N        │ N
                                         │
                                         │ 1
                                      CATEGORIA

Entidades principais: CLIENTE, PEDIDO, PRODUTO e CATEGORIA. ITEM_PEDIDO nasce do relacionamento N:N entre pedido e produto e ainda possui atributos próprios: quantidade e preço_unitario.

BLOCO 6 — Do conceitual para o modelo lógico

CLIENTE
PK id_cliente
   nome
   email
   telefone

CATEGORIA
PK id_categoria
   nome

PRODUTO
PK id_produto
   descricao
   preco
   estoque
FK id_categoria

PEDIDO
PK id_pedido
   data_pedido
   status
FK id_cliente

ITEM_PEDIDO
PK/FK id_pedido
PK/FK id_produto
      quantidade
      preco_unitario

A chave composta de ITEM_PEDIDO impede que o mesmo produto seja repetido duas vezes no mesmo pedido. Se o negócio quisesse permitir várias linhas do mesmo produto, precisaríamos rever essa regra e a chave.

BLOCO 7 — Normalização: por que não guardar tudo em uma planilha?

Imagine uma planilha assim:

pedidodataclienteemailprodutocategoriaqtdpreço
10120/08Anaana@...CadernoPapelaria218,90
10120/08Anaana@...CanetaPapelaria53,50

Pedido, cliente e categoria ficam repetidos. Se o e-mail mudar, várias linhas precisam ser corrigidas. Se a categoria mudar de nome, o mesmo problema reaparece.

1FN

Cada célula contém valor atômico; produtos do pedido viram linhas próprias.

2FN

Em ITEM_PEDIDO, quantidade e preço_unitario dependem da chave composta inteira: pedido + produto.

3FN

Dados de cliente e categoria ficam em suas próprias tabelas, evitando dependências indiretas e repetição.

BLOCO 8 — Criando o banco e as tabelas

CREATE DATABASE loja_integrador
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;

USE loja_integrador;

CREATE TABLE cliente (
    id_cliente INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(120) UNIQUE,
    telefone VARCHAR(20)
);

CREATE TABLE categoria (
    id_categoria INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(60) NOT NULL UNIQUE
);

CREATE TABLE produto (
    id_produto INT PRIMARY KEY AUTO_INCREMENT,
    descricao VARCHAR(120) NOT NULL,
    preco DECIMAL(10,2) NOT NULL,
    estoque INT NOT NULL DEFAULT 0,
    id_categoria INT NOT NULL,
    CHECK (preco >= 0),
    CHECK (estoque >= 0),
    FOREIGN KEY (id_categoria)
        REFERENCES categoria(id_categoria)
);

CREATE TABLE pedido (
    id_pedido INT PRIMARY KEY AUTO_INCREMENT,
    data_pedido DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    status VARCHAR(15) NOT NULL DEFAULT 'ABERTO',
    id_cliente INT NOT NULL,
    CHECK (status IN ('ABERTO','PAGO','CANCELADO')),
    FOREIGN KEY (id_cliente)
        REFERENCES cliente(id_cliente)
);

CREATE TABLE item_pedido (
    id_pedido INT NOT NULL,
    id_produto INT NOT NULL,
    quantidade INT NOT NULL,
    preco_unitario DECIMAL(10,2) NOT NULL,
    PRIMARY KEY (id_pedido, id_produto),
    CHECK (quantidade > 0),
    CHECK (preco_unitario >= 0),
    FOREIGN KEY (id_pedido)
        REFERENCES pedido(id_pedido),
    FOREIGN KEY (id_produto)
        REFERENCES produto(id_produto)
);

BLOCO 9 — Dados iniciais para teste

INSERT INTO categoria (id_categoria, nome) VALUES
(1, 'PAPELARIA'),
(2, 'INFORMATICA'),
(3, 'ESCRITORIO');

INSERT INTO produto
(id_produto, descricao, preco, estoque, id_categoria) VALUES
(1, 'CADERNO UNIVERSITARIO', 18.90, 40, 1),
(2, 'CANETA AZUL', 3.50, 100, 1),
(3, 'MOUSE USB', 49.90, 25, 2),
(4, 'SUPORTE PARA NOTEBOOK', 89.90, 12, 2),
(5, 'PASTA ARQUIVO', 12.50, 30, 3);

INSERT INTO cliente
(id_cliente, nome, email, telefone) VALUES
(1, 'ANA SOUZA', 'ana@exemplo.com', '11999990001'),
(2, 'BRUNO LIMA', 'bruno@exemplo.com', '11999990002'),
(3, 'CARLA MENDES', 'carla@exemplo.com', '11999990003');

INSERT INTO pedido
(id_pedido, data_pedido, status, id_cliente) VALUES
(1, '2026-08-20 10:00:00', 'PAGO', 1),
(2, '2026-08-21 14:30:00', 'PAGO', 2),
(3, '2026-08-22 09:15:00', 'ABERTO', 1);

INSERT INTO item_pedido
(id_pedido, id_produto, quantidade, preco_unitario) VALUES
(1, 1, 2, 18.90),
(1, 2, 5, 3.50),
(2, 3, 1, 49.90),
(2, 5, 2, 12.50),
(3, 4, 1, 89.90);

Preço de venda pertence ao item

Se amanhã o MOUSE USB passar a custar R$ 59,90, o pedido antigo continua registrando R$ 49,90. Histórico de venda não deve ser reescrito pelo preço atual do cadastro.

BLOCO 10 — Primeira consulta: pedido completo

SELECT
    p.id_pedido,
    p.data_pedido,
    c.nome AS cliente,
    pr.descricao AS produto,
    i.quantidade,
    i.preco_unitario,
    i.quantidade * i.preco_unitario AS subtotal
FROM pedido AS p
INNER JOIN cliente AS c
    ON c.id_cliente = p.id_cliente
INNER JOIN item_pedido AS i
    ON i.id_pedido = p.id_pedido
INNER JOIN produto AS pr
    ON pr.id_produto = i.id_produto
ORDER BY p.id_pedido, pr.descricao;

O relatório recompõe dados que foram corretamente separados durante a normalização.

BLOCO 11 — Total de cada pedido

SELECT
    p.id_pedido,
    c.nome AS cliente,
    p.status,
    SUM(i.quantidade * i.preco_unitario) AS total_pedido
FROM pedido AS p
INNER JOIN cliente AS c
    ON c.id_cliente = p.id_cliente
INNER JOIN item_pedido AS i
    ON i.id_pedido = p.id_pedido
GROUP BY p.id_pedido, c.nome, p.status
ORDER BY p.id_pedido;

Por que não criamos total_pedido na tabela?

Neste modelo, o total é derivado dos itens. Armazená-lo também criaria duas fontes para a mesma informação e exigiria sincronização. Existem sistemas em que valores consolidados são armazenados por motivos específicos, mas isso precisa ser uma decisão consciente.

BLOCO 12 — Perguntas de negócio mais avançadas

Produtos nunca vendidos

SELECT pr.id_produto, pr.descricao
FROM produto AS pr
WHERE NOT EXISTS (
    SELECT 1
    FROM item_pedido AS i
    WHERE i.id_produto = pr.id_produto
)
ORDER BY pr.descricao;

Quanto cada cliente já comprou em pedidos pagos?

WITH compras AS (
    SELECT
        c.id_cliente,
        c.nome,
        SUM(i.quantidade * i.preco_unitario) AS total_comprado
    FROM cliente AS c
    INNER JOIN pedido AS p
        ON p.id_cliente = c.id_cliente
    INNER JOIN item_pedido AS i
        ON i.id_pedido = p.id_pedido
    WHERE p.status = 'PAGO'
    GROUP BY c.id_cliente, c.nome
)
SELECT
    nome,
    total_comprado,
    RANK() OVER (ORDER BY total_comprado DESC) AS posicao
FROM compras
ORDER BY posicao, nome;

BLOCO 13 — Registrando uma venda com transação

Criar o pedido, inserir itens e baixar estoque formam um único processo. Se uma parte falhar, não queremos metade da venda gravada.

START TRANSACTION
        ↓
verificar/bloquear estoque
        ↓
criar pedido
        ↓
inserir itens
        ↓
baixar estoque
        ↓
COMMIT ou ROLLBACK

Em uma venda de duas unidades do produto 1, uma aplicação pode iniciar assim:

START TRANSACTION;

SELECT id_produto, preco, estoque
FROM produto
WHERE id_produto = 1
FOR UPDATE;

-- A aplicação verifica se estoque >= 2.

INSERT INTO pedido (id_cliente, status)
VALUES (3, 'ABERTO');

SET @novo_pedido = LAST_INSERT_ID();

INSERT INTO item_pedido
(id_pedido, id_produto, quantidade, preco_unitario)
SELECT @novo_pedido, id_produto, 2, preco
FROM produto
WHERE id_produto = 1;

UPDATE produto
SET estoque = estoque - 2
WHERE id_produto = 1
  AND estoque >= 2;

-- Se todas as validações deram certo:
COMMIT;

A aplicação precisa verificar resultados

Se o UPDATE afetar zero linhas porque não há estoque suficiente, a aplicação deve detectar isso e executar ROLLBACK. Uma transação não decide sozinha qual resultado representa sucesso para o negócio.

BLOCO 14 — Uma VIEW para o resumo de pedidos

CREATE OR REPLACE VIEW vw_resumo_pedido AS
SELECT
    p.id_pedido,
    p.data_pedido,
    p.status,
    c.id_cliente,
    c.nome AS cliente,
    SUM(i.quantidade * i.preco_unitario) AS total_pedido
FROM pedido AS p
INNER JOIN cliente AS c
    ON c.id_cliente = p.id_cliente
INNER JOIN item_pedido AS i
    ON i.id_pedido = p.id_pedido
GROUP BY
    p.id_pedido,
    p.data_pedido,
    p.status,
    c.id_cliente,
    c.nome;

Agora relatórios podem começar por:

SELECT *
FROM vw_resumo_pedido
WHERE status = 'PAGO'
ORDER BY data_pedido DESC;

BLOCO 15 — Índice orientado por necessidade

Se relatórios consultarem pedidos frequentemente por período, faz sentido testar um índice sobre a data.

CREATE INDEX idx_pedido_data
ON pedido(data_pedido);

EXPLAIN
SELECT id_pedido, data_pedido, status
FROM pedido
WHERE data_pedido >= '2026-08-01'
  AND data_pedido < '2026-09-01';

Em nossa base pequena, o otimizador pode continuar preferindo uma leitura simples. O projeto mostra o processo correto: identificar consulta importante → medir → criar índice quando fizer sentido → medir novamente.

BLOCO 16 — O banco não deve ser exposto diretamente ao usuário

Usuário
   ↓
Aplicação / API
   ↓
Driver ou Connector
   ↓
MySQL Server
   ↓
Banco loja_integrador

A interface do sistema conversa com a aplicação. A aplicação valida regras, controla transações e usa uma conta MySQL com privilégios adequados. O usuário final não precisa conhecer a senha do banco.

Não use root na aplicação

Crie uma conta própria e conceda somente o necessário. Credenciais também não devem ficar publicadas no código-fonte ou em repositórios.

BLOCO 17 — Consultas parametrizadas

Quando a aplicação recebe um valor do usuário, não deve montar SQL concatenando texto recebido.

Evite

"SELECT * FROM cliente WHERE id_cliente = " + valor_recebido

Prefira parâmetros

SELECT * FROM cliente WHERE id_cliente = ?

O driver envia o valor como parâmetro. Prepared statements ajudam a separar código SQL de dados e reduzem o risco de SQL injection.

BLOCO 18 — O que testar antes de dizer que o banco está pronto?

TesteExemplo
integridadetentar inserir produto com categoria inexistente deve falhar
CHECKestoque negativo deve ser rejeitado
unicidadee-mail duplicado não deve ser aceito quando informado
relacionamentosrelatório de pedido precisa mostrar cliente e itens corretos
transaçãofalha na venda deve permitir ROLLBACK
segurançaconta da aplicação não deve possuir privilégios administrativos
recuperaçãobackup precisa ser restaurado em ambiente de teste

BLOCO 19 — Entregáveis do projeto

Um projeto de banco não termina no arquivo SQL. Organize a entrega:

  1. descrição do problema;
  2. requisitos;
  3. regras de negócio;
  4. DER conceitual;
  5. modelo lógico com PKs e FKs;
  6. justificativa de normalização;
  7. script de criação do banco;
  8. dados de teste;
  9. consultas e relatórios;
  10. teste de transação;
  11. plano básico de usuário/permissões;
  12. backup e teste de restauração;
  13. descrição de como uma aplicação acessará o banco.

BLOCO 20 — Revisão crítica do próprio projeto

Antes de entregar, faça perguntas que um revisor faria:

  • algum dado está repetido sem necessidade?
  • todas as tabelas possuem uma chave adequada?
  • as FKs representam as regras de negócio?
  • há atributos que pertencem a outra entidade?
  • o histórico de venda é preservado?
  • uma operação parcial pode deixar o banco inconsistente?
  • as consultas respondem perguntas reais?
  • o usuário da aplicação possui privilégios demais?
  • o backup foi realmente restaurado?

Projeto bom é projeto explicável

Se você consegue justificar entidades, chaves, relacionamentos, constraints, consultas e transações a partir das regras do negócio, o banco deixou de ser uma coleção de comandos e passou a ser uma solução.

BLOCO 21 — Resumo e próxima etapa

Neste projeto percorremos o ciclo completo: problema → requisitos → regras → modelagem conceitual → modelo lógico → normalização → implementação física → dados → consultas → transação → desempenho → segurança → aplicação → testes e recuperação.

O último capítulo amplia a visão: como bancos relacionais convivem com NoSQL, nuvem, APIs, Big Data e Inteligência Artificial, e como escolher tecnologia sem seguir moda.

Capítulo 10

Visão Moderna de Dados

Banco relacional continua essencial, mas hoje ele convive com bancos NoSQL, serviços em nuvem, plataformas analíticas, APIs e sistemas de Inteligência Artificial. O objetivo deste capítulo é aprender a escolher tecnologia pelo problema — e não pela moda.

BLOCO 1 — Moderno não significa abandonar o relacional

Depois de aprender modelagem, SQL, transações, segurança e administração, seria um erro concluir que tudo isso foi substituído. Bancos relacionais continuam sendo uma escolha excelente quando o problema exige estrutura clara, integridade, relacionamentos e transações confiáveis.

Ideia principal

A pergunta moderna não é “SQL ou NoSQL: qual é melhor?”. A pergunta é: qual modelo de dados e qual arquitetura atendem melhor aos requisitos deste sistema?

Problema real
    ↓
requisitos de dados + acesso + escala + consistência
    ↓
escolha da tecnologia
    ↓
relacional / documento / chave-valor / grafo / analytics / combinação

BLOCO 2 — NoSQL é uma família, não um único tipo de banco

O termo NoSQL reúne tecnologias com modelos diferentes do relacional tradicional. Elas não possuem todas as mesmas características.

ModeloOrganização principalExemplo de uso
documentosdocumentos com campos e estruturas aninhadascatálogos com atributos variados
chave-valoruma chave identifica um valorcache, sessão, contadores
colunas amplasdados distribuídos organizados por chaves e famílias de colunasgrandes volumes com padrões previsíveis de consulta
grafosnós, relacionamentos e propriedadesredes, fraude, recomendação, dependências

NoSQL não significa “sem modelagem”

Um modelo flexível continua exigindo decisões. Em bancos de documentos, por exemplo, é preciso decidir o que fica incorporado, o que fica separado e como a aplicação acessará os dados.

BLOCO 3 — Banco de documentos

Em um banco de documentos, um registro pode ser representado por uma estrutura parecida com JSON. MongoDB, por exemplo, armazena documentos em BSON.

{
  "pedido": 501,
  "cliente": {
    "id": 7,
    "nome": "ANA"
  },
  "itens": [
    {"produto": "CADERNO", "qtd": 2, "preco": 18.90},
    {"produto": "CANETA", "qtd": 5, "preco": 3.50}
  ]
}

Dados usados juntos podem ser armazenados juntos. Isso pode ser muito conveniente, mas também exige cuidado com duplicidade, tamanho dos documentos, atualização e padrões de acesso.

Compare com o relacional

No projeto anterior, cliente, pedido e itens estavam normalizados em tabelas relacionadas. Em documento, parte dessa estrutura pode ficar aninhada. Não é “certo versus errado”: são estratégias diferentes.

BLOCO 4 — Chave-valor: acesso extremamente direto

No modelo chave-valor, uma chave identifica um valor.

sessao:usuario:42  → { dados da sessão }
produto:22:cache   → { resumo do produto }
tentativas:login:7 → 3

Esse formato combina bem com situações em que a aplicação já sabe exatamente qual chave precisa buscar. Sistemas como Redis vão além de valores simples e oferecem várias estruturas de dados, mas a ideia de chave continua central.

Uso combinado

Uma aplicação pode manter os pedidos oficiais em MySQL e usar outro banco como cache. Sistemas modernos frequentemente combinam tecnologias em vez de substituir uma por outra.

BLOCO 5 — Bancos de grafos: quando as relações são o centro do problema

Grafos representam dados como nós e relacionamentos, ambos podendo possuir propriedades.

(PESSOA: Ana) ──COMPRA──> (PRODUTO: Notebook)
      │
      └──CONHECE──> (PESSOA: Bruno)
                         │
                         └──COMPRA──> (PRODUTO: Mouse)

Quando a pergunta principal envolve percorrer muitas conexões — amigos de amigos, rotas, fraude, dependências ou recomendações — um banco de grafos pode tornar esse tipo de navegação mais natural.

BLOCO 6 — Bancos de colunas amplas

Bancos de colunas amplas foram projetados para grandes volumes distribuídos e padrões específicos de acesso. Em vez de começar por um modelo relacional cheio de JOINs, o desenho costuma considerar fortemente como os dados serão consultados.

Não confunda

Banco de “colunas amplas” não é simplesmente uma tabela SQL com muitas colunas, nem é a mesma coisa que um banco analítico colunar. Os nomes parecem próximos, mas os conceitos são diferentes.

BLOCO 7 — Esquema rígido, flexível e híbrido

Relacional não significa que tudo precise ser inflexível, e NoSQL não significa ausência de esquema. O MySQL 8.4, por exemplo, possui tipo de dados JSON.

CREATE TABLE produto_flexivel (
    id INT PRIMARY KEY,
    descricao VARCHAR(100) NOT NULL,
    atributos JSON
);

INSERT INTO produto_flexivel VALUES
(1, 'NOTEBOOK', JSON_OBJECT(
    'ram', '16 GB',
    'ssd', '512 GB',
    'cor', 'cinza'
));

Arquitetura híbrida

É possível manter os dados essenciais em colunas relacionais bem definidas e reservar JSON para atributos realmente variáveis. Flexibilidade também deve ser uma decisão de modelagem.

BLOCO 8 — Como escolher entre relacional e outros modelos?

PerguntaO que ela ajuda a descobrir
existem transações importantes entre vários dados?forte motivo para considerar um banco transacional com boas garantias
relacionamentos complexos são parte central das consultas?relacional ou grafo podem ser candidatos, dependendo do padrão
os objetos possuem estruturas muito variáveis?documentos ou abordagem híbrida podem ajudar
o acesso é quase sempre por uma chave conhecida?chave-valor pode ser adequado
qual é o volume e como ele cresce?influencia particionamento, distribuição e custo
quais consultas realmente precisam ser rápidas?o padrão de acesso influencia o modelo e os índices
qual consistência o negócio exige?evita trocar correção por disponibilidade sem perceber

BLOCO 9 — Escala vertical e horizontal

Escala vertical

Dar mais CPU, memória ou armazenamento a um servidor.

Escala horizontal

Distribuir trabalho ou dados entre múltiplos servidores.

Escalar horizontalmente pode envolver réplicas, particionamento e outras técnicas. Mas distribuição traz novos problemas: latência de rede, sincronização, falhas parciais e consistência.

Distribuir não é automaticamente melhor

Um sistema pequeno pode ficar mais caro e mais difícil de operar se adotar uma arquitetura distribuída sem necessidade.

BLOCO 10 — Réplica, particionamento e cache

TécnicaIdeiaCuidado
replicaçãomanter cópias dos dados em outros nósconsistência, atraso e failover
particionamento / shardingdividir os dados entre partesescolher uma boa chave e lidar com consultas entre partições
cacheguardar resultados de acesso frequente em camada rápidadados desatualizados e invalidação

Réplica não é backup

Se um erro lógico apagar dados e a exclusão for replicada, todas as réplicas podem receber o erro. Alta disponibilidade e recuperação de dados resolvem problemas diferentes.

BLOCO 11 — Consistência em sistemas distribuídos

No capítulo de transações, “consistência” apareceu dentro do ACID. Em sistemas distribuídos existe também a discussão de consistência entre cópias e nós.

Durante uma falha de comunicação entre partes de um sistema distribuído, pode ser necessário decidir entre recusar certas operações para preservar uma visão mais consistente ou continuar atendendo e aceitar temporariamente diferenças entre réplicas.

Evite o slogan “CAP = escolha dois”

O ponto útil para o iniciante é entender que partições de rede podem acontecer e que consistência e disponibilidade envolvem escolhas de arquitetura. Sistemas reais oferecem comportamentos e níveis mais graduais do que um slogan de três letras sugere.

BLOCO 12 — Banco em nuvem: serviço gerenciado

Em vez de instalar e manter todo o servidor manualmente, podemos contratar um serviço gerenciado de banco. Plataformas de nuvem oferecem opções relacionais e NoSQL com automação de tarefas operacionais.

Aplicação
   ↓
serviço de banco gerenciado
   ├── infraestrutura
   ├── monitoramento
   ├── opções de backup
   ├── opções de alta disponibilidade
   └── atualização/operação conforme o serviço

Gerenciado não significa “sem responsabilidade”

A equipe ainda precisa escolher região, capacidade, rede, usuários, privilégios, política de backup, retenção, custos e testes de recuperação. Automatizar tarefas não elimina a necessidade de entendê-las.

BLOCO 13 — Disponibilidade e recuperação são decisões diferentes

Serviços de nuvem podem oferecer implantação em múltiplas zonas, réplicas, snapshots e restauração para um ponto no tempo. Cada recurso responde a um risco diferente.

NecessidadeExemplo de mecanismo
continuar atendendo se uma instância falharredundância / failover / multi-zona
recuperar dado apagado por enganobackup / snapshot / restauração temporal
sobreviver a desastre regionalestratégia entre regiões, quando o risco justificar

Não escolha arquitetura apenas pela lista de recursos. Pergunte quanto tempo o sistema pode ficar indisponível e quanto dado o negócio aceita perder.

BLOCO 14 — API: a fronteira entre aplicação e dados

Navegador / App móvel / outro sistema
                 ↓ HTTPS
                API
                 ↓
        regras + autenticação
                 ↓
              Banco

A API pode validar entrada, autenticar usuários, aplicar regras, controlar transações e devolver apenas os dados necessários. Ela também evita expor diretamente credenciais e portas do banco aos clientes finais.

Banco não é API

SQL organiza e consulta dados; a API define como outras aplicações podem solicitar operações do sistema. São camadas diferentes.

BLOCO 15 — OLTP e analytics: perguntas diferentes

Operacional / OLTPAnalítico
muitas operações pequenasleitura e agregação de grandes conjuntos
pedido, pagamento, estoquetendências, indicadores, histórico
baixa latência por transaçãoprocessamento de grandes volumes
dados atuais e consistentesdados integrados de várias fontes

Um banco criado para registrar pedidos não precisa ser a mesma plataforma usada para analisar bilhões de eventos históricos.

BLOCO 16 — Data warehouse, data lake e lakehouse

ConceitoExplicação inicial
data warehouseambiente orientado à análise, com dados organizados para relatórios e inteligência de negócio
data lakerepositório capaz de guardar grandes volumes de dados em formatos variados, inclusive brutos
lakehousearquitetura que busca combinar flexibilidade de lake com recursos de gestão e análise associados a warehouses

Não é uma sequência obrigatória

Esses termos descrevem arquiteturas e produtos diferentes. Uma escola ou pequena empresa não precisa montar um “Big Data” apenas porque o conceito existe.

BLOCO 17 — Big Data: mais do que “muitos registros”

Big Data costuma ser explicado por dimensões como volume, velocidade e variedade. O ponto importante é que certas cargas ultrapassam o que uma arquitetura convencional consegue processar de modo adequado em custo, tempo ou complexidade.

sensores + cliques + transações + logs + arquivos
                    ↓
          ingestão e processamento
                    ↓
             armazenamento
                    ↓
          análise / modelos / BI

Antes de escolher ferramentas, defina a pergunta analítica. Coletar dados sem objetivo cria custo e risco, não inteligência.

BLOCO 18 — IA, embeddings e busca vetorial

Modelos de IA frequentemente trabalham com embeddings: representações numéricas que capturam características semânticas de textos, imagens ou outros dados. Embeddings podem ser comparados por similaridade.

documento
   ↓ modelo de embedding
vetor numérico
   ↓
armazenamento vetorial
   ↓ similaridade
conteúdo semanticamente próximo

Um sistema de busca vetorial não substitui automaticamente as tabelas transacionais. Um e-commerce pode manter pedido e pagamento no banco relacional e usar vetores para busca semântica de produtos ou documentos.

Não confunda os ambientes

O MySQL 8.4 usado neste curso possui JSON, mas recursos de Vector Store e GenAI aparecem em ofertas específicas como MySQL HeatWave e evoluem por versão. Não assuma que qualquer instalação comum do MySQL 8.4 possui os mesmos recursos.

BLOCO 19 — RAG: IA consultando uma base de conhecimento

RAG — Retrieval-Augmented Generation combina recuperação de conteúdo relevante com geração por um modelo de linguagem.

Pergunta do usuário
       ↓
busca por conteúdo relevante
       ↓
trechos recuperados
       ↓ contexto
modelo de linguagem
       ↓
resposta baseada nesse contexto

O banco ou vector store participa da etapa de recuperação. O modelo de linguagem continua sendo outra parte da arquitetura. Qualidade dos documentos, atualização, permissões e avaliação das respostas continuam importantes.

BLOCO 20 — Dados para IA precisam de qualidade e governança

IA não corrige automaticamente dados ruins. Duplicidades, cadastros incorretos, documentos desatualizados e permissões mal definidas podem produzir resultados ruins ou exposição indevida de informação.

QuestãoPergunta prática
qualidadeos dados estão corretos, completos e atuais?
linhagemsabemos de onde vieram?
acessoquem pode consultar cada informação?
retençãopor quanto tempo os dados devem existir?
privacidadehá dados pessoais ou sensíveis que exigem proteção específica?
auditoriaé possível investigar alterações e usos importantes?

BLOCO 21 — Quatro cenários, quatro arquiteturas possíveis

CenárioEscolha inicial razoávelMotivo
loja pequena com pedidos e estoquebanco relacionaltransações, integridade e relacionamentos claros
cache de sessões de um sitechave-valoracesso direto e dados temporários
rede de relacionamentos para investigar fraudegrafotravessia de conexões é central
análise de anos de eventos de milhões de usuáriosplataforma analítica / warehousegrandes agregações e histórico

Em sistemas maiores, essas escolhas podem coexistir. O pedido oficial pode estar no relacional, a sessão no cache, os eventos no analytics e os embeddings em uma camada vetorial.

BLOCO 22 — Checklist para escolher tecnologia

  1. qual problema de negócio estamos resolvendo?
  2. qual é a estrutura natural dos dados?
  3. quais consultas e operações são mais importantes?
  4. quais regras de integridade são obrigatórias?
  5. quais operações precisam ser transacionais?
  6. qual volume existe hoje e qual crescimento é plausível?
  7. qual disponibilidade e recuperação são necessárias?
  8. quais conhecimentos a equipe possui?
  9. qual custo operacional e financeiro é aceitável?
  10. como segurança, privacidade e governança serão tratadas?

Comece pelo necessário

Uma arquitetura simples que atende aos requisitos costuma ser melhor do que uma arquitetura sofisticada criada para problemas que ainda não existem.

BLOCO 23 — O que permanece válido em qualquer tecnologia

As ferramentas mudam. Os princípios que aprendemos durante o módulo continuam úteis:

Entender o problema

Requisitos e regras vêm antes da tecnologia.

Modelar conscientemente

Mesmo modelos flexíveis precisam de decisões.

Proteger os dados

Acesso mínimo, backup, recuperação e auditoria continuam essenciais.

Medir

Desempenho e escala devem ser observados, não adivinhados.

BLOCO 24 — Fechamento do módulo

Começamos entendendo por que bancos de dados surgiram. Passamos por fundamentos, modelagem conceitual, modelo lógico, normalização, implementação, SQL, relacionamentos, administração, transações, recursos avançados e um projeto completo.

Agora também sabemos que o ecossistema de dados é maior que um único SGBD. A competência mais importante é conseguir entender o problema, estruturar os dados, preservar sua integridade e escolher conscientemente a tecnologia.

Da ferramenta para a decisão

Aprender MySQL foi o caminho prático. Aprender a pensar sobre dados é o conhecimento que continua válido quando a ferramenta muda.

Capítulo 99

Exercícios

Área prática para fixação, interpretação, raciocínio e aplicação dos conceitos. Recomenda-se seguir a ordem dos capítulos, pois alguns exercícios dependem de ideias construídas anteriormente.

Escolha um capítulo

Escolha um capítulo abaixo para praticar os conceitos estudados e consolidar o aprendizado.

Exercícios — Início

História dos Bancos de Dados

Do caos informacional aos bancos modernos.

H1 — O Caos Informacional
🟢 Básico 📖 Interpretação Tema: sistemas manuais

Situação-problema: uma escola mantém matrículas, boletins, pagamentos e biblioteca em fichas e pastas físicas. Após alguns anos, parte das fichas está desatualizada, algumas foram arquivadas em locais errados e o relatório de alunos com pendências demora dias para ser produzido.

  1. Quais problemas de organização aparecem nesse cenário?
  2. Por que apenas “guardar documentos” não garante informação confiável?
  3. Explique como perda, dificuldade de busca e repetição prejudicam a escola.
  4. Relacione o cenário com a ideia de “caos informacional”.
Responda no caderno ou em um documento próprio.
H2 — Redundância e Inconsistência
🟢 Básico 🧠 Conceitual Tema: arquivos isolados

Situação-problema: o telefone do aluno Bruno aparece no financeiro, na biblioteca e no sistema acadêmico. O telefone foi atualizado apenas no sistema acadêmico.

  1. Qual é o problema de redundância nesse caso?
  2. Qual inconsistência pode surgir?
  3. Por que a redundância aumenta a chance de erro?
  4. Explique por que atualizar o mesmo dado em vários lugares é perigoso.
Não copie definições prontas. Explique com suas palavras.
H3 — Evolução dos Sistemas
🟡 Intermediário 📊 Comparação Tema: manual → arquivos → SGBD

Complete a comparação entre três formas de organização dos dados:

CaracterísticaSistema manualSistema baseado em arquivosSistema com SGBD
Velocidade de busca
Redundância
Integração
Segurança
Facilidade de manutenção
  1. Explique por que arquivos digitais melhoraram a velocidade, mas não resolveram totalmente a organização lógica dos dados.
  2. Explique por que o SGBD representou uma mudança estrutural.
H4 — O Surgimento dos SGBDs
🟡 Intermediário 🧠 Análise Tema: SGBD

Analise o fluxo:

Programa
   ↓
SGBD
   ↓
Banco de Dados
  1. Qual é o papel do SGBD nesse fluxo?
  2. Por que separar os dados dos programas foi uma mudança importante?
  3. Cite quatro responsabilidades de um SGBD.
  4. Explique a diferença entre banco de dados, SGBD e SQL.
H5 — Modelo Relacional e SQL
🟡 Intermediário 🔗 Relações Tema: Codd, tabelas e SQL

Observe as tabelas:

id_alunonomeid_turma
1Ana10
2Bruno20
id_turmanome_turma
101A
201B
  1. Por que o modelo relacional organiza dados em tabelas?
  2. Qual campo liga alunos e turmas?
  3. Explique por que o relacionamento evita repetição desnecessária.
  4. Interprete conceitualmente o comando abaixo, sem se preocupar ainda em executá-lo:
SELECT nome
FROM alunos
WHERE id_turma = 10;

Explique também por que dizemos que SQL é uma linguagem declarativa.

H6 — Internet, Big Data, NoSQL e Cloud
🟡 Intermediário🌐 EvoluçãoTema: novos desafios

Situação-problema: uma plataforma digital cresce de milhares para milhões de acessos e passa a registrar vídeos, comentários, pagamentos, recomendações e logs.

  1. Que novos desafios de volume, velocidade ou variedade podem aparecer?
  2. Por que esse crescimento pode levar a organização a combinar tecnologias diferentes?
  3. Explique por que NoSQL não significa “fim do SQL”.
  4. Qual papel a nuvem pode ter nesse crescimento?
Neste momento, foque no motivo histórico da evolução. A escolha arquitetural detalhada será estudada no Capítulo 10.
H7 — Desafio Final: da história ao presente
🔴 Avançado🛠 SínteseTema: evolução dos bancos

Escolha um sistema moderno, como rede social, streaming, banco digital ou e-commerce.

  1. Que problemas ele teria se dependesse apenas de arquivos isolados?
  2. Onde um SGBD ajuda?
  3. Por que o modelo relacional continua útil?
  4. Que novos desafios de escala ou variedade aparecem?
  5. Por que tecnologias diferentes podem coexistir no mesmo sistema?
Produza uma síntese curta ligando sistemas manuais, arquivos, SGBDs, modelo relacional e desafios modernos.
Exercícios — Capítulo 1

Fundamentos de Banco de Dados

Dados, informação, tabelas, colunas/atributos, chaves, tipos, relacionamentos, integridade e funcionamento real dos sistemas.

1A — Dados e Informação
🟢 Básico📖 Conceitual

Explique a diferença entre dado e informação. Depois transforme os dados “Maria, 8,7, Matemática, 2026” em uma informação compreensível.

Responda com suas palavras e crie uma frase completa.
1B — Estrutura das Tabelas
🟢 Básico📊 Estrutura
  1. Explique a diferença entre tabela, linha/registro, coluna/atributo e valor.
  2. Em uma tabela de clientes, identifique exemplos de colunas/atributos e registros.
1C — Domínio e Tipos
🟡 Intermediário🧠 Análise
  1. Qual tipo de dado seria adequado para idade, preço, data de nascimento e e-mail?
  2. Explique por que telefone geralmente não deve ser tratado como número para cálculo.
  3. O que significa domínio de um atributo?
1D — Chave Primária
🟡 Intermediário🔑 Chaves
  1. O que é chave primária?
  2. Por que nomes normalmente não são boas chaves primárias?
  3. Explique o conceito de unicidade.
1E — Relacionamentos
🟡 Intermediário🔗 Relações
  1. Explique a função da chave estrangeira.
  2. Por que relacionamentos evitam repetição desnecessária?
  3. Dê um exemplo de relacionamento entre duas entidades.
1F — Integridade
🔴 Avançado🛡 Integridade
  1. Explique integridade de entidade, referencial e de domínio.
  2. Dê um exemplo de dado inválido que o banco deveria bloquear.
  3. Por que o banco também deve validar dados, mesmo quando a aplicação já valida?
1G — Funcionamento Real
🟡 Intermediário🌐 Sistemas reais
  1. Explique o fluxo entre usuário, aplicação e banco de dados.
  2. O que acontece internamente quando um usuário salva um favorito em um aplicativo?
  3. Por que o usuário normalmente não vê SQL?
1H — Erros Clássicos
🟡 Intermediário⚠️ Diagnóstico
  1. Explique o problema de misturar nome, telefone e bairro em uma única coluna.
  2. Reescreva essa estrutura de forma correta.
  3. Cite dois erros comuns de iniciantes em banco de dados.
1I — Desafio Final: Sistema Escolar
🔴 Avançado🛠 Projeto Reflexivo

Imagine um sistema escolar.

  1. Quais tabelas poderiam existir?
  2. Quais colunas/atributos seriam importantes?
  3. Onde seriam usadas chaves primárias e estrangeiras?
  4. Quais regras de integridade seriam importantes?
Exercícios — Capítulo 2

Modelagem Conceitual

Entidades, atributos, relacionamentos, cardinalidade, DER e pensamento analítico.

2A — Identificando Entidades
🟢 Básico📖 Entidades

Uma academia deseja controlar alunos, professores, planos, pagamentos e aulas.

  1. Quais elementos podem se tornar entidades?
  2. Explique por que essas entidades são importantes para o sistema.
  3. Existe algum elemento listado que talvez não precise virar entidade? Justifique.
2B — Identificando Atributos
🟢 Básico🧩 Atributos
  1. Cite pelo menos 6 atributos possíveis para a entidade Cliente.
  2. Qual atributo poderia funcionar como identificador?
  3. Quais atributos poderiam possuir validações específicas?
  4. Existe algum atributo desnecessário? Explique.
2C — Relacionamentos e regras de negócio
🟡 Intermediário🔗 Relações

Uma loja virtual possui clientes, pedidos, produtos e categorias.

  1. Escreva regras de negócio para o cenário.
  2. Quais relacionamentos provavelmente existem?
  3. Explique cada relacionamento.
  4. O que aconteceria se essas entidades não fossem relacionadas?
  5. Quais problemas poderiam surgir?
2D — Cardinalidade
🟡 Intermediário📊 Cardinalidade
  1. Cliente realiza vários pedidos; cada pedido pertence a um cliente. Qual cardinalidade?
  2. Aluno cursa várias disciplinas; disciplina possui vários alunos. Qual cardinalidade?
  3. Funcionário possui um crachá exclusivo; cada crachá pertence a um funcionário. Qual cardinalidade?
  4. Cliente pode existir sem pedido, mas todo pedido pertence a um cliente. Indique as cardinalidades mínima e máxima nos dois sentidos.
2E — Problemas de Modelagem
🟡 Intermediário⚠️ Diagnóstico

Analise a estrutura:

alunoturmaprofessordisciplinanota
  1. Quais problemas essa estrutura pode gerar?
  2. Existe mistura de responsabilidades?
  3. Quais entidades poderiam ser separadas?
  4. Onde pode existir redundância?
  5. Como melhorar essa modelagem?
2F — Pensamento Analítico
🔴 Avançado🧠 Análise

Uma clínica deseja controlar pacientes, médicos, consultas, exames e pagamentos.

  1. Quais entidades provavelmente existirão?
  2. Quais atributos importantes cada entidade poderia possuir?
  3. Quais relacionamentos existirão?
  4. Quais cardinalidades provavelmente aparecerão?
  5. O que poderia acontecer se a clínica não modelasse corretamente o sistema?
2G — Interpretação de DER
🟡 Intermediário📐 DER
CLIENTE 1 ─── N PEDIDO
PEDIDO 1 ─── N ITEM_PEDIDO
PRODUTO 1 ─── N ITEM_PEDIDO
  1. Um cliente pode possuir vários pedidos?
  2. Um pedido pode possuir vários produtos?
  3. Por que ITEM_PEDIDO existe?
  4. Qual problema aconteceria sem essa entidade intermediária?
  5. Qual relacionamento do modelo é muitos-para-muitos?
2H — Mini Desafio de Modelagem
🔴 Avançado🛠 Projeto

Uma locadora de veículos deseja controlar clientes, veículos, locações, pagamentos e multas.

  1. Liste as entidades principais.
  2. Sugira atributos importantes para cada entidade.
  3. Explique os relacionamentos.
  4. Defina possíveis cardinalidades.
  5. Descreva problemas de uma modelagem ruim.
  6. Explique como a modelagem ajuda a organizar o sistema.
2I — Desafio Final: Cursos Online
🔴 Avançado🔥 Desafio final

Uma plataforma de cursos online deseja controlar alunos, professores, cursos, módulos, aulas, matrículas, pagamentos e certificados.

  1. Identifique as entidades principais.
  2. Defina atributos importantes.
  3. Explique os relacionamentos.
  4. Defina cardinalidades prováveis.
  5. Indique onde pode existir relacionamento N:N.
  6. Explique quais tabelas intermediárias poderiam existir.
  7. Quais problemas apareceriam sem modelagem adequada?
  8. Explique por que modelagem conceitual é importante antes da implementação física do banco.
Exercícios — Capítulo 3

Modelagem Lógica e Normalização

Transformação do DER comercial em tabelas, chaves, relacionamentos e formas normais.

3A — Entidade para tabela
  1. Explique como PRODUTO, CATEGORIA, CIDADE e FORNECEDOR viram tabelas.
  2. Mostre quais atributos viram colunas.
  3. Explique por que produto precisa de id_categoria e por que id_fornecedor deve ficar em produto_fornecedor.
3B — PK e FK
  1. Liste as PKs das tabelas categoria, cidade, fornecedor, produto e produto_fornecedor.
  2. Liste as FKs de fornecedor, produto e produto_fornecedor.
  3. Explique o que aconteceria se produto.id_categoria apontasse para uma categoria inexistente.
3C — Tabela associativa
  1. Explique por que produto_fornecedor é necessária no modelo final.
  2. Por que preco_custo poderia ficar nessa tabela?
  3. Explique como N:N vira dois relacionamentos 1:N.
3D — Redundância
  1. Explique o problema de repetir o nome da categoria dentro de todos os produtos.
  2. Cite uma anomalia de atualização.
  3. Cite uma anomalia de exclusão.
3E — 1FN
  1. O que significa valor atômico?
  2. Por que fornecedores = “Tech, Alpha, Mega” viola 1FN?
  3. Como corrigir?
3F — Dependência funcional e 2FN
  1. Explique o que é dependência funcional.
  2. O que é dependência parcial?
  3. Por que nome_fornecedor não deve ficar em produto_fornecedor?
  4. Onde esse dado deve ficar?
3G — 3FN
  1. O que é dependência transitiva?
  2. Por que nome_categoria não deve ficar na tabela produto?
  3. Explique a relação produto → categoria.
3H — Desafio de refinamento lógico
  1. Monte a estrutura final com categoria, cidade, fornecedor, produto e produto_fornecedor.
  2. Indique PKs e FKs.
  3. Explique por que essa estrutura é melhor que uma tabela única.
Exercícios — Capítulo 4

SQL com MySQL

Prática com CLI, criação do banco comercial, restrições, inserção de dados, filtros, tabela associativa, JOIN e relatórios.

4A — Criação do banco
  1. Escreva o comando para criar o banco comercio.
  2. Escreva o comando para selecionar esse banco.
  3. Explique a função de SHOW DATABASES.
4B — Criação das tabelas
  1. Crie categoria e cidade.
  2. Crie fornecedor com FK opcional para cidade.
  3. Crie produto com FK para categoria.
  4. Crie produto_fornecedor com chave composta e duas FKs.
  5. Explique por que a ordem de criação importa.
4C — Inserção dos dados
  1. Insira três categorias.
  2. Insira três fornecedores.
  3. Insira três produtos respeitando a FK de categoria.
  4. Crie pelo menos três relações válidas em produto_fornecedor.
4D — SELECT, DISTINCT e LIMIT
  1. Liste todos os produtos.
  2. Mostre apenas descricao, preco e qtde.
  3. Liste os valores distintos de id_categoria usados em produto.
  4. Mostre somente os dez primeiros produtos por id_produto.
4E — WHERE e operadores
  1. Liste produtos com preço entre 10 e 30.
  2. Liste produtos das categorias 3, 7 ou 8 usando IN.
  3. Localize fornecedores sem cidade usando IS NULL.
  4. Crie uma consulta usando AND e outra usando OR.
4F — ORDER BY e LIKE
  1. Ordene os produtos pelo preço decrescente.
  2. Pesquise produtos que começam com P.
  3. Pesquise fornecedores que contenham BRASIL.
4G — UPDATE seguro
  1. Crie um produto temporário reservado para o exercício.
  2. Consulte o registro e anote seu preço.
  3. Atualize somente esse produto com UPDATE + WHERE.
  4. Consulte novamente para confirmar a mudança.
  5. Remova o registro temporário ao terminar.
  6. Explique por que praticar em um registro temporário é mais seguro que alterar um produto real da base.
  7. Explique o risco de UPDATE sem WHERE.
4H — DELETE seguro
  1. Crie um produto temporário com um ID reservado para laboratório e sem fornecedor associado.
  2. Consulte esse registro pelo ID.
  3. Remova somente o registro temporário com DELETE + WHERE.
  4. Confirme que ele desapareceu.
  5. Explique por que não devemos escolher um produto real da base apenas para praticar exclusão.
  6. Explique o risco de DELETE sem WHERE.
4I — FOREIGN KEY
  1. Tente explicar por que um produto não pode ter id_categoria inexistente.
  2. Explique o que a FK protege.
  3. Explique por que categoria deve existir antes de produto.
4J — JOIN
  1. Monte uma consulta que mostre produto e categoria.
  2. Monte uma consulta que mostre produto, categoria e fornecedor passando por produto_fornecedor.
  3. Explique por que produto não deve ser ligado diretamente a fornecedor neste modelo.
  4. Ordene o resultado pela descrição do produto.
4K — Relatórios com GROUP BY e HAVING
  1. Conte produtos por categoria.
  2. Some o estoque por categoria.
  3. Calcule preço médio por categoria.
  4. Conte produtos por fornecedor usando produto_fornecedor.
  5. Use HAVING para exibir apenas categorias com pelo menos três produtos.
4L — Restrições e integridade
  1. Explique AUTO_INCREMENT, NOT NULL, UNIQUE, DEFAULT e CHECK.
  2. Tente cadastrar um produto com preço negativo e explique o resultado esperado.
  3. Tente associar um produto a um fornecedor inexistente e explique o papel da FK.
  4. Explique a função da chave composta de produto_fornecedor.
Exercícios — Capítulo 5

Relacionamentos e JOIN

Prática progressiva para interpretar relações e construir consultas que atravessem o modelo comercial corretamente.

5A — Relacionamento ou JOIN?
  1. Explique com suas palavras a diferença entre relacionamento e JOIN.
  2. Uma FOREIGN KEY pertence à estrutura do banco ou apenas à consulta?
  3. JOIN altera fisicamente as tabelas? Justifique.
  4. Por que um banco normalizado precisa de JOIN para produzir algumas informações completas?
5B — INNER JOIN simples
  1. Crie uma consulta que mostre id_produto, descricao e nome da categoria.
  2. Explique qual coluna é FK e qual é PK na condição ON.
  3. Ordene o resultado pela descrição.
  4. Explique por que todos os produtos válidos devem encontrar uma categoria.
5C — Percorrendo o N:N
  1. Mostre produto e fornecedor usando produto_fornecedor.
  2. Desenhe o caminho entre as três tabelas.
  3. Explique por que não devemos ligar produto diretamente a fornecedor.
  4. Se um produto tiver três fornecedores, quantas linhas esse produto poderá gerar na consulta?
5D — Aliases com sentido
  1. Reescreva a consulta produto → produto_fornecedor → fornecedor usando p, pf e f.
  2. Use aliases também nos nomes das colunas exibidas.
  3. Explique quando aliases tornam a consulta mais legível e quando podem atrapalhar.
5E — LEFT JOIN: preserve fornecedores
  1. Liste todos os fornecedores e seus id_produto, mesmo quando não houver produto relacionado.
  2. Qual tabela deve ficar à esquerda?
  3. O que aparece nas colunas de produto_fornecedor quando não há correspondência?
  4. Explique por que INNER JOIN não responderia à mesma pergunta.
5F — Quem não possui correspondência?
  1. Use LEFT JOIN para listar somente fornecedores sem produtos associados.
  2. Use IS NULL no lugar correto.
  3. Explique por que NULL, nesse resultado, representa ausência de correspondência e não necessariamente um erro de cadastro.
5G — RIGHT JOIN e equivalência
  1. Crie uma consulta com RIGHT JOIN que preserve todos os fornecedores.
  2. Reescreva a mesma ideia usando LEFT JOIN e invertendo a ordem das tabelas.
  3. Compare os resultados.
  4. Qual forma você considera mais fácil de ler? Justifique.
5H — ON ou WHERE?
  1. Explique o papel de ON.
  2. Explique o papel de WHERE.
  3. Crie um INNER JOIN entre produto e categoria e filtre produtos com preço maior ou igual a 20.
  4. Explique por que filtrar uma coluna nullable da tabela direita no WHERE pode alterar o efeito de um LEFT JOIN.
5I — Quatro relações em uma consulta
  1. Mostre produto, categoria, fornecedor, cidade e estado.
  2. Use produto, categoria, produto_fornecedor, fornecedor e cidade.
  3. Use LEFT JOIN para cidade.
  4. Explique por que cidade pode aparecer como NULL na base atual.
  5. Ordene por categoria, produto e fornecedor.
5J — JOIN com GROUP BY
  1. Conte quantos produtos cada fornecedor possui.
  2. Faça com que fornecedores sem produtos também apareçam com total zero.
  3. Explique por que COUNT(pf.id_produto) é mais adequado que COUNT(*) neste relatório.
  4. Use HAVING para mostrar apenas fornecedores com zero produtos.
5K — Diagnóstico de consultas

Analise cada situação e explique o problema antes de corrigir:

  1. uma consulta tenta usar produto.id_fornecedor;
  2. duas tabelas são combinadas sem uma condição de relacionamento adequada;
  3. um LEFT JOIN é usado, mas o WHERE elimina todas as linhas em que a tabela direita ficou NULL;
  4. uma consulta com cinco tabelas usa SELECT * e retorna colunas difíceis de identificar.
5L — Desafio final: relatório comercial
  1. Monte um relatório com id do produto, descrição, preço, quantidade, categoria e fornecedor.
  2. Inclua preço_custo e prazo_entrega da tabela associativa.
  3. Inclua cidade e estado sem eliminar fornecedores que ainda não possuem cidade.
  4. Ordene por categoria, produto e fornecedor.
  5. Depois crie uma segunda consulta que mostre somente fornecedores sem produtos associados.
  6. Explique, em texto, quais JOINs você escolheu e por quê.
Exercícios — Capítulo 6

Administração e SGBD

Prática para compreender o ambiente MySQL, controlar acesso e provar que um backup pode ser recuperado.

6A — Banco, servidor ou ferramenta?
  1. Explique a diferença entre banco de dados e SGBD.
  2. Qual é a função do MySQL Server?
  3. Qual é a função do cliente mysql?
  4. O Workbench é o servidor? Justifique.
  5. O que acontece se o Workbench estiver aberto, mas o serviço do MySQL estiver parado?
6B — Serviço e conexão
  1. Localize o serviço MySQL no Windows e registre seu estado.
  2. Conecte pelo CMD usando mysql -u root -p.
  3. Execute VERSION(), CURRENT_USER() e SHOW DATABASES.
  4. Explique o que cada verificação informa.
  5. Se a conexão falhar, liste uma ordem racional de diagnóstico.
6C — CMD ou mysql>?

Classifique cada item como comando executado no CMD ou no prompt mysql>:

  1. mysql -u root -p
  2. SHOW DATABASES;
  3. CREATE USER ...;
  4. mysqldump ... > backup.sql
  5. GRANT SELECT ...;
  6. mysql comercio_teste < backup.sql

Depois explique por que misturar os dois ambientes produz erros.

6D — Menor privilégio

Uma funcionária precisa apenas consultar produtos e fornecedores do banco comercio.

  1. Quais privilégios ela precisa?
  2. Quais privilégios ela não deveria receber?
  3. Crie uma conta local para essa finalidade.
  4. Conceda somente o necessário.
  5. Confirme com SHOW GRANTS.
  6. Explique por que usar root seria uma escolha ruim.
6E — Operador de dados

Um funcionário precisa consultar, inserir e corrigir dados, mas não pode excluir registros.

  1. Crie a conta.
  2. Conceda SELECT, INSERT e UPDATE em comercio.*.
  3. Não conceda DELETE.
  4. Confirme com SHOW GRANTS.
  5. Conecte com essa conta e teste uma consulta.
  6. Explique o resultado esperado se tentar DELETE.
6F — REVOKE e ciclo de vida
  1. Explique a diferença entre REVOKE, ACCOUNT LOCK e DROP USER.
  2. Retire UPDATE de uma conta de laboratório.
  3. Confirme os privilégios restantes.
  4. Bloqueie a conta e explique quando isso seria útil.
  5. Desbloqueie-a.
  6. Em que situação seria apropriado removê-la definitivamente?
6G — Roles
  1. Explique o problema de repetir os mesmos GRANTs para dezenas de usuários.
  2. Crie uma role chamada leitura_comercio.
  3. Conceda SELECT em comercio.* à role.
  4. Conceda a role a uma conta de teste.
  5. Defina-a como role padrão.
  6. Explique a vantagem administrativa obtida.
6H — Backup lógico
  1. Explique o que é backup lógico.
  2. No CMD, gere comercio_backup.sql com mysqldump.
  3. Localize o arquivo criado.
  4. Abra-o apenas para inspeção e identifique exemplos de CREATE TABLE e INSERT.
  5. Explique por que esse arquivo não representa uma cópia completa de toda a máquina.
6I — Teste de restauração
  1. Crie comercio_teste_restore.
  2. Restaure o dump nesse banco.
  3. Execute SHOW TABLES.
  4. Compare a quantidade de produtos, fornecedores e relações produto_fornecedor com o banco original.
  5. Execute um JOIN já conhecido.
  6. Explique por que testar a restauração é parte do backup.
6J — Diagnóstico de falhas

Para cada situação, diga qual camada você investigaria primeiro:

  1. o comando mysql não é reconhecido no CMD;
  2. o cliente existe, mas não consegue conectar ao servidor local;
  3. a senha é aceita, mas o usuário não consegue executar UPDATE;
  4. uma consulta conecta, mas referencia uma tabela inexistente;
  5. o servidor não inicia depois de uma alteração de configuração.

Monte uma sequência de diagnóstico sem “tentar coisas aleatórias”.

6K — Segurança de uma aplicação

Um desenvolvedor configurou um site com a conta root e liberou acesso remoto amplo para “não dar erro”.

  1. Identifique os problemas.
  2. Explique o princípio do menor privilégio.
  3. Proponha uma conta adequada para a aplicação.
  4. Explique por que origem da conta importa.
  5. Explique por que abrir a porta do MySQL publicamente não deve ser a primeira solução.
6L — Desafio final: operação e recuperação
  1. Confirme serviço, versão e conta administrativa.
  2. Crie uma conta somente leitura para comercio.
  3. Teste SELECT e confirme que uma alteração não autorizada é bloqueada.
  4. Gere um backup lógico.
  5. Restaure em um banco separado.
  6. Valide tabelas, contagens e um JOIN.
  7. Remova apenas o banco de teste depois da validação.
  8. Escreva um relatório curto explicando: autenticação, autorização, menor privilégio, backup e restauração.
Exercícios — Capítulo 7

Transações e ACID

Prática progressiva com COMMIT, ROLLBACK, SAVEPOINT, ACID, concorrência, isolamento, bloqueios e deadlocks.

7A — O que precisa ser uma transação?
  1. Explique por que uma transferência bancária não deve ser tratada como dois UPDATEs independentes.
  2. Dê dois exemplos de processos em que várias operações precisam confirmar juntas.
  3. Em cada exemplo, diga qual seria o problema de confirmar apenas parte do processo.
7B — AUTOCOMMIT
  1. Execute SELECT @@autocommit; e interprete o resultado.
  2. Explique o que acontece normalmente após um UPDATE bem-sucedido quando autocommit está ligado.
  3. Por que um ROLLBACK executado depois não funciona como um “Ctrl+Z” universal?
7C — Primeiro ROLLBACK
  1. Consulte a quantidade de um produto.
  2. Abra uma transação.
  3. Diminua temporariamente a quantidade.
  4. Consulte novamente dentro da mesma sessão.
  5. Execute ROLLBACK.
  6. Confirme que o valor voltou ao estado anterior e explique por quê.
7D — COMMIT em uma transferência
  1. Use a tabela conta_lab.
  2. Transfira R$ 50 da conta 1 para a conta 2 dentro de uma única transação.
  3. Consulte os saldos antes do COMMIT.
  4. Confirme a transação.
  5. Explique qual diferença prática existiria se cada UPDATE fosse confirmado isoladamente.
7E — SAVEPOINT
  1. Inicie uma transação com três alterações.
  2. Crie um SAVEPOINT depois da primeira alteração.
  3. Execute mais duas alterações.
  4. Use ROLLBACK TO SAVEPOINT.
  5. Confirme o restante com COMMIT.
  6. Explique o que foi preservado e o que foi desfeito.
7F — ACID no mundo real

Para uma compra online que registra pedido, pagamento e baixa de estoque:

  1. explique a Atomicidade;
  2. explique a Consistência;
  3. explique o Isolamento;
  4. explique a Durabilidade;
  5. diga qual problema apareceria se cada propriedade fosse ignorada.
7G — Duas sessões
  1. Abra duas conexões ao MySQL.
  2. Na Sessão A, inicie uma transação e selecione um produto com FOR UPDATE.
  3. Na Sessão B, inicie outra transação e tente alterar o mesmo produto.
  4. Descreva a espera observada.
  5. Execute ROLLBACK na Sessão A para liberar o bloqueio.
  6. Assim que o UPDATE da Sessão B concluir, execute ROLLBACK nela também.
  7. Confirme que a quantidade final do produto não mudou e explique por que B estava esperando.
7H — Fenômenos de concorrência
  1. Explique com suas palavras o que é dirty read.
  2. Explique non-repeatable read.
  3. Explique phantom read.
  4. Crie um exemplo cotidiano para cada fenômeno sem copiar a definição.
7I — Níveis de isolamento
  1. Execute SELECT @@transaction_isolation;.
  2. Qual nível aparece?
  3. Coloque READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ e SERIALIZABLE em ordem do mais permissivo ao mais restritivo.
  4. Explique por que “sempre usar o nível mais forte” não é necessariamente uma decisão gratuita.
7J — FOR UPDATE no estoque

Duas pessoas tentam comprar a última unidade de um produto.

  1. Explique por que apenas fazer SELECT da quantidade e depois UPDATE pode ser arriscado.
  2. Escreva uma transação que consulte o produto com FOR UPDATE.
  3. Faça o UPDATE somente se qtde > 0.
  4. Explique quando COMMIT e ROLLBACK seriam utilizados pela aplicação.
7K — Deadlock e diagnóstico
  1. Explique a dependência circular de um deadlock.
  2. Por que uma das transações pode ser desfeita pelo InnoDB?
  3. O que a aplicação deve estar preparada para fazer?
  4. Cite quatro práticas que reduzem deadlocks ou tempo de bloqueio.
  5. Qual comando ajuda o administrador a investigar o último deadlock?
7L — Desafio final: operação confiável
  1. Crie ou restaure conta_lab com duas contas.
  2. Faça uma transferência válida e confirme com COMMIT.
  3. Faça outra transferência e cancele com ROLLBACK.
  4. Use SAVEPOINT em uma terceira operação.
  5. Abra duas sessões e demonstre um bloqueio em produto com FOR UPDATE.
  6. Consulte o nível de isolamento.
  7. Explique por que um DROP TABLE dentro de uma transação não deve ser usado como teste comum de ROLLBACK.
  8. Produza um relatório curto relacionando o laboratório às quatro propriedades ACID.
Exercícios — Capítulo 8

SQL Avançado

Prática progressiva para compor consultas, reutilizar resultados, analisar dados e compreender recursos armazenados do MySQL.

8A — Subconsulta escalar
  1. Calcule o preço médio dos produtos.
  2. Use esse SELECT dentro de outra consulta.
  3. Liste somente produtos acima da média.
  4. Ordene do maior para o menor preço.
  5. Explique por que a subconsulta precisa retornar um único valor nesse caso.
8B — IN, EXISTS e NOT EXISTS
  1. Use IN com uma subconsulta para listar produtos pertencentes a categorias selecionadas por outro SELECT.
  2. Liste fornecedores que possuem pelo menos um produto associado usando EXISTS.
  3. Liste fornecedores sem produtos usando NOT EXISTS.
  4. Explique o papel da correlação entre fornecedor e produto_fornecedor.
  5. Compare conceitualmente NOT EXISTS com LEFT JOIN + IS NULL.
8C — JOIN ou subconsulta?

Escolha a abordagem inicial e justifique:

  1. mostrar produto e nome da categoria;
  2. mostrar produtos acima do preço médio;
  3. descobrir fornecedores sem produtos;
  4. mostrar produto, fornecedor e preço de custo;
  5. descobrir se existe pelo menos um produto em cada fornecedor.

Não basta escolher: explique o raciocínio.

8D — UNION e UNION ALL
  1. Crie uma lista única com nomes de categorias e fornecedores, acrescentando uma coluna tipo.
  2. Execute primeiro com UNION ALL.
  3. Depois troque por UNION.
  4. Explique a diferença entre preservar e eliminar duplicidades.
  5. Explique por que as duas consultas precisam retornar colunas compatíveis.
8E — CTE para organizar etapas
  1. Crie uma CTE chamada estoque_baixo com produtos cuja quantidade seja menor ou igual ao estoque mínimo.
  2. Consulte a CTE ordenando por quantidade.
  3. Depois crie uma segunda CTE que relacione esses produtos com categoria.
  4. Explique por que a CTE não é uma tabela permanente.
8F — GROUP BY ou função de janela?
  1. Use GROUP BY para mostrar a média de preço por categoria.
  2. Depois use AVG(preco) OVER(PARTITION BY ...) para mostrar cada produto junto da média da própria categoria.
  3. Compare a quantidade de linhas dos dois resultados.
  4. Explique a diferença conceitual entre resumir e calcular sem perder detalhes.
8G — Ranking por categoria
  1. Use ROW_NUMBER para numerar produtos por categoria do maior para o menor preço.
  2. Troque ROW_NUMBER por RANK e observe o comportamento caso existam empates.
  3. Use uma CTE para exibir somente as três primeiras posições de cada categoria.
  4. Explique o papel de PARTITION BY e ORDER BY dentro de OVER.
8H — VIEW reutilizável
  1. Crie uma view com produto, preço, quantidade e categoria.
  2. Consulte a view filtrando produtos acima de determinado preço.
  3. Ordene o resultado.
  4. Explique onde os dados realmente continuam armazenados.
  5. Explique uma vantagem e um cuidado no uso de views.
8I — Índice e EXPLAIN
  1. Execute EXPLAIN em uma consulta que filtre produto pela descrição.
  2. Registre possible_keys, key e rows.
  3. Crie um índice de laboratório sobre descricao.
  4. Execute EXPLAIN novamente.
  5. Compare os planos.
  6. Explique por que uma tabela pequena pode não demonstrar grande diferença.
  7. Explique por que criar índices demais também tem custo.
8J — Trigger de auditoria
  1. Crie a tabela auditoria_preco apresentada no capítulo.
  2. Crie o trigger AFTER UPDATE para registrar mudanças de preço.
  3. Escolha um produto e anote o preço atual.
  4. Altere o preço conscientemente.
  5. Consulte auditoria_preco.
  6. Restaure o preço original.
  7. Explique OLD, NEW e por que triggers devem ser documentados.
8K — Procedure e function
  1. Crie a procedure sp_produtos_por_categoria com parâmetro de entrada.
  2. Execute-a para duas categorias diferentes.
  3. Crie a function fn_status_estoque.
  4. Use a function em um SELECT de produtos.
  5. Explique a diferença entre chamar uma procedure com CALL e usar uma function dentro de uma expressão.
8L — Desafio final: painel analítico
  1. Mostre produtos acima da média de preço.
  2. Mostre fornecedores sem produtos.
  3. Crie uma CTE de estoque baixo.
  4. Crie um ranking de preço por categoria.
  5. Use uma view para simplificar pelo menos uma consulta.
  6. Analise uma consulta com EXPLAIN.
  7. Use a função de status de estoque.
  8. Escreva um pequeno relatório explicando qual recurso resolveu cada parte e por que você o escolheu.
Exercícios — Capítulo 9

Projeto Integrador

Da análise do problema à implementação, validação, segurança e conexão com uma aplicação.

9A — Problema e requisitos
  1. Leia o cenário da loja e liste os problemas que o banco precisa resolver.
  2. Separe requisitos de cadastro, operação, consulta e segurança.
  3. Explique por que “calcular total do pedido” é um requisito e não necessariamente uma coluna.
  4. Acrescente dois requisitos coerentes sem alterar o objetivo do sistema.
9B — Regras de negócio e cardinalidade
  1. Escreva as regras entre CLIENTE e PEDIDO.
  2. Escreva as regras entre CATEGORIA e PRODUTO.
  3. Explique o N:N entre PEDIDO e PRODUTO.
  4. Represente as cardinalidades mínima e máxima.
  5. Diga quais regras podem ser garantidas diretamente por PK, FK ou CHECK e quais dependem também da aplicação/transação.
9C — DER conceitual
  1. Desenhe CLIENTE, PEDIDO, PRODUTO e CATEGORIA.
  2. Resolva o N:N com ITEM_PEDIDO.
  3. Inclua quantidade e preco_unitario no lugar correto.
  4. Explique por que preço da venda não deve ser apenas o preço atual de PRODUTO.
  5. Revise o DER confrontando-o com cada regra de negócio.
9D — Modelo lógico
  1. Transforme o DER em tabelas.
  2. Defina todas as PKs.
  3. Defina todas as FKs.
  4. Use chave composta em ITEM_PEDIDO.
  5. Explique de que depende quantidade e preco_unitario.
  6. Indique tipos de dados adequados para os principais atributos.
9E — Normalização
  1. Parta de uma planilha que misture pedido, cliente, produto e categoria.
  2. Identifique redundâncias.
  3. Explique a 1FN no cenário.
  4. Explique a 2FN considerando a chave composta de ITEM_PEDIDO.
  5. Explique como CLIENTE e CATEGORIA separados ajudam a atingir a 3FN.
  6. Cite duas anomalias evitadas pela normalização.
9F — Implementação física
  1. Crie o banco loja_integrador.
  2. Crie as cinco tabelas na ordem correta.
  3. Inclua NOT NULL, UNIQUE, DEFAULT e CHECK onde fizer sentido.
  4. Crie todas as FKs.
  5. Use DESCRIBE e SHOW CREATE TABLE para conferir a estrutura.
  6. Explique por que a ordem de criação das tabelas importa.
9G — Dados e integridade
  1. Insira os dados de teste do capítulo.
  2. Tente cadastrar produto com categoria inexistente e observe a FK.
  3. Tente inserir estoque negativo e observe o CHECK.
  4. Tente repetir um e-mail já cadastrado.
  5. Tente inserir item com quantidade zero.
  6. Explique o que cada teste prova sobre a integridade do modelo.
9H — Consultas e relatórios
  1. Monte o relatório completo de pedido com cliente, produto, quantidade, preço e subtotal.
  2. Calcule o total por pedido.
  3. Mostre somente pedidos pagos.
  4. Liste produtos nunca vendidos.
  5. Calcule quanto cada cliente comprou em pedidos pagos.
  6. Crie um ranking de clientes por valor comprado.
9I — Venda segura com transação
  1. Descreva quais operações pertencem à mesma venda.
  2. Use START TRANSACTION e FOR UPDATE para reservar o produto.
  3. Crie o pedido e capture LAST_INSERT_ID().
  4. Insira o item usando o preço atual do produto como preço histórico da venda.
  5. Baixe estoque somente se houver quantidade suficiente.
  6. Explique quando a aplicação deve executar COMMIT ou ROLLBACK.
9J — View, índice e EXPLAIN
  1. Crie vw_resumo_pedido.
  2. Consulte apenas pedidos pagos pela view.
  3. Execute EXPLAIN em uma consulta por período.
  4. Crie idx_pedido_data.
  5. Execute EXPLAIN novamente.
  6. Explique por que uma base pequena pode não mostrar ganho visível.
  7. Explique por que índice deve nascer de uma necessidade e não de hábito.
9K — Aplicação e segurança
  1. Desenhe o caminho Usuário → Aplicação/API → Driver → MySQL.
  2. Explique por que o usuário final não deve acessar o MySQL diretamente.
  3. Explique por que a aplicação não deve usar root.
  4. Mostre a diferença entre concatenar entrada do usuário e usar um placeholder ?.
  5. Explique como consultas parametrizadas reduzem risco de SQL injection.
  6. Liste cuidados com credenciais da aplicação.
9L — Entrega final do projeto
  1. Entregue problema, requisitos e regras de negócio.
  2. Entregue DER conceitual e modelo lógico.
  3. Justifique a normalização.
  4. Entregue script de criação e dados de teste.
  5. Entregue consultas e relatórios.
  6. Demonstre uma venda com COMMIT e uma falha com ROLLBACK.
  7. Documente usuário/permissões, backup e restauração.
  8. Descreva a conexão futura com uma aplicação.
  9. Faça uma revisão crítica apontando pelo menos três decisões de projeto e por que foram tomadas.
Exercícios — Capítulo 10

Visão Moderna de Dados

Exercícios de decisão arquitetural para escolher tecnologias de dados conforme requisitos reais.

10A — Relacional ainda faz sentido?

Para cada cenário, diga se um banco relacional seria uma boa escolha inicial e justifique:

  1. sistema de folha de pagamento;
  2. pedidos e estoque de uma loja;
  3. cache de sessões;
  4. rede social focada em conexões entre pessoas;
  5. catálogo com milhares de tipos de produtos e atributos muito diferentes.
10B — Modelos NoSQL
  1. Explique documento, chave-valor, colunas amplas e grafo sem usar apenas definições decoradas.
  2. Dê um exemplo de uso para cada modelo.
  3. Explique por que NoSQL não significa ausência de modelagem.
  4. Escolha um cenário em que o relacional ainda seria preferível.
10C — Relacional ou documento?

Uma loja possui produtos de informática, roupas e alimentos, cada grupo com atributos muito diferentes.

  1. Proponha uma solução totalmente relacional.
  2. Proponha uma solução com documentos.
  3. Proponha uma solução híbrida usando colunas relacionais + JSON.
  4. Compare integridade, flexibilidade e consultas.
  5. Escolha uma opção e justifique.
10D — Escala e distribuição
  1. Explique escala vertical e horizontal.
  2. Explique replicação.
  3. Explique particionamento/sharding.
  4. Explique cache.
  5. Diga qual problema cada técnica tenta resolver.
  6. Explique por que distribuir um sistema pequeno sem necessidade pode piorá-lo.
10E — Disponibilidade não é backup

Uma empresa possui duas réplicas do banco em servidores diferentes e afirma: “não precisamos mais de backup”.

  1. Explique o erro.
  2. Dê um exemplo de falha em que a réplica ajuda.
  3. Dê um exemplo de falha em que a exclusão pode ser replicada.
  4. Proponha uma estratégia mínima de disponibilidade e recuperação.
10F — Banco em nuvem
  1. Explique o que significa banco gerenciado.
  2. Liste tarefas que o provedor pode automatizar.
  3. Liste responsabilidades que continuam com a equipe.
  4. Explique região, multi-zona, backup e restauração.
  5. Por que custo também deve entrar na decisão arquitetural?
10G — API e banco
  1. Desenhe Cliente → API → Banco.
  2. Explique a função de cada camada.
  3. Explique por que um app móvel não deve receber a senha do banco.
  4. Liste três regras que podem ser aplicadas na API.
  5. Explique a diferença entre API e SQL.
10H — OLTP ou analytics?

Classifique as necessidades:

  1. registrar uma venda;
  2. baixar estoque;
  3. analisar cinco anos de vendas por região;
  4. calcular tendências em bilhões de eventos;
  5. consultar o saldo atual de uma conta;
  6. gerar um painel histórico para direção.

Depois explique por que a mesma arquitetura não precisa resolver todos os casos.

10I — Warehouse, lake e lakehouse
  1. Explique a ideia inicial de data warehouse.
  2. Explique data lake.
  3. Explique lakehouse.
  4. Dê um exemplo de fonte estruturada e uma não estruturada.
  5. Explique por que uma pequena empresa não precisa adotar Big Data apenas porque coleta dados.
10J — IA, embeddings e RAG
  1. Explique o que é um embedding em linguagem simples.
  2. Explique busca por similaridade.
  3. Desenhe o fluxo básico de RAG.
  4. Explique a função do vector store e a função do modelo de linguagem.
  5. Por que o banco transacional de pedidos não precisa ser substituído por um banco vetorial?
  6. Explique por que qualidade e permissão dos documentos continuam importantes.
10K — Escolha arquitetural

Proponha uma arquitetura inicial para cada caso e justifique:

  1. loja de bairro;
  2. site global com sessões temporárias;
  3. detecção de fraude baseada em relacionamentos;
  4. plataforma IoT com milhões de eventos;
  5. assistente de IA que consulta manuais internos.

Você pode combinar tecnologias quando houver motivo claro.

10L — Desafio final: decisão consciente

Escolha um sistema real ou inventado e produza uma proposta de arquitetura de dados.

  1. descreva o problema;
  2. identifique dados e padrões de acesso;
  3. defina necessidades de integridade e transação;
  4. estime volume e crescimento;
  5. defina disponibilidade e recuperação;
  6. escolha uma ou mais tecnologias;
  7. justifique por que não escolheu alternativas mais complexas;
  8. explique segurança, privacidade e governança;
  9. desenhe o fluxo Aplicação/API → Dados;
  10. escreva três critérios que fariam você revisar essa arquitetura no futuro.
10M — Transferência MbB: Conecta

Sem alterar o banco comercio, use uma pequena parte da Assistência Técnica Conecta para transferir o raciocínio de modelagem aprendido neste módulo.

  1. Considere inicialmente três entidades: CLIENTE, EQUIPAMENTO e ORDEM_SERVICO.
  2. Defina os atributos essenciais de cada entidade sem copiar campos desnecessários.
  3. Defina as cardinalidades entre cliente, equipamento e ordem de serviço e justifique cada uma.
  4. Transforme o recorte em um modelo lógico indicando chaves primárias e chaves estrangeiras.
  5. Explique quais regras deveriam ser garantidas pelo banco e quais pertencem melhor à aplicação.
  6. Compare esse recorte com o modelo comercio: identifique pelo menos uma ideia que se repete e uma que muda por causa do domínio.

Importante: esta é uma atividade de transferência. Não substitua, não apague e não recrie o banco comercio; faça o exercício em papel, diagrama ou arquivo separado.