# Evaluación de alternativas a Sequelize en Metis Desk
Fecha: 10 de octubre de 2026. Estado: estudio técnico; no se ha cambiado el ORM, instalado
ninguna alternativa ni modificado la base de datos. Las conclusiones de encaje y esfuerzo
son una valoración del código actual, no resultados de una migración o benchmark.
## 1. Recomendación
No recomiendo una sustitución completa inmediata. Recomiendo una prueba comparativa
acotada de **TypeORM y MikroORM**, manteniendo MariaDB, las tablas, el dominio y los
contratos HTTP. Si la prioridad es controlar SQL y reforzar su tipado, incluir **Kysely**
en la prueba, reconociendo que es un constructor de consultas y no un ORM completo.
- **TypeORM:** camino más próximo al funcionamiento actual, con dialecto MariaDB explícito.
- **MikroORM:** candidato interesante para persistencia de relaciones y seguimiento de
cambios; su beneficio debe compensar el contexto por petición y los modelos separados.
- **Kysely:** alternativa muy alineada con los repositorios que ya utilizan SQL explícito.
- **Prisma 7:** buen candidato para ergonomía de CRUD, condicionado por la transición de
versiones y el uso intensivo de SQL/bloqueos del proyecto. Prisma 8 no entra en la prueba
con MariaDB mientras su documentación indique ausencia de MySQL.
- **Drizzle:** atractivo para TypeScript y esquema relacional, pero no lo elegiría aquí sin
validar primero compatibilidad MariaDB en consultas y migraciones.
- **Sequelize 6:** mantenerlo y mejorar aspectos concretos sigue siendo una opción válida.
La decisión debe salir de medir menos código de persistencia, mejores tipos y mantenimiento,
sin perder garantías de concurrencia; no de elegir el ORM con ejemplos de CRUD más breves.
## 2. Situación real del proyecto
La inspección del repositorio muestra:
| Aspecto | Estado observado | Consecuencia |
| --- | --- | --- |
| ORM y motor | Sequelize 6.37.8; driver mariadb 3.5.4; contenedor MariaDB 11.8 | Comparar contra esta combinación, no contra PostgreSQL ni un ejemplo SQLite. |
| Acoplamiento | 90 ficheros de servidor importan o mencionan Sequelize; 24 implementaciones de repositorio tienen nombre `sequelize-*.repository.ts` | El cambio afecta a bastantes piezas aunque la frontera arquitectónica esté bien definida. Los números son de código fuente, no de tablas. |
| Capas | Puertos en Application; modelos ORM y mappers en Infrastructure; dominio DDD propio | La mayoría de entidades, Value Objects y casos de uso deberían conservarse. |
| Persistencia | Combinación de Model, consultas SQL parametrizadas, helpers relacionales y transacciones | Una sustitución no consiste solo en regenerar entidades. |
| Concurrencia | `FOR UPDATE`, bloqueos del catálogo y orden fijo de adquisición | Deben reproducirse dentro de la misma transacción/conexión. |
| Históricos | Revisiones de activos y asignaciones, entre otros | Deben mantenerse identidad, orden e inmutabilidad del histórico. |
| Sesiones | `connect-session-sequelize` 8.0.6 sobre `http_sessions` | Eliminar Sequelize completamente requiere sustituir o adaptar el store de Express. |
| Normalización | La persistencia de negocio utiliza columnas y tablas relacionadas | La elección de ORM debe conservar el diseño relacional y sus restricciones. |
`modules/resources/src/api/infrastructure/persistence/resource-catalog.model.ts` y
`docs/arquitectura/capas-del-servidor.md`.
El dominio sigue utilizando `UniqueID`, `Result`, `Maybe` y mappers. Ningún ORM debería
sustituir esos contratos ni generar nuevos UUID con otra estrategia por defecto.
## 3. Comparación resumida
Las valoraciones de esfuerzo son relativas a Metis Desk y abarcan reescritura y validación,
no solo conexión inicial. No son métricas objetivas de calidad universal.
| Alternativa | MariaDB | Ventaja principal aquí | Coste de adaptación | Valoración |
| --- | --- | --- | --- | --- |
| Sequelize 6 | Dialecto actual ya operativo | Continuidad y menor riesgo | Bajo si se mantiene | Referencia contra la que medir el beneficio. |
| TypeORM | Soporte explícito | Modelo/repository/query builder reconocibles | Medio | Primera prueba si se busca migrar con menor distancia conceptual. |
| MikroORM | Driver explícito | Unit of Work, relaciones y seguimiento de cambios | Medio-alto | Primera prueba si se busca mejorar mantenibilidad de persistencia compleja. |
| Prisma 7 | Conector MySQL admite MariaDB | Cliente generado y CRUD tipado | Medio-alto | Condicionado por versiones y consultas específicas. |
| Prisma 8 | Documentación consultada: sin MySQL | No aplicable al motor actual | No evaluable aquí | Excluido de la propuesta actual. |
| Drizzle | Integración documentada MySQL/mysql2; soporte específico MariaDB pendiente de verificar | Esquemas TypeScript y consultas próximas a SQL | Medio; riesgo adicional de dialecto | No primera elección con MariaDB. |
| Kysely | Dialecto MySQL/mysql2; comprobar diferencias MariaDB | Consultas SQL compuestas y tipadas | Medio | Buena alternativa cuando importa más SQL que gestión automática de objetos. |
## 4. Sequelize: mantener o actualizar
**Ventajas:** funciona con el motor y las sesiones actuales; los errores y transacciones ya
están integrados; dispone de inferencia de atributos TypeScript, que el proyecto utiliza.
Su documentación reconoce que determinadas declaraciones de modelo siguen requiriendo
trabajo manual. [TypeScript en Sequelize 6](https://sequelize.org/docs/v6/other-topics/typescript/).
**Inconvenientes en este proyecto:** se repiten definiciones entre modelos y tipos;
`database.query<T>` declara un tipo de resultado, pero no demuestra que el SQL devuelva
esas columnas; las migraciones y helpers necesitan disciplina propia.
**Mejoras sin migración:** separar el ejecutor de SQL de consultas concretas, reutilizar
mappers reales y revisar transacciones/lecturas excesivas. No crear un repositorio genérico
que oculte reglas de negocio o bloqueos. No atribuir a Sequelize costes de consultas que
cargan todo un contexto de inventario: cambiar el ORM no evita esa decisión de diseño.
**Actualización a v7:** es un camino distinto de cambiar de ORM. La documentación consultada
sigue etiquetándola como alpha; no la tomaría como actualización automática del proyecto.
[Estado de Sequelize 7](https://sequelize.org/docs/v7/).
## 5. TypeORM
### Capacidades verificadas
Tiene soporte explícito MySQL/MariaDB, configuración `type: "mariadb"` y driver mysql2.
Permite definir entidades mediante `EntitySchema`, sin imponer decoradores. Incluye
migraciones, query builder y transacciones; las operaciones transaccionales deben usar el