Sequelize vs Prisma
Comenzar
Actualmente en eBay, estoy migrando nuestras herramientas internas de usar MongoDB a Postgres. Un proyecto que es muy difícil pero estoy emocionado de enfrentar. 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 desafío 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 contacto 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 necesitarí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 características
- Su rendimiento debe ser al menos igual o mejor que Mongoose
- Debe ser de código abierto y mantenido
ORMs
Después de hacer mucha investigación, determiné que los tres principales ORMs que se ajustan a los requisitos son: Sequelize, Prisma y TypeORM. Finalmente, decidí centrarme solo en Sequelize y Prisma porque no tenía tiempo para 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 utilizando columnas, relaciones uno a uno, relaciones uno a muchos y algunas columnas JSONB.
A partir de ahí, escribiría código JavaScript que utilizara ese ORM específico y mediría:
- Cuánto tiempo tardaría en crear una entrada
- Cuánto tiempo tardaría en actualizar una entrada
- Cuánto tiempo tardaría en actualizar una entrada anidada (relación y/o clave-valor en un JSON)
- Cuánto tiempo tardaría en eliminar una entrada
- Cuánto tiempo tardaría en consultar/obtener una entrada
Creé repositorios para cada entorno de prueba de ORM. Me encantaría compartir estos repositorios, pero técnicamente son propiedad de 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 “realmente de código abierto” y no mantenido por una startup financiada.
- Soportaba la mayoría de las características de Postgres.
- Tenía un buen rendimiento, especialmente en comparación con Prisma.
- Tiene buena documentación, aunque no tan bien documentada como la 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ía para su caso de uso.
Pros y Contras de Sequelize
Pros:
- Tiene una función sync() que crea y maneja tablas automáticamente para ti
- Puede manejar uniones complejas (datos anidados)
- Soporta muchas opciones de filtrado (como Regex)
- La representación del modelo/esquema se realiza en JavaScript puro utilizando 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 partir del 15 de mayo de 2023:
- En NPM, Sequelize fue actualizado por última vez “hace 14 días” y recibe 1,505,835 descargas semanales.
- En GitHub, Sequelize fue actualizado 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 abultada. Por ejemplo, la representación de Mongoose de nuestro gran conjunto de datos era de aproximadamente 262 líneas (incluyendo espacios). El mismo conjunto de datos representado a través de Sequelize es de 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 molesto. Puedes usar sequelize-cli para generar scripts de plantilla de migración en JavaScript. PERO, este parece ser 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 aún necesita trabajo. Pero con herramientas como ChatGPT, esto 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 ha existido durante una década.
- Sequelize no es tan sensible a tipos en comparación con Prisma, lo que podría llevar a problemas.
- No soporta bien TypeScript, lo que para mi proyecto no es un problema, pero para muchos otros proyectos podría ser un gran problema.
Pros y Contras de Prisma
Pros:
- Tiene su propio lenguaje de esquema. Esto significa que puedes hacer tu esquema/modelo de manera más fácil y limpia. Por ejemplo, la representación de Mongoose de nuestro gran conjunto de datos era de aproximadamente 262 líneas (incluyendo espacios). Pero el mismo conjunto de datos representado por Prisma era solo de 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 mágica, pero es lo mejor que he visto hasta ahora de un ORM.
- Soporta consultas SQL en bruto.
- El código para Prisma es limpio y simple. Aún tienes que aprender y adaptarte a 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 clara. ChatGPT aún puede ayudar, pero no está tan actualizado sobre Prisma como lo está con Sequelize.
- A partir del 15 de mayo de 2023:
- En NPM, Prisma fue actualizado por última vez “hace 6 días” y recibe 1,344,705 descargas semanales.
- En GitHub, Prisma fue actualizado por última vez “hace 3 horas”, tiene 1.1k Forks y 31.3k Stars.
Contras:
- No soporta filtrado por Regex para Postgres, pero tiene opciones de filtrado “contiene”, “incluye” y “comienzaCon”.
- 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 grandes entradas 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). Basado en 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 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 capas 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 en financiamiento. Sabiendo esto, el código/paquete principal de ORM de Prisma es de código abierto con una licencia Apache-2.0. Esto es agradable, pero dado que Prisma tiene inversores, no me sorprendería si hicieran algo similar a 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