Pular para conteúdo

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.