Saltar a contenido

Informe de Validación: Migración RemoveDuplicateIndexes

Fecha: 2026-02-01 Proyecto: Calmia Nexus Migración: 20260201130000_RemoveDuplicateIndexes


Resumen Ejecutivo

Aspecto Estado
Compilación ✅ PASS (0 errores)
Migración Up() ✅ Verificada
Migración Down() ✅ Verificada (rollback)
Verificación previa de constraints ✅ Incluida
Idempotencia IF EXISTS / IF NOT EXISTS

1. Verificación de Compilación

Build succeeded.
    45 Warning(s)
    0 Error(s)

La migración compila correctamente sin errores.


2. Estructura de la Migración

Método Up() - Aplicar Migración

Fase Acción Seguridad
Verificación previa Comprueba que existen las 4 constraints UNIQUE Aborta si falta alguna
Eliminar índices DROP INDEX IF EXISTS × 4 Idempotente
Mantenimiento ANALYZE en las 4 tablas Actualiza estadísticas

Método Down() - Rollback

Fase Acción
Recrear índices CREATE UNIQUE INDEX IF NOT EXISTS × 4
Mantenimiento ANALYZE en las 4 tablas

3. Índices a Eliminar

Índice Tabla Constraint que lo cubre
IX_Organizations_Slug Organizations Organizations_Slug_key
IX_Users_Email Users Users_Email_key
IX_ProjectAgentPaths_ProjectId_RemoteAgentId ProjectAgentPaths Constraint UNIQUE compuesta
IX_WellnessRecords_UserId_RecordDate WellnessRecords Constraint UNIQUE compuesta

4. Garantías de Integridad

4.1 Verificación Previa (Bloque DO)

La migración incluye un bloque PL/pgSQL que:

  1. Verifica existencia de Organizations_Slug constraint
  2. Verifica existencia de Users_Email constraint
  3. Verifica existencia de ProjectAgentPaths constraint
  4. Verifica existencia de WellnessRecords constraint

Si cualquier constraint falta, la migración aborta con:

EXCEPTION: ABORTANDO: Faltan constraints UNIQUE: [lista]

4.2 Idempotencia

  • DROP INDEX IF EXISTS no falla si el índice no existe
  • CREATE UNIQUE INDEX IF NOT EXISTS no falla si el índice ya existe
  • La migración puede re-ejecutarse sin errores

4.3 Constraints Intactas

Las constraints UNIQUE de PostgreSQL: - Son independientes de los índices IX_* creados por EF Core - Tienen su propio índice subyacente gestionado automáticamente - NO SE ELIMINAN con DROP INDEX


5. Scripts de Validación

Se han generado dos scripts SQL para validación manual:

5.1 Validación (Dry Run)

psql -d nexus_dev -f scripts/database/validate-duplicate-indexes-migration.sql

Este script: - Verifica constraints UNIQUE existen - Ejecuta DROP INDEX en una transacción - Prueba que constraints siguen activas - Hace ROLLBACK (no aplica cambios)

5.2 Aplicación (Producción)

psql -d nexus_db -f scripts/database/apply-duplicate-indexes-migration.sql

Este script: - Verifica constraints antes de proceder - Elimina índices duplicados - Ejecuta ANALYZE - Verifica resultado


6. Cómo Aplicar la Migración

Opción A: EF Core (Recomendado)

cd Orchestrator/src/Orchestrator.Api
dotnet ef database update --context NexusDbContext

Opción B: Script SQL Directo

psql -d nexus_db -f scripts/database/apply-duplicate-indexes-migration.sql

7. Cómo Revertir (Rollback)

Opción A: EF Core

cd Orchestrator/src/Orchestrator.Api
dotnet ef database update 20260201120000_OptimizeRemoteAgentsIndexes --context NexusDbContext

Opción B: Script SQL

CREATE UNIQUE INDEX IF NOT EXISTS "IX_Organizations_Slug" ON "Organizations" ("Slug");
CREATE UNIQUE INDEX IF NOT EXISTS "IX_Users_Email" ON "Users" ("Email");
CREATE UNIQUE INDEX IF NOT EXISTS "IX_ProjectAgentPaths_ProjectId_RemoteAgentId" ON "ProjectAgentPaths" ("ProjectId", "RemoteAgentId");
CREATE UNIQUE INDEX IF NOT EXISTS "IX_WellnessRecords_UserId_RecordDate" ON "WellnessRecords" ("UserId", "RecordDate");

8. Checklist Pre-Producción

  • [ ] Ejecutar script de validación en entorno de desarrollo
  • [ ] Verificar que todas las constraints UNIQUE existen
  • [ ] Crear backup de base de datos
  • [ ] Aplicar migración en staging primero
  • [ ] Verificar que aplicación funciona correctamente
  • [ ] Monitorear logs de errores post-migración
  • [ ] Aplicar en producción durante ventana de mantenimiento

9. Impacto Esperado

Métrica Antes Después
Índices por tabla 2 (UNIQUE + IX_) 1 (solo UNIQUE)
Overhead INSERT Alto (2 índices) Normal (1 índice)
Overhead UPDATE Alto Normal
Espacio en disco +4 índices redundantes Recuperado
Tiempo VACUUM Mayor Reducido

10. Conclusión

La migración es SEGURA para aplicar:

✅ Compilación exitosa ✅ Verificación previa de constraints incluida ✅ Operaciones idempotentes ✅ Rollback disponible ✅ Scripts de validación generados ✅ Constraints UNIQUE permanecen intactas ✅ Sin impacto en integridad de datos


Generado automáticamente - Calmia Nexus Database Optimization