Sequelize vs Prisma
Début
Actuellement chez eBay, je migre nos outils internes de MongoDB vers Postgres. Un projet qui est très difficile mais je suis excité de le relever. En faisant des recherches, j’ai déterminé que pour notre code, utiliser un ORM serait le mieux puisque le code était déjà conçu pour utiliser Mongoose. Mais maintenant, le défi est de savoir quel ORM serait le mieux pour notre code ? Dans ce blog, je vais plonger dans cette question. Veuillez noter que je ne peux pas tout divulguer dans ce blog en raison de la nature de mon contact avec mon employeur.
Exigences
Après une analyse minutieuse des besoins du projet, j’ai établi les critères essentiels suivants que toute solution ORM devrait satisfaire :
- Être un package JavaScript ; puisque la plupart du code est écrit en JavaScript
- Doit prendre en charge Postgres et la plupart de ses fonctionnalités
- Sa performance doit être au moins équivalente ou meilleure que Mongoose
- Doit être open source et maintenu
ORMs
Après avoir fait beaucoup de recherches, j’ai déterminé que les trois principaux ORMs qui correspondent aux exigences sont : Sequelize, Prisma, et TypeORM. J’ai finalement décidé de me concentrer uniquement sur Sequelize et Prisma car je n’avais pas le temps de tester pleinement trois ORMs différents en raison des délais.
Environnement de test
Pour mon environnement de test, j’ai exécuté Postgres via Docker. J’ai pris notre plus grand et plus complexe ensemble de données, l’ai converti d’une structure de document à une structure de table, et l’ai ajouté à mon instance locale de Postgres. J’ai converti l’ensemble de données en utilisant des colonnes, des relations un-à-un, des relations un-à-plusieurs, et quelques colonnes JSONB.
À partir de là, j’écrirais du code JavaScript qui utilisait cet ORM spécifique et mesurerais :
- Combien de temps il faudrait pour créer une entrée
- Combien de temps il faudrait pour mettre à jour une entrée
- Combien de temps il faudrait pour mettre à jour une entrée imbriquée (relation et/ou clé-valeur dans un JSON)
- Combien de temps il faudrait pour supprimer une entrée
- Combien de temps il faudrait pour interroger/obtenir une entrée
J’ai créé des dépôts pour chaque environnement de test ORM. J’aimerais partager ces dépôts mais ils appartiennent techniquement à eBay, donc je ne peux pas les partager.
Résultats
Vers le 15 mai 2023, j’ai décidé que Sequelize était le meilleur ORM pour notre cas d’utilisation et qu’il serait l’ORM utilisé pour notre migration de MongoDB vers Postgres. En fin de compte, j’ai choisi Sequelize parce que :
- C’était “vraiment open-source” et non maintenu par une startup financée.
- Prend en charge la plupart des fonctionnalités de Postgres.
- Avait de bonnes performances, surtout par rapport à Prisma.
- A une bonne documentation, bien que pas aussi bien documentée que celle de Prisma.
Je me suis arrêté sur Sequelize, mais j’ai également élaboré une liste des avantages et des inconvénients pour chaque ORM que j’ai testé dans l’espoir que cela aidera les gens à mieux déterminer si Sequelize ou Prisma fonctionnerait pour leur cas d’utilisation.
Avantages et inconvénients de Sequelize
Avantages :
- A une fonction sync() qui crée et gère automatiquement les tables pour vous
- Peut gérer des jointures complexes (données imbriquées)
- Prend en charge de nombreuses options de filtrage (comme Regex)
- La représentation du modèle/schema se fait en JavaScript brut en utilisant des classes qui sont hautement personnalisables.
- Sequelize gère les connexions pour votre(s) base(s) de données sélectionnée(s).
- Sequelize prend en charge plusieurs connexions de lecture
- Prend en charge les requêtes SQL brutes.
- À partir du 15 mai 2023 :
- Sur NPM, Sequelize a été mis à jour pour la dernière fois “il y a 14 jours” et reçoit 1 505 835 téléchargements hebdomadaires.
- Sur GitHub, Sequelize a été mis à jour pour la dernière fois “hier”, a 4,2k Forks, et 27,9k Étoiles.
- Sequelize a une licence MIT et est open source depuis plus de 10 ans. Donc, il est très probable qu’il reste open source dans un avenir prévisible.
Inconvénients :
- La représentation du modèle/schema peut devenir très complexe et encombrée. Par exemple, la représentation Mongoose de notre grand ensemble de données était d’environ 262 lignes (espaces compris). Le même ensemble de données représenté par Sequelize est de 564 lignes (espaces compris).
- La syntaxe de Sequelize devient vraiment déroutante et compliquée dans certains cas.
- Migrer votre base de données (l’éditer) est très ennuyeux. Vous pouvez utiliser sequelize-cli pour générer des scripts de modèle de migration JavaScript. MAIS, cela semble être le même cas pour presque tous les ORMs. Migrer dans une base de données relationnelle n’est pas facile dans la plupart des cas.
- La documentation n’est pas si géniale. Elle s’est améliorée mais a encore besoin de travail. Mais avec des outils comme ChatGPT, ce n’est pas un problème aussi important qu’auparavant car ChatGPT a une très bonne compréhension de Sequelize probablement en raison de l’existence de Sequelize depuis une décennie.
- Sequelize n’est pas aussi sensible aux types par rapport à Prisma, ce qui pourrait entraîner des problèmes.
- Il ne prend pas bien en charge TypeScript, ce qui pour mon projet n’est pas un problème mais pour de nombreux autres projets pourrait être un gros problème.
Avantages et inconvénients de Prisma
Avantages :
- A son propre langage de schéma. Cela signifie que vous pouvez plus facilement et proprement créer votre schéma/modèle. Par exemple, la représentation Mongoose de notre grand ensemble de données était d’environ 262 lignes (espaces compris). Mais le même ensemble de données représenté par Prisma n’était que de 221 lignes (espaces compris).
- Prisma a un outil CLI qui facilite la création et la migration (modification) de votre base de données. Ce qui est très pratique. Ce n’est pas une solution miracle mais c’est la meilleure chose que j’ai vue jusqu’à présent d’un ORM.
- Prend en charge les requêtes SQL brutes.
- Le code pour Prisma est propre et simple. Vous devez encore apprendre et vous familiariser avec la syntaxe de Prisma mais c’est beaucoup plus facile à comprendre que la syntaxe de Sequelize.
- Prisma a un client qui génère automatiquement des constructeurs de requêtes pour Node.js et TypeScript.
- La documentation est très très bonne et claire. ChatGPT peut encore aider mais il n’est pas aussi à jour sur Prisma qu’il l’est sur Sequelize.
- À partir du 15 mai 2023 :
- Sur NPM, Prisma a été mis à jour pour la dernière fois “il y a 6 jours” et reçoit 1 344 705 téléchargements hebdomadaires.
- Sur GitHub, Prisma a été mis à jour pour la dernière fois “il y a 3 heures”, a 1,1k Forks, et 31,3k Étoiles.
Inconvénients :
- Ne prend pas en charge le filtrage Regex pour Postgres mais a des options de filtrage “contains”, “includes”, et “startsWith”.
- D’après mes tests, Prisma est significativement plus lent à créer les entrées de notre grand ensemble de données dans Postgres. Sequelize a créé ces grandes entrées à un rythme d’environ 2,26 secondes par entrée (fichier JSON). Alors que Prisma avait un rythme d’environ 11,21 secondes par entrée (fichier JSON). Sur la base de ces résultats, Prisma est environ 5 fois plus lent que Sequelize pour cette tâche.
- De plus, la suppression d’une entrée de l’ensemble de données volumineux a entraîné un temps d’attente de près de 4 minutes, ce qui est très très mauvais.
- Sequelize était beaucoup plus rapide pour supprimer une entrée dans le plus grand et le plus complexe des ensembles de données dans mes tests. Sequelize n’avait pas d’avantage sur Prisma en ce qui concerne la construction de l’ensemble de données. Les deux ont dû faire face à une relation de trois couches pour cet ensemble de données volumineux, donc je dirais que c’était une comparaison équitable.
- Prisma est une startup, ce qui signifie que Prisma est une entreprise à but lucratif avec 56,5 millions de dollars de financement. Sachant cela, le code/package principal de l’ORM de Prisma est open source avec une licence Apache-2.0. C’est bien, mais puisque Prisma a des investisseurs, je ne serais pas surpris s’ils faisaient un MongoDB en ce qui concerne leur licence.
Sources
- 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