# Configuración de Base de Datos - VoxPopuli Microservices ## MySQL (API de Usuarios) ### Crear la base de datos: ```sql 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: ```python 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: ```javascript 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: ```json { "_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: ```env # 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`: ```python 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: ```bash 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: ```python from infrastructure.adapters.persistence.db import SessionLocal db = SessionLocal() print(db.execute("SELECT 1")) db.close() ``` ### MongoDB: ```python from infrastructure.adapters.persistence.mongodb import get_reports_collection collection = get_reports_collection() print(collection.find_one()) ``` ## Respaldo y Restauración ### MySQL: ```bash # Respaldo mysqldump -u user -p voxpopuli_users > backup.sql # Restauración mysql -u user -p voxpopuli_users < backup.sql ``` ### MongoDB: ```bash # 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.