Structure: - control-plane/: Registries, SIMCO directives, CI/CD templates - projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics - shared/: Libs catalog, knowledge-base Key features: - Centralized port, domain, database, and service registries - 23 SIMCO directives + 6 fundamental principles - NEXUS agent profiles with delegation rules - Validation scripts for workspace integrity - Dockerfiles for all services - Path aliases for quick reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
205 lines
6.9 KiB
Markdown
205 lines
6.9 KiB
Markdown
# 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)
|