PostgreSQL
PostgreSQL é um sistema de gerenciamento de banco de dados relacional (RDBMS) de código aberto e orientado a objetos. É conhecido por sua robustez, escalabilidade e conformidade com padrões SQL, tornando-o uma escolha popular para aplicações empresariais e projetos que exigem confiabilidade e integridade de dados.
Características Principais
1. Conformidade com ACID
PostgreSQL é totalmente compatível com as propriedades ACID (Atomicidade, Consistência, Isolamento e Durabilidade), garantindo que as transações sejam processadas de forma confiável e que os dados permaneçam consistentes mesmo em caso de falhas.
2. Tipos de Dados Avançados
O PostgreSQL suporta uma ampla variedade de tipos de dados, incluindo:
- Tipos primitivos (inteiros, numéricos, strings, booleanos)
- Tipos estruturados (data/hora, arrays, JSON, XML)
- Tipos geométricos (pontos, linhas, polígonos)
- Tipos personalizados definidos pelo usuário
3. Extensibilidade
Uma das características mais poderosas do PostgreSQL é sua extensibilidade. Os usuários podem:
- Criar tipos de dados personalizados
- Definir funções personalizadas
- Implementar linguagens procedurais (PL/pgSQL, PL/Python, PL/Java, etc.)
- Adicionar extensões que fornecem funcionalidades adicionais
4. Recursos Avançados
PostgreSQL oferece muitos recursos avançados, incluindo:
- Replicação (síncrona e assíncrona)
- Particionamento de tabelas
- Índices de vários tipos (B-tree, Hash, GiST, SP-GiST, GIN, BRIN)
- Consultas complexas com Common Table Expressions (CTEs) e janelas
- Triggers e regras para automação
- Suporte a transações distribuídas
Uso no Projeto
No nosso projeto de microserviços, o PostgreSQL é utilizado como o banco de dados principal para armazenar dados de usuários, solicitações de feedback e respostas. Cada microserviço pode ter seu próprio esquema dentro do banco de dados, mantendo o isolamento de dados enquanto compartilha a mesma infraestrutura.
Configuração no Docker Compose
services:
db:
image: postgres:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: root
POSTGRES_DB: feedback
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
Conexão a partir de Microserviços
Java (Spring Boot)
spring.datasource.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/feedback
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASS}
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
Python (FastAPI com Peewee)
from peewee import PostgresqlDatabase
database = PostgresqlDatabase(
'feedback',
user='postgres',
password='root',
host='db',
port=5432
)
Modelagem de Dados
Esquema para Microserviço de Usuários
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
senha VARCHAR(255),
cargo VARCHAR(255) NOT NULL,
tipo VARCHAR(50) NOT NULL,
pdm_id INTEGER,
ativo BOOLEAN DEFAULT TRUE,
data_criacao TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
data_edicao TIMESTAMP,
data_desativacao TIMESTAMP,
FOREIGN KEY (pdm_id) REFERENCES usuarios(id)
);
Esquema para Microserviço de Solicitação de Feedback
CREATE TABLE feedback_requests (
id SERIAL PRIMARY KEY,
requester_id INTEGER NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
approved_at TIMESTAMP,
rejected_at TIMESTAMP,
edited_at TIMESTAMP
);
CREATE TABLE questions (
id SERIAL PRIMARY KEY,
feedback_request_id INTEGER NOT NULL,
text TEXT NOT NULL,
FOREIGN KEY (feedback_request_id) REFERENCES feedback_requests(id)
);
CREATE TABLE appraisers (
id SERIAL PRIMARY KEY,
feedback_request_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
responded_at TIMESTAMP,
FOREIGN KEY (feedback_request_id) REFERENCES feedback_requests(id)
);
Esquema para Microserviço de Resposta de Feedback
CREATE TABLE feedback_responses (
id SERIAL PRIMARY KEY,
request_id INTEGER NOT NULL,
appraiser_id INTEGER NOT NULL,
responded_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE question_responses (
id SERIAL PRIMARY KEY,
feedback_response_id INTEGER NOT NULL,
question_id INTEGER NOT NULL,
text TEXT NOT NULL,
FOREIGN KEY (feedback_response_id) REFERENCES feedback_responses(id)
);
Boas Práticas com PostgreSQL
1. Indexação
Utilize índices para melhorar o desempenho das consultas:
CREATE INDEX idx_usuarios_email ON usuarios(email);
CREATE INDEX idx_feedback_requests_requester_id ON feedback_requests(requester_id);
2. Transações
Utilize transações para garantir a consistência dos dados:
@Transactional
public void criarSolicitacaoFeedback(SolicitacaoDTO dto) {
// Operações de banco de dados
}
3. Conexões Pooling
Configure um pool de conexões para gerenciar eficientemente as conexões com o banco de dados:
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
4. Migrations
Utilize ferramentas de migração de banco de dados para gerenciar alterações no esquema:
// Exemplo com Flyway
spring.flyway.enabled=true
spring.flyway.baseline-on-migrate=true
Monitoramento e Manutenção
1. Estatísticas
Colete estatísticas regularmente para otimizar o planejador de consultas:
ANALYZE;
2. Vacuum
Execute o VACUUM regularmente para recuperar espaço e manter o desempenho:
VACUUM ANALYZE;
3. Backup
Implemente uma estratégia de backup regular:
pg_dump -U postgres -d feedback -f backup.sql
Conclusão
PostgreSQL é uma escolha excelente para o armazenamento de dados em aplicações baseadas em microserviços devido à sua confiabilidade, recursos avançados e flexibilidade. No nosso projeto, ele fornece uma base sólida para armazenar e gerenciar dados de usuários, solicitações de feedback e respostas, garantindo integridade e consistência dos dados em toda a aplicação.