Introdução a Bancos de Dados
Toda aplicação backend precisa persistir dados. Nesta aula, vamos entender os tipos de bancos de dados e quando usar cada um.
SQL vs NoSQL
Bancos SQL (Relacionais)
- Estrutura: Tabelas com linhas e colunas
- Schema: Fixo e definido previamente
- Relacionamentos: Foreign keys, JOINs
- Exemplos: PostgreSQL, MySQL, SQLite
sql
-- Estrutura rígidaCREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW());Bancos NoSQL
- Estrutura: Documentos, chave-valor, grafos
- Schema: Flexível
- Exemplos: MongoDB, Redis, Neo4j
javascript
// Documento MongoDB (flexível){ _id: ObjectId("..."), name: "João", email: "joao@email.com", address: { city: "São Paulo", country: "BR" }, // Aninhado tags: ["premium", "active"] // Array}Quando usar cada um?
| Use SQL quando | Use NoSQL quando |
|---|---|
| Dados estruturados e relacionados | Dados semi-estruturados |
| Transações ACID importantes | Alta escalabilidade horizontal |
| Queries complexas com JOINs | Schema muda frequentemente |
| E-commerce, finanças, ERP | Logs, analytics, cache, CMS |
Por que PostgreSQL?
Para nosso projeto e-commerce, usaremos PostgreSQL:
- ✅ ACID compliance (transações seguras)
- ✅ Suporte a JSON (flexibilidade quando necessário)
- ✅ Full-text search
- ✅ Extensões poderosas (PostGIS, etc)
- ✅ Performance excelente
- ✅ Gratuito e open source
Instalando PostgreSQL com Docker
yaml
# docker-compose.ymlversion: '3.8' services: postgres: image: postgres:16 container_name: ecommerce-postgres environment: POSTGRES_USER: ecommerce POSTGRES_PASSWORD: secret123 POSTGRES_DB: ecommerce_db ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data volumes: postgres_data:bash
# Iniciar o bancodocker-compose up -d # Verificar se está rodandodocker-compose psConceitos SQL Essenciais
Tabelas e Relacionamentos
sql
-- Tabela de usuáriosCREATE TABLE users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email VARCHAR(255) UNIQUE NOT NULL, name VARCHAR(100) NOT NULL, password VARCHAR(255) NOT NULL, role VARCHAR(20) DEFAULT 'user', created_at TIMESTAMP DEFAULT NOW()); -- Tabela de pedidos (relacionada a users)CREATE TABLE orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID REFERENCES users(id) ON DELETE CASCADE, total DECIMAL(10,2) NOT NULL, status VARCHAR(20) DEFAULT 'pending', created_at TIMESTAMP DEFAULT NOW());Tipos de Relacionamentos
1:1 (Um para Um)
user ←→ profile
1:N (Um para Muitos)
user ←→ orders
N:N (Muitos para Muitos)
products ←→ categories (via tabela intermediária)
Operações CRUD
sql
-- CreateINSERT INTO users (email, name, password)VALUES ('joao@email.com', 'João', 'hash123'); -- ReadSELECT * FROM users WHERE email = 'joao@email.com';SELECT u.name, COUNT(o.id) as total_ordersFROM users uLEFT JOIN orders o ON u.id = o.user_idGROUP BY u.id; -- UpdateUPDATE users SET name = 'João Silva' WHERE id = '...'; -- DeleteDELETE FROM users WHERE id = '...';Por que usar um ORM?
Escrever SQL manualmente é verboso e propenso a erros:
typescript
// ❌ SQL manual - difícil manutençãoconst result = await db.query( 'SELECT * FROM users WHERE email = $1', [email]); // ✅ Com ORM (Prisma) - tipado e seguroconst user = await prisma.user.findUnique({ where: { email }});Vantagens de um ORM
- Type Safety: Tipos gerados automaticamente
- Migrations: Versionamento do schema
- Relacionamentos: Carregados automaticamente
- SQL Injection: Proteção automática
- Produtividade: Menos código boilerplate
Próximos Passos
Na próxima aula, vamos configurar o Prisma ORM e criar nossos primeiros modelos de dados!
Resumo
- ✅ Diferenças entre SQL e NoSQL
- ✅ PostgreSQL como escolha para e-commerce
- ✅ Docker para ambiente de desenvolvimento
- ✅ Conceitos SQL: tabelas, relacionamentos, CRUD
- ✅ Por que usar um ORM
Próxima aula: Prisma ORM - Setup e Modelos! 🔷