Saltar a contenido

PostgreSQL

PostgreSQL es un sistema de gestión de bases de datos relacionales (RDBMS) orientado a objetos y de código abierto. Es conocido por su robustez, escalabilidad y cumplimiento de los estándares SQL, lo que lo convierte en una opción popular para aplicaciones empresariales y proyectos que requieren confiabilidad e integridad de los datos.

Características Principales

1. Cumplimiento de ACID

PostgreSQL es totalmente compatible con las propiedades ACID (Atomicidad, Consistencia, Aislamiento y Durabilidad), garantizando que las transacciones se procesen de forma confiable y que los datos permanezcan consistentes incluso en caso de fallas.

2. Tipos de Datos Avanzados

PostgreSQL soporta una amplia variedad de tipos de datos, incluyendo:

  • Tipos primitivos (enteros, numéricos, cadenas de texto, booleanos)
  • Tipos estructurados (fecha/hora, arreglos, JSON, XML)
  • Tipos geométricos (puntos, líneas, polígonos)
  • Tipos personalizados definidos por el usuario

3. Extensibilidad

Una de las características más potentes de PostgreSQL es su extensibilidad. Los usuarios pueden:

  • Crear tipos de datos personalizados
  • Definir funciones personalizadas
  • Implementar lenguajes de procedimiento (PL/pgSQL, PL/Python, PL/Java, etc.)
  • Añadir extensiones que proporcionan funcionalidades adicionales

4. Características Avanzadas

PostgreSQL ofrece muchas características avanzadas, incluyendo:

  • Replicación (síncrona y asíncrona)
  • Particionamiento de tablas
  • Índices de varios tipos (B-tree, Hash, GiST, SP-GiST, GIN, BRIN)
  • Consultas complejas con Common Table Expressions (CTEs) y funciones de ventana
  • Triggers y reglas para automatización
  • Soporte para transacciones distribuidas

Uso en el Proyecto

En nuestro proyecto de microservicios, PostgreSQL se utiliza como la base de datos principal para almacenar datos de usuarios, solicitudes de feedback y respuestas. Cada microservicio puede tener su propio esquema dentro de la base de datos, manteniendo el aislamiento de los datos mientras se comparte la misma infraestructura.

Configuración en 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

Conexión desde los Microservicios

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 con Peewee)

from peewee import PostgresqlDatabase

database = PostgresqlDatabase(
    'feedback',
    user='postgres',
    password='root',
    host='db',
    port=5432
)

Modelado de Datos

Esquema para el Microservicio de Usuarios

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 el Microservicio de Solicitud 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 el Microservicio de Respuesta 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)
);

Buenas Prácticas con PostgreSQL

1. Indexación

Utilice índices para mejorar el rendimiento de las consultas:

CREATE INDEX idx_usuarios_email ON usuarios(email);
CREATE INDEX idx_feedback_requests_requester_id ON feedback_requests(requester_id);

2. Transacciones

Utilice transacciones para garantizar la consistencia de los datos:

@Transactional
public void criarSolicitacaoFeedback(SolicitacaoDTO dto) {
    // Operaciones de base de datos
}

3. Pool de Conexiones

Configure un pool de conexiones para gestionar eficientemente las conexiones con la base de datos:

spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000

4. Migraciones

Utilice herramientas de migración de bases de datos para gestionar los cambios en el esquema:

// Ejemplo con Flyway
spring.flyway.enabled=true
spring.flyway.baseline-on-migrate=true

Monitoreo y Mantenimiento

1. Estadísticas

Recopile estadísticas regularmente para optimizar el planificador de consultas:

ANALYZE;

2. Vacuum

Ejecute VACUUM regularmente para recuperar espacio y mantener el rendimiento:

VACUUM ANALYZE;

3. Respaldo

Implemente una estrategia de respaldo regular:

pg_dump -U postgres -d feedback -f backup.sql

Conclusión

PostgreSQL es una excelente elección para el almacenamiento de datos en aplicaciones basadas en microservicios debido a su confiabilidad, características avanzadas y flexibilidad. En nuestro proyecto, proporciona una base sólida para almacenar y gestionar datos de usuarios, solicitudes de feedback y respuestas, garantizando la integridad y consistencia de los datos en toda la aplicación.