O que são bancos de dados: SQL vs NoSQL explicado
Entenda a diferença entre SQL e NoSQL, quando usar cada um e como Python se conecta a bancos de dados.
O que é um banco de dados?
Pense em uma planilha do Excel com superpoderes. Uma planilha funciona bem para centenas de linhas, mas e quando você precisa armazenar milhões de registros, permitir que várias pessoas acessem ao mesmo tempo e garantir que nenhum dado se perca? É aí que entram os bancos de dados.
Um banco de dados é um sistema organizado para armazenar, consultar e manipular dados de forma eficiente e segura. Ele resolve problemas que planilhas não conseguem:
- Concorrência — vários usuários acessam e modificam dados ao mesmo tempo sem conflito.
- Integridade — regras garantem que os dados permaneçam consistentes (por exemplo, impedir que um pedido referencie um cliente que não existe).
- Performance — índices e otimizações permitem consultas rápidas mesmo em tabelas com milhões de registros.
- Segurança — controle de acesso define quem pode ler, escrever ou deletar dados.
SQL vs NoSQL: as duas grandes famílias
Bancos de dados se dividem em dois grandes grupos: SQL (relacionais) e NoSQL (não relacionais). Cada um tem uma filosofia diferente para organizar e acessar dados.
Bancos SQL (relacionais)
Bancos SQL organizam dados em tabelas com linhas e colunas, como uma planilha bem estruturada. Cada tabela tem um esquema fixo que define quais colunas existem e que tipo de dado cada uma aceita. As tabelas podem se relacionar entre si usando chaves estrangeiras.
A linguagem SQL (Structured Query Language) é usada para criar tabelas, inserir dados e fazer consultas. Ela é padronizada, então o que você aprende em um banco funciona em outros com poucas diferenças.
Bancos NoSQL (não relacionais)
Bancos NoSQL não usam tabelas fixas. Em vez disso, oferecem modelos flexíveis como documentos JSON, pares chave-valor, grafos ou colunas largas. O esquema é dinâmico — você pode inserir documentos com estruturas diferentes na mesma coleção sem problemas.
Comparação direta
| Característica | SQL | NoSQL |
|---|---|---|
| Estrutura | Tabelas com colunas fixas | Documentos, chave-valor, grafos |
| Esquema | Rígido (definido antes) | Flexível (dinâmico) |
| Linguagem | SQL padronizado | Varia por banco |
| Relações | JOINs entre tabelas | Dados aninhados/embutidos |
| Escalabilidade | Vertical (servidor maior) | Horizontal (mais servidores) |
| Transações | ACID completo | Eventual consistency (geralmente) |
| Melhor para | Dados estruturados, financeiro | Dados flexíveis, tempo real |
Quando usar cada um?
A escolha entre SQL e NoSQL depende do problema que você está resolvendo. Não existe "melhor" — existe o mais adequado para o contexto.
Use SQL quando:
- Os dados têm estrutura bem definida que não muda com frequência (cadastro de clientes, produtos, pedidos).
- Você precisa de relacionamentos entre entidades (cliente → pedidos → itens).
- Integridade transacional é crítica (sistemas financeiros, estoque).
- Você precisa fazer consultas complexas com JOINs, agregações e subconsultas.
Use NoSQL quando:
- A estrutura dos dados varia entre registros (logs, conteúdo gerado por usuários).
- Você precisa de alta velocidade de leitura/escrita com dados simples (cache, sessões).
- O volume de dados cresce rápido e precisa de escalabilidade horizontal.
- Os dados são naturalmente hierárquicos ou aninhados (catálogo de produtos com atributos variáveis).
Bancos de dados populares
Existem dezenas de bancos de dados, mas alguns dominam o mercado. Aqui estão os mais usados com Python:
SQL (relacionais)
- SQLite — banco embutido em um único arquivo. Já vem com o Python, sem necessidade de instalar nada. Perfeito para protótipos, apps pequenos e testes.
- PostgreSQL — o mais robusto e completo dos bancos open source. Suporta tipos avançados (JSON, arrays), extensões e é excelente para produção.
- MySQL — um dos mais populares do mundo, amplamente usado em aplicações web. Simples de configurar e com grande comunidade.
NoSQL
- MongoDB — banco orientado a documentos (JSON/BSON). Flexível, escalável e muito usado em aplicações web modernas.
- Redis — banco em memória do tipo chave-valor. Extremamente rápido, usado para cache, sessões e filas.
Como Python se conecta a bancos de dados
Python se conecta a bancos de dados de duas formas principais:
1. Drivers nativos
Cada banco tem uma biblioteca (driver) que permite conectar e executar comandos diretamente. Você escreve SQL ou comandos do banco e recebe os resultados como tuplas ou dicionários Python.
| Banco | Biblioteca | Instalação |
|---|---|---|
| SQLite | sqlite3 | Já vem com Python |
| PostgreSQL | psycopg2 | pip install psycopg2 |
| MySQL | mysql-connector | pip install mysql-connector-python |
| MongoDB | pymongo | pip install pymongo |
| Redis | redis | pip install redis |
2. ORMs (Object-Relational Mappers)
ORMs permitem trabalhar com bancos de dados usando classes e objetos Python em vez de escrever SQL diretamente. Os mais populares são:
- SQLAlchemy — o ORM mais completo e flexível do ecossistema Python. Funciona com qualquer banco SQL.
- Django ORM — integrado ao framework Django. Prático e poderoso, mas restrito a projetos Django.
ORMs aceleram o desenvolvimento e protegem contra SQL injection, mas entender SQL continua sendo essencial para otimizar consultas e resolver problemas.
Primeiro contato: SQLite com Python
O sqlite3 já vem instalado com o Python, então você pode começar a usar bancos de dados agora mesmo, sem instalar nada. Vamos criar um banco, uma tabela e inserir alguns dados:
import sqlite3
# Conectar ao banco (cria o arquivo se nao existir)
conexao = sqlite3.connect("meu_banco.db")
cursor = conexao.cursor()
# Criar uma tabela
cursor.execute("""
CREATE TABLE IF NOT EXISTS contatos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
email TEXT UNIQUE,
telefone TEXT
)
""")
# Inserir dados (usando ? para evitar SQL injection)
contatos = [
("Maria Silva", "maria@email.com", "11999990001"),
("Joao Santos", "joao@email.com", "21988880002"),
("Ana Costa", "ana@email.com", "31977770003"),
]
cursor.executemany(
"INSERT OR IGNORE INTO contatos (nome, email, telefone) VALUES (?, ?, ?)",
contatos
)
conexao.commit()
# Consultar dados
cursor.execute("SELECT nome, email FROM contatos")
for linha in cursor.fetchall():
print(f"{linha[0]} - {linha[1]}")
# Fechar conexao
conexao.close()
A saída será:
Maria Silva - maria@email.com
Joao Santos - joao@email.com
Ana Costa - ana@email.com
Observe que usamos ? como placeholder para os valores. Isso é chamado de consulta parametrizada e é fundamental para evitar SQL injection — nunca monte queries concatenando strings diretamente.
Conceitos fundamentais que você vai encontrar
Antes de mergulhar nos próximos artigos da série, vale conhecer alguns termos que aparecem o tempo todo:
- CRUD — Create, Read, Update, Delete. As quatro operações básicas em qualquer banco de dados.
- Schema — a estrutura do banco (tabelas, colunas, tipos de dados, relações).
- Query — uma consulta ou comando enviado ao banco.
- Índice — uma estrutura que acelera buscas em colunas específicas (como o índice de um livro).
- Transação — um conjunto de operações que deve ser executado por completo ou revertido inteiramente.
- Migration — alterações na estrutura do banco aplicadas de forma controlada e versionada.
Próximos passos
Agora que você entende o panorama geral dos bancos de dados, está pronto para colocar a mão na massa. Nos próximos artigos da série, vamos explorar SQL com Python usando SQLite, conectar ao MongoDB com PyMongo e usar o SQLAlchemy como ORM. Cada artigo traz exemplos práticos que você pode rodar no seu computador e adaptar para seus projetos.