Sequelize vs Prisma
Inicio
Actualmente, en eBay, estoy migrando nuestras herramientas internas de usar MongoDB a Postgres. Un proyecto que es muy difícil, pero que estoy emocionado de afrontar de frente. Mientras investigaba, determiné que, para nuestra base de código, usar un ORM sería lo mejor, ya que la base de código ya estaba diseñada para usar Mongoose. Pero ahora el reto es, ¿qué ORM sería el mejor para nuestra base de código? En este blog, profundizaré en esa pregunta. Tenga en cuenta que no puedo revelar todo en este blog debido a la naturaleza de mi relación con mi empleador.
Requisitos
Después de un análisis cuidadoso de las necesidades del proyecto, establecí los siguientes criterios esenciales que cualquier solución ORM debería satisfacer:
- Ser un paquete de JavaScript; ya que la mayor parte del código está escrito en JavaScript
- Debe soportar Postgres y la mayoría de sus funciones
- Su rendimiento debe ser al menos igual o mejor que Mongoose
- Debe ser de código abierto y mantenerse
ORMs
Después de hacer mucha investigación, determiné que los tres principales ORMs que encajan con los requisitos son: Sequelize, Prisma y TypeORM. Finalmente decidí centrarme solo en Sequelize y Prisma porque no tenía tiempo de probar completamente tres ORMs diferentes debido a los plazos.
Entorno de pruebas
Para mi entorno de pruebas, ejecuté Postgres a través de Docker. Tomé nuestro conjunto de datos más grande y complejo, lo convertí de una estructura de documento a una estructura de tabla y lo añadí a mi instancia local de Postgres. Convertí el conjunto de datos usando columnas, relaciones uno a uno, relaciones uno a muchos y algunas columnas JSONB.
A partir de ahí, escribiría código JavaScript que usara ese ORM específico y mediría:
- Cuánto tardaría en crear una entrada
- Cuánto tardaría en actualizar una entrada
- Cuánto tardaría en actualizar una entrada anidada (relación y/o clave-valor en un JSON)
- Cuánto tardaría en eliminar una entrada
- Cuánto tardaría en consultar/obtener una entrada
Creé repositorios para cada entorno de pruebas de ORM. Me encantaría compartir estos repositorios, pero técnicamente pertenecen a eBay, así que no puedo compartirlos.
Resultados
Alrededor del 15 de mayo de 2023, decidí que Sequelize era el mejor ORM para nuestro caso de uso y que sería el ORM utilizado para nuestra migración de MongoDB a Postgres. En última instancia, elegí Sequelize porque:
- Era “verdaderamente de código abierto” y no estaba mantenido por una startup financiada.
- Soportaba la mayoría de las funciones de Postgres.
- Tenía buen rendimiento, especialmente en comparación con Prisma.
- Tiene buena documentación, aunque no tan bien documentada como la documentación de Prisma.
Me decidí por Sequelize, pero también elaboré una lista de pros y contras para cada ORM que probé con la esperanza de que ayude a las personas a determinar mejor si Sequelize o Prisma funcionarían para su caso de uso.
Pros y contras de Sequelize
Pros:
- Tiene una función sync() que crea y maneja automáticamente las tablas por ti
- Puede manejar uniones complejas (datos anidados)
- Soporta muchas opciones de filtrado (como Regex)
- La representación del modelo/esquema se hace en JavaScript puro usando clases, que son altamente personalizables.
- Sequelize maneja las conexiones para tu(s) base(s) de datos seleccionada(s).
- Sequelize soporta múltiples conexiones de lectura
- Soporta consultas SQL en bruto.
- A fecha del 15 de mayo de 2023:
- En NPM, Sequelize se actualizó por última vez “hace 14 días” y recibe 1,505,835 descargas semanales.
- En GitHub, Sequelize se actualizó por última vez “ayer”, tiene 4.2k Forks y 27.9k Stars.
- Sequelize tiene una licencia MIT y ha sido de código abierto durante más de 10 años. Así que lo más probable es que siga siendo de código abierto en el futuro previsible.
Contras:
- La representación del modelo/esquema puede volverse muy compleja y voluminosa. Por ejemplo, la representación de Mongoose de nuestro gran conjunto de datos tenía aproximadamente 262 líneas (incluyendo espacios). El mismo conjunto de datos representado mediante Sequelize tiene 564 líneas (incluyendo espacios).
- La sintaxis de Sequelize se vuelve realmente confusa y complicada en ciertos casos.
- Migrar tu base de datos (editarla) es muy engorroso. Puedes usar sequelize-cli para generar scripts plantilla de migración en JavaScript. PERO, parece que este es el mismo caso en casi todos los ORMs. Migrar en una base de datos relacional no es fácil en la mayoría de los casos.
- La documentación no es tan buena. Ha mejorado, pero todavía necesita trabajo. Pero con herramientas como ChatGPT, esto ya no es un problema tan grande como solía ser, ya que ChatGPT tiene una muy buena comprensión de Sequelize, probablemente debido a que Sequelize existe desde hace una década.
- Sequelize no es tan sensible a los tipos en comparación con Prisma, lo que podría generar problemas.
- No soporta bien TypeScript, lo cual para mi proyecto no es un problema, pero para muchos otros proyectos podría ser un problema importante.
Pros y contras de Prisma
Pros:
- Tiene su propio lenguaje de esquema. Esto significa que puedes crear tu esquema/modelo de manera más fácil y limpia. Por ejemplo, la representación de Mongoose de nuestro gran conjunto de datos tenía aproximadamente 262 líneas (incluyendo espacios). Pero el mismo conjunto de datos representado por Prisma tenía solo 221 líneas (incluyendo espacios).
- Prisma tiene una herramienta CLI que facilita la creación y migración (modificación) de tu base de datos. Lo cual es muy conveniente. No es una solución milagrosa, pero es lo mejor que he visto hasta ahora de un ORM.
- Soporta consultas SQL en bruto.
- El código de Prisma es limpio y simple. Todavía tienes que aprender y familiarizarte con la sintaxis de Prisma, pero es mucho más fácil de entender que la sintaxis de Sequelize.
- Prisma tiene un cliente que genera automáticamente constructores de consultas para Node.js y TypeScript.
- La documentación es muy, muy buena y limpia. ChatGPT todavía puede ayudar, pero no está tan actualizado sobre Prisma como lo está con Sequelize.
- A fecha del 15 de mayo de 2023:
- En NPM, Prisma se actualizó por última vez “hace 6 días” y recibe 1,344,705 descargas semanales.
- En GitHub, Prisma se actualizó por última vez “hace 3 horas”, tiene 1.1k Forks y 31.3k Stars.
Contras:
- No soporta filtrado Regex para Postgres, pero sí tiene opciones de filtro “contains”, “includes” y “startsWith”.
- Según mis pruebas, Prisma es significativamente más lento al crear las entradas de nuestro gran conjunto de datos en Postgres. Sequelize creó esas entradas grandes a una tasa de aproximadamente 2.26 segundos por entrada (archivo JSON). Mientras que Prisma tuvo una tasa de aproximadamente 11.21 segundos por entrada (archivo JSON). Según estos resultados, Prisma es alrededor de 5 veces más lento que Sequelize en esta tarea.
- Además, eliminar una entrada del gran conjunto de datos resultó en un tiempo de espera de casi 4 minutos, lo cual es muy, muy malo.
- Sequelize fue mucho más rápido al eliminar una entrada en el conjunto de datos más grande y más complejo en mis pruebas. Sequelize no tuvo ventaja sobre Prisma cuando se trató de la construcción del conjunto de datos. Ambos tuvieron que lidiar con una relación de tres niveles de profundidad para este gran conjunto de datos, así que diría que fue una comparación justa.
- Prisma es una startup, lo que significa que Prisma es una empresa con fines de lucro con 56.5 millones de dólares en financiación. Sabiendo esto, el código/paquete principal de ORM de Prisma es de código abierto con una licencia Apache-2.0. Esto está bien, pero como Prisma tiene inversores, no me sorprendería que hicieran un MongoDB en lo que respecta a su licencia.
Fuentes
- https://www.bitovi.com/blog/battle-of-the-node.js-orms-objection-prisma-sequelize
- https://www.prisma.io/docs/orm/more/comparisons/prisma-and-sequelize
- https://github.com/prisma/prisma
- https://github.com/sequelize/sequelize
- https://www.youtube.com/watch?v=rLRIB6AF2Dg
- https://www.youtube.com/watch?v=RebA5J-rlwg
- https://www.youtube.com/watch?v=a5Wh_LDXtLc
- https://www.youtube.com/watch?v=4QN1BzxF8wM