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

174 lines
4.2 KiB
Markdown

# 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.