Files
VoxPopuli/DATABASE.md
2026-03-16 21:05:52 -06:00

4.2 KiB

Configuración de Base de Datos - VoxPopuli Microservices

MySQL (API de Usuarios)

Crear la base de datos:

CREATE DATABASE voxpopuli_users CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE voxpopuli_users;

CREATE TABLE usuarios (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    apellido VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    fecha_nacimiento DATETIME NOT NULL,
    fecha_creacion DATETIME DEFAULT CURRENT_TIMESTAMP,
    calificacion FLOAT DEFAULT 50.0,
    numero_reportes INT DEFAULT 0,
    url_foto_perfil VARCHAR(500),
    biografia VARCHAR(1000),
    INDEX idx_nombre (nombre),
    INDEX idx_email (email),
    INDEX idx_fecha_creacion (fecha_creacion)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Configuración en .env:

MYSQL_URL=mysql+pymysql://usuario:contraseña@localhost:3306/voxpopuli_users

Nota sobre SQLAlchemy:

El proyecto usa SQLAlchemy para mapeo objeto-relacional (ORM). Las tablas se crean automáticamente cuando se ejecuta el código si usas:

from infrastructure.adapters.persistence.db import Base, engine

# Crear todas las tablas definidas en los modelos
Base.metadata.create_all(bind=engine)

MongoDB (API de Reportes)

Crear la base de datos y colección:

use voxpopuli_reports

db.createCollection("reportes")

// Crear índices para mejor rendimiento
db.reportes.createIndex({ "id_usuario": 1 })
db.reportes.createIndex({ "id_reporte": 1 }, { unique: true })
db.reportes.createIndex({ "visibilidad": 1 })
db.reportes.createIndex({ "fecha_creacion": -1 })
db.reportes.createIndex({ "tipo_reporte": 1 })

Configuración en .env:

MONGODB_URL=mongodb://localhost:27017
MONGODB_DB=voxpopuli_reports

Estructura de documento en MongoDB:

{
  "_id": ObjectId("..."),
  "id_reporte": "550e8400-e29b-41d4-a716-446655440000",
  "id_usuario": 1,
  "tipo_reporte": 1,
  "descripcion": "Descripción del reporte",
  "ubicacion": "Ubicación específica",
  "visibilidad": 50.0,
  "fecha_creacion": ISODate("2024-01-15T10:30:00Z")
}

Variables de Entorno

Archivo .env requerido:

# MySQL
MYSQL_URL=mysql+pymysql://user:password@localhost/voxpopuli_users

# MongoDB  
MONGODB_URL=mongodb://localhost:27017
MONGODB_DB=voxpopuli_reports

# Server
HOST=0.0.0.0
LOG_LEVEL=info

Inicializar Bases de Datos

Opción 1: Automático (Recomendado)

Crear un script init_db.py:

from infrastructure.adapters.persistence.db import Base, engine
from infrastructure.adapters.persistence.models import UserModel

# Crear todas las tablas de MySQL
Base.metadata.create_all(bind=engine)

# Para MongoDB, la colección se crea automáticamente
print("Bases de datos inicializadas correctamente")

Ejecutar:

python init_db.py

Opción 2: Manual

  1. Crear MySQL database y tabla (ver scripts arriba)
  2. Crear MongoDB database y colección (ver scripts arriba)

Verificar Conexiones

MySQL:

from infrastructure.adapters.persistence.db import SessionLocal

db = SessionLocal()
print(db.execute("SELECT 1"))
db.close()

MongoDB:

from infrastructure.adapters.persistence.mongodb import get_reports_collection

collection = get_reports_collection()
print(collection.find_one())

Respaldo y Restauración

MySQL:

# Respaldo
mysqldump -u user -p voxpopuli_users > backup.sql

# Restauración
mysql -u user -p voxpopuli_users < backup.sql

MongoDB:

# Respaldo
mongodump --db voxpopuli_reports --out ./backup

# Restauración
mongorestore --db voxpopuli_reports ./backup/voxpopuli_reports

Notas Importantes

  1. Contraseñas: Nunca guardes contraseñas reales en el repositorio. Usa variables de entorno.
  2. Índices: Los índices mejoran significativamente el rendimiento en consultas frecuentes.
  3. Conexiones: Los pools de conexión están configurados en db.py y mongodb.py.
  4. Unicode: MySQL está configurado con UTF-8 para soportar múltiples idiomas correctamente.