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.