🧰 CAPÍTULO 00: KIT DE SOBREVIVÊNCIA — BANCO DE DADOS


📖 Pré-requisito

Este capítulo assume que você já passou pelo Capítulo 00 — Fundamentos Comuns (terminal, Git, POO em Python, JSON/HTTP). Se ainda não viu, comece por lá.

🎯 Objetivos de Aprendizagem

Estimativa de dedicação: 2 horas de estudo autoguiado. Ao final deste capítulo, você será capaz de:

  • 🔹 Ler e escrever SELECT/INSERT básicos — o suficiente para acompanhar as Atividades 02 a 04, antes de o DDL/DML formal chegar na Atividade 05.
  • 🔹 Ler a notação Crow's Foot (pé de galinha) usada em todos os diagramas ER do curso.
  • 🔹 Subir e derrubar seu primeiro container Docker com um banco de dados.

🏢 Por que isso importa

A Atividade 01 já pede para você subir um banco via Docker, e as Atividades 02 a 04 já usam CREATE TABLE/INSERT/SELECT em exemplos e scripts de seed — três semanas antes de a Atividade 05 ensinar DDL formalmente. Este capítulo adianta o básico para você acompanhar sem travar.


🧠 1. SQL de Leitura em 15 Minutos

SQL é a linguagem para conversar com um banco relacional. Três comandos resolvem 80% do que você vai precisar nas primeiras semanas:

💻 Exemplo Completo

-- 1. Criar a estrutura (tabela) que vai guardar os dados
CREATE TABLE produto (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100) NOT NULL,
    preco DECIMAL(10,2) NOT NULL
);

-- 2. Inserir dados
INSERT INTO produto (nome, preco) VALUES ('Notebook TecPro X1', 3500.00);
INSERT INTO produto (nome, preco) VALUES ('Mouse Sem Fio', 89.90);

-- 3. Consultar dados
SELECT nome, preco FROM produto WHERE preco > 100;

🖥️ Resultado da Consulta

+----------------------+---------+
| nome                 | preco   |
+----------------------+---------+
| Notebook TecPro X1   | 3500.00 |
+----------------------+---------+

🔍 Detalhamento do Código:

  • CREATE TABLE: define o "molde" — nome da tabela e, entre parênteses, cada coluna com seu tipo (INT, VARCHAR(100), DECIMAL(10,2)).
  • PRIMARY KEY AUTO_INCREMENT: identificador único da linha, gerado automaticamente pelo banco.
  • INSERT INTO tabela (colunas) VALUES (...): adiciona uma linha nova.
  • SELECT colunas FROM tabela WHERE condição: recupera linhas que satisfazem a condição — aqui, só produtos com preço acima de 100 (por isso o "Mouse Sem Fio", 89.90, não aparece no resultado).

💡 Onde isso aparece de novo

Esse mesmo trio (CREATE TABLE / INSERT / SELECT) é reaproveitado em praticamente todo mini-projeto SQLAlchemy dos 20 capítulos teóricos — a diferença é que lá o SQL fica "escondido" atrás de classes Python.


🧠 2. Notação ER / Crow's Foot Ilustrada

Todos os diagramas de entidade-relacionamento do curso (a partir da Atividade 02) usam a notação Crow's Foot ("pé de galinha") para representar cardinalidade — quantas linhas de uma tabela se relacionam com quantas linhas de outra.

SímboloNomeSignificado
||Um, exatamenteExatamente 1
o|Zero ou um0 ou 1
o{Zero ou muitos0, 1 ou mais
|{Um ou muitos1 ou mais

💻 Exemplo em Mermaid erDiagram

erDiagram
    CLIENTE ||--o{ PEDIDO : realiza
    PEDIDO ||--|{ ITEM_PEDIDO : contém
    PRODUTO ||--o{ ITEM_PEDIDO : "está em"

🔍 Detalhamento do Diagrama:

  • CLIENTE ||--o{ PEDIDO: 1 Cliente (||) pode realizar 0 ou muitos Pedidos (o{) — mas todo Pedido pertence a exatamente 1 Cliente.
  • PEDIDO ||--|{ ITEM_PEDIDO: 1 Pedido tem 1 ou muitos Itens (|{) — um pedido sem nenhum item não faz sentido no negócio.
  • O lado com || ou o| (uma "barra") lê-se "um"; o lado com { (um "pé de galinha" aberto) lê-se "muitos".

🎯 Ferramenta oficial de modelagem

Para desenhar seus próprios diagramas ER, o curso usa o draw.io. O erDiagram do Mermaid acima é só para você aprender a ler rápido, direto no navegador — sem precisar abrir outra ferramenta.


🧠 3. Docker: Seu Primeiro Container

Um container é um "computador isolado dentro do seu computador", já com o banco de dados instalado e configurado — evita instalar MySQL/PostgreSQL direto no seu sistema operacional.

flowchart LR
    A["💻 Seu computador"] -->|"docker run"| B["📦 Container PostgreSQL"]
    B -->|"porta 5432"| C["🔌 Cliente SQL (pgAdmin / DBeaver)"]

    style B fill:#e3f2fd,stroke:#1e88e5

💻 Comandos Essenciais

# 1. Baixa a imagem e sobe um container PostgreSQL 17
docker run --name tecpro-postgres -e POSTGRES_PASSWORD=tecpro123 -p 5432:5432 -d postgres:17

# 2. Confere se o container está rodando
docker ps

# 3. Para o container quando terminar de usar
docker stop tecpro-postgres

🔍 Detalhamento do Comando:

  • --name tecpro-postgres: dá um nome amigável ao container (em vez de um ID aleatório).
  • -e POSTGRES_PASSWORD=tecpro123: variável de ambiente — a senha do usuário postgres dentro do container.
  • -p 5432:5432: mapeia a porta 5432 do container para a porta 5432 da sua máquina (host:container) — é assim que o pgAdmin/DBeaver consegue se conectar.
  • -d: roda o container em segundo plano (detached), sem travar o terminal.

⚠️ Erro clássico

Se docker run falhar com "port is already allocated", outro processo (talvez um PostgreSQL instalado direto no Windows) já está usando a porta 5432. Mude o mapeamento para -p 5433:5432 e conecte seu cliente SQL na porta 5433.


💡 Checkpoint de Lógica

Importante

Reflexão Profissional: Por que a notação Crow's Foot marca dois números em cada lado do relacionamento (ex: || de um lado e o{ do outro) em vez de só um? (Resposta: porque a cardinalidade real de um relacionamento sempre tem um mínimo e um máximo de cada lado — "um Pedido pertence a exatamente 1 Cliente" (mínimo=máximo=1) é uma regra de negócio diferente de "um Cliente tem 0 ou muitos Pedidos" (mínimo=0), e o diagrama precisa capturar as duas coisas para o mapeamento para tabelas na Atividade 03 funcionar sem ambiguidade.) 🧠🛡️


🧪 Quiz de Fixação e Autoavaliação

🧪 Quiz de Autoavaliação — Capítulo 00 (Banco de Dados)

1. No comando SELECT nome, preco FROM produto WHERE preco > 100;, o que a cláusula WHERE faz?

  • A) Cria a tabela produto.
  • B) Ordena os resultados por preço.
  • C) Filtra apenas as linhas que satisfazem a condição informada.
  • D) Insere uma nova linha na tabela.
💡 Ver Resposta e Justificativa

Resposta Correta: C
Justificativa: WHERE filtra linhas antes de retorná-las — só as que atendem à condição (preco > 100) aparecem no resultado.


2. Em CLIENTE ||--o{ PEDIDO, o que o símbolo o{ do lado de PEDIDO significa?

  • A) Exatamente 1 Pedido.
  • B) Zero ou muitos Pedidos.
  • C) Um ou muitos Pedidos, nunca zero.
  • D) O Pedido é opcional para o sistema existir.
💡 Ver Resposta e Justificativa

Resposta Correta: B
Justificativa: O "pé de galinha" aberto ({) combinado com o círculo (o) significa "zero ou muitos" — um Cliente pode existir sem nenhum Pedido ainda.


3. No comando docker run ... -p 5432:5432 -d postgres:17, para que serve o -p 5432:5432?

  • A) Define a senha do banco.
  • B) Mapeia a porta do container para uma porta acessível no seu computador.
  • C) Define o nome do container.
  • D) Roda o container em segundo plano.
💡 Ver Resposta e Justificativa

Resposta Correta: B
Justificativa: -p host:container conecta a porta interna do container a uma porta da sua máquina — sem isso, ferramentas como pgAdmin não conseguiriam alcançar o banco.


🛠️ Ponte para a Ação

🎯 Próximo Passo


📌 Resumo Executivo & Key Takeaways

  • SQL: CREATE TABLE define a estrutura, INSERT adiciona dados, SELECT ... WHERE recupera e filtra.
  • Crow's Foot: cada lado de um relacionamento tem um mínimo e um máximo — || é "exatamente 1", o{ é "zero ou muitos".
  • Docker: docker run -p host:container -d imagem sobe um banco isolado em segundo plano; docker ps confere, docker stop derruba.