# Deuda Técnica: ENUMs Sin Uso (H-034)

**Fecha:** 2025-11-19
**Auditoría:** DB-124
**Hallazgo:** H-034
**Prioridad:** P2 (Mediana)
**Estado:** 📋 DOCUMENTADO (Backlog)

---

## Resumen

Se identificaron **10 ENUMs sin uso** en schemas `audit_logging` y `social_features` que tienen tablas implementadas, pero las tablas usan tipos primitivos (TEXT/VARCHAR) con CHECK constraints en lugar de ENUMs.

---

## ENUMs Afectados

### audit_logging (6 ENUMs - 0% uso)

| ENUM | Valores | Columna Objetivo | Bloqueador |
|------|---------|------------------|------------|
| `audit_action` | create, update, delete, login, logout, access, export, import | audit_logs.action | ✅ YA IMPLEMENTADO |
| `alert_severity` | info, warning, error, critical | audit_logs.severity, system_alerts.severity | CHECK constraint + índice WHERE |
| `alert_status` | active, acknowledged, resolved, ignored | system_alerts.status | CHECK constraint + índice WHERE |
| `log_level` | debug, info, warning, error, critical | system_logs.log_level | - |
| `metric_type` | engagement, performance, completion, time_spent, accuracy, streak, social_interaction | performance_metrics.metric_type | - |
| `aggregation_period` | daily, weekly, monthly, quarterly, yearly | (sin columna) | Sin uso planeado |

### social_features (4 ENUMs - 25% uso)

| ENUM | Valores | Columna Objetivo | Bloqueador |
|------|---------|------------------|------------|
| `classroom_role` | teacher, student, assistant | teacher_classrooms.role | ✅ YA IMPLEMENTADO |
| `team_role` | leader, member, coordinator | team_members.role | ✅ YA IMPLEMENTADO |
| `friendship_status` | pending, accepted, blocked | friendships.status | Policy RLS |
| `social_event_type` | competition, collaboration, challenge, tournament, workshop | social_interactions.interaction_type | Requiere análisis |

**Total:** 10 ENUMs (3 implementados, 7 pendientes)

---

## Problema Técnico

Las tablas usan CHECK constraints en lugar de ENUMs:

```sql
-- Ejemplo: system_alerts
ALTER TABLE audit_logging.system_alerts
  ADD CONSTRAINT system_alerts_severity_check
  CHECK (severity = ANY (ARRAY['low'::text, 'medium'::text, 'high'::text, 'critical'::text]));

ALTER TABLE audit_logging.system_alerts
  ADD CONSTRAINT system_alerts_status_check
  CHECK (status = ANY (ARRAY['open'::text, 'acknowledged'::text, 'resolved'::text, 'suppressed'::text]));
```

Además, hay índices con predicados TEXT:

```sql
CREATE INDEX idx_alerts_open
  ON audit_logging.system_alerts(status, severity)
  WHERE status = 'open'::text;
```

**Impacto de migración:**
- Requiere DROP constraints (6+ constraints)
- Requiere DROP/CREATE índices con predicados
- Requiere ALTER TYPE con trigger deshabilitado
- Requiere recrear constraints con ENUM values
- ~60-90 minutos de trabajo

---

## Razón de NO Implementación Inmediata

1. **Tablas vacías**: audit_logging tiene 0 registros, social_features solo 5 registros
2. **Bajo ROI**: Trabajo extenso para beneficio mínimo en entorno actual
3. **CHECK constraints suficientes**: Validan datos correctamente
4. **Índices funcionales**: Funcionan correctamente con TEXT

---

## Decisión

**Mantener ENUMs definidos** y documentar como **deuda técnica** para refactorización futura.

**Razones:**
- Los ENUMs ya existen y no causan problemas
- Si en futuro se decide refactorizar, ya están definidos
- Eliminarlos y recrearlos después sería trabajo adicional

---

## Plan de Refactorización Futura

### Cuándo ejecutar

Ejecutar cuando se cumpla **cualquiera** de estas condiciones:

1. **Alta carga de datos**: Tablas superan 10,000 registros
2. **Performance crítica**: Queries de audit_logging/social_features son >10% de carga total
3. **Migración mayor**: Se planea refactorización de schemas completos
4. **Nuevo proyecto**: Se implementa auditoría/social features desde cero

### Pasos de migración (CUANDO se ejecute)

```sql
-- 1. Desactivar triggers
ALTER TABLE audit_logging.system_alerts DISABLE TRIGGER ALL;

-- 2. DROP CHECK constraints
ALTER TABLE audit_logging.system_alerts
  DROP CONSTRAINT system_alerts_severity_check,
  DROP CONSTRAINT system_alerts_status_check;

-- 3. DROP índices con predicados TEXT
DROP INDEX audit_logging.idx_alerts_open;

-- 4. ALTER columnas a ENUM
ALTER TABLE audit_logging.system_alerts
  ALTER COLUMN severity TYPE audit_logging.alert_severity
    USING severity::audit_logging.alert_severity,
  ALTER COLUMN status TYPE audit_logging.alert_status
    USING CASE
      WHEN status = 'open' THEN 'active'::audit_logging.alert_status
      WHEN status::text = ANY(ARRAY['active', 'acknowledged', 'resolved', 'ignored'])
      THEN status::audit_logging.alert_status
      ELSE 'active'::audit_logging.alert_status
    END;

-- 5. RECREAR índices con ENUM
CREATE INDEX idx_alerts_open
  ON audit_logging.system_alerts(status, severity)
  WHERE status = 'active'::audit_logging.alert_status;

-- 6. Reactivar triggers
ALTER TABLE audit_logging.system_alerts ENABLE TRIGGER ALL;
```

Repetir para todas las tablas afectadas.

### Tiempo estimado (cuando se ejecute)

- Análisis de datos existentes: 30 min
- Migración de 6+ tablas: 60-90 min
- Testing: 30 min
- **Total: 2-2.5 horas**

---

## Beneficios de Migración Futura

1. **Validación a nivel BD**: Imposible insertar valores inválidos
2. **Performance**: Índices más eficientes con ENUMs
3. **Autocomplete**: Herramientas de BD muestran valores permitidos
4. **Menor storage**: ENUMs usan menos espacio que TEXT
5. **Type safety**: APIs y ORMs detectan errores en compile-time

---

## Estado Actual

**Implementado:**
- ✅ audit_logs.action → audit_action ENUM
- ✅ teacher_classrooms.role → classroom_role ENUM
- ✅ team_members.role → team_role ENUM

**Pendiente (backlog):**
- ⏳ audit_logs.severity → alert_severity ENUM
- ⏳ system_alerts.severity → alert_severity ENUM
- ⏳ system_alerts.status → alert_status ENUM
- ⏳ system_logs.log_level → log_level ENUM
- ⏳ performance_metrics.metric_type → metric_type ENUM
- ⏳ friendships.status → friendship_status ENUM
- ⏳ social_interactions.interaction_type → social_event_type ENUM (requiere análisis)

**Sin uso planeado:**
- ❌ aggregation_period → (eliminar si no se usa en 6 meses)

---

## Referencias

- **Auditoría:** orchestration/database/DB-124/
- **Hallazgo:** H-034
- **Scripts parciales:**
  - `ddl/schemas/_migrations/01-implement-enums-audit-social.sql` (v1 - fallida)
  - `ddl/schemas/_migrations/02-implement-enums-audit-social-v2.sql` (v2 - parcial)
- **Documentación:** Este archivo

---

## Revisión

**Próxima revisión:** 2025-05 (6 meses)
**Criterio de cierre:**
- Opción A: Migración completa ejecutada
- Opción B: Se decide eliminar ENUMs sin uso si no hay plan de implementación

---

**Responsable:** Database Agent
**Estado:** 📋 BACKLOG (Deuda Técnica Documentada)
