Sequelize vs Prisma
Start
Derzeit migriere ich bei eBay unsere internen Tools von MongoDB zu Postgres. Ein Projekt, das sehr schwierig ist, dem ich mich aber mit Begeisterung direkt stellen möchte. Bei meiner Recherche habe ich festgestellt, dass für unseren Codebestand die Verwendung eines ORMs am besten wäre, da der Codebestand bereits so entworfen worden war, dass er Mongoose verwendet. Aber nun ist die Herausforderung: Welches ORM wäre für unseren Codebestand am besten? In diesem Blog gehe ich dieser Frage nach. Bitte beachten Sie, dass ich in diesem Blog aufgrund der Natur meines Kontakts mit meinem Arbeitgeber nicht alles preisgeben kann.
Anforderungen
Nach sorgfältiger Analyse der Anforderungen des Projekts habe ich die folgenden wesentlichen Kriterien festgelegt, die jede ORM-Lösung erfüllen müsste:
- Ein JavaScript-Paket sein; da der Großteil des Codes in JavaScript geschrieben ist
- Muss Postgres und die meisten seiner Funktionen unterstützen
- Seine Leistung muss mindestens auf Augenhöhe mit Mongoose sein oder besser
- Muss Open Source und gepflegt sein
ORMs
Nach umfangreicher Recherche habe ich festgestellt, dass die drei besten ORMs, die den Anforderungen entsprechen, folgende sind: Sequelize, Prisma und TypeORM. Letztendlich habe ich mich entschieden, mich nur auf Sequelize und Prisma zu konzentrieren, weil ich aufgrund von Fristen nicht genug Zeit hatte, drei verschiedene ORMs vollständig zu testen.
Testumgebung
Für meine Testumgebung habe ich Postgres über Docker betrieben. Ich habe unseren größten und komplexesten Datensatz genommen, ihn von einer Dokumentstruktur in eine Tabellenstruktur umgewandelt und ihn meiner lokalen Postgres-Instanz hinzugefügt. Ich habe den Datensatz mithilfe von Spalten, Eins-zu-eins-Beziehungen, Eins-zu-viele-Beziehungen und einigen JSONB-Spalten umgewandelt.
Von dort aus würde ich JavaScript-Code schreiben, der dieses spezielle ORM verwendet, und messen:
- Wie lange es dauern würde, einen Eintrag zu erstellen
- Wie lange es dauern würde, einen Eintrag zu aktualisieren
- Wie lange es dauern würde, einen verschachtelten Eintrag zu aktualisieren (Beziehung und/oder Schlüssel-Wert in einem JSON)
- Wie lange es dauern würde, einen Eintrag zu löschen
- Wie lange es dauern würde, einen Eintrag abzufragen/abzurufen
Ich habe Repositories für jede ORM-Testumgebung erstellt. Ich würde diese Repositories sehr gerne teilen, aber sie gehören technisch gesehen eBay, also kann ich sie nicht teilen.
Ergebnisse
Etwa am 15. Mai 2023 entschied ich, dass Sequelize das bessere ORM für unseren Anwendungsfall war und dass es das ORM sein würde, das wir für unsere Migration von MongoDB zu Postgres verwenden würden. Letztendlich habe ich mich für Sequelize entschieden, weil:
- Es „wirklich Open Source“ war und nicht von einem finanzierten Startup gepflegt wurde.
- Es die meisten Funktionen von Postgres unterstützte.
- Es gute Leistung hatte, insbesondere im Vergleich zu Prisma.
- Es eine gute Dokumentation hat, auch wenn sie nicht so gut dokumentiert ist wie die von Prisma.
Ich habe mich für Sequelize entschieden, habe aber auch für jedes von mir getestete ORM eine Liste mit Vor- und Nachteilen erstellt, in der Hoffnung, dass sie den Menschen dabei hilft, besser zu bestimmen, ob Sequelize oder Prisma für Ihren Anwendungsfall geeignet wären.
Vor- und Nachteile von Sequelize
Vorteile:
- Verfügt über eine sync()-Funktion, die Tabellen automatisch für Sie erstellt und verwaltet
- Kann komplexe Joins verarbeiten (verschachtelte Daten)
- Unterstützt viele Filteroptionen (z. B. Regex)
- Modell-/Schema-Darstellung erfolgt in rohem JavaScript mithilfe von Klassen, die hochgradig anpassbar sind.
- Sequelize verwaltet Verbindungen für Ihre ausgewählte(n) Datenbank(en).
- Sequelize unterstützt mehrere Leseverbindungen
- Unterstützt rohe SQL-Abfragen.
- Stand: 15. Mai 2023:
- Auf NPM wurde Sequelize zuletzt vor „14 Tagen“ aktualisiert und erhält 1.505.835 wöchentliche Downloads.
- Auf GitHub wurde Sequelize zuletzt „gestern“ aktualisiert, hat 4,2k Forks und 27,9k Stars.
- Sequelize hat eine MIT-Lizenz und ist seit über 10 Jahren Open Source. Es wird also höchstwahrscheinlich auch in absehbarer Zukunft Open Source bleiben.
Nachteile:
- Die Modell-/Schema-Darstellung kann sehr komplex und aufgebläht werden. Zum Beispiel umfasste die Mongoose-Darstellung unseres großen Datensatzes etwa 262 Zeilen (einschließlich Leerzeichen). Derselbe Datensatz, der durch Sequelize dargestellt wurde, umfasst 564 Zeilen (einschließlich Leerzeichen).
- Die Syntax von Sequelize wird in bestimmten Fällen wirklich verwirrend und kompliziert.
- Das Migrieren Ihrer Datenbank (Bearbeiten) ist sehr umständlich. Sie können sequelize-cli verwenden, um JavaScript-Migrations-Template-Skripte zu generieren. ABER, dies scheint bei nahezu allen ORMs derselbe Fall zu sein. Das Migrieren in einer relationalen Datenbank ist in den meisten Fällen nicht einfach.
- Die Dokumentation ist nicht so gut. Sie ist besser geworden, braucht aber immer noch Arbeit. Aber mit Tools wie ChatGPT ist das kein so großes Problem mehr wie früher, da ChatGPT ein sehr gutes Verständnis von Sequelize hat, höchstwahrscheinlich, weil Sequelize seit einem Jahrzehnt existiert.
- Sequelize ist im Vergleich zu Prisma nicht so typsensitiv, was zu Problemen führen könnte.
- Es unterstützt TypeScript nicht gut, was für mein Projekt kein Problem ist, für viele andere Projekte aber ein großes Problem sein könnte.
Vor- und Nachteile von Prisma
Vorteile:
- Verfügt über eine eigene Schemasprache. Das bedeutet, dass Sie Ihr Schema/Modell einfacher und sauberer erstellen können. Zum Beispiel umfasste die Mongoose-Darstellung unseres großen Datensatzes etwa 262 Zeilen (einschließlich Leerzeichen). Derselbe Datensatz, der von Prisma dargestellt wurde, umfasste jedoch nur 221 Zeilen (einschließlich Leerzeichen).
- Prisma hat ein CLI-Tool, das die Erstellung und Migration (Änderung) Ihrer Datenbank erleichtert. Das ist sehr praktisch. Es ist keine Wunderlösung, aber es ist das Beste, was ich bisher von einem ORM gesehen habe.
- Unterstützt rohe SQL-Abfragen.
- Der Code von Prisma ist sauber und einfach. Man muss die Syntax von Prisma zwar trotzdem lernen und sich damit vertraut machen, aber sie ist viel leichter zu verstehen als die Syntax von Sequelize.
- Prisma hat einen Client, der automatisch Query Builder für Node.js und TypeScript generiert.
- Die Dokumentation ist sehr, sehr gut und sauber. ChatGPT kann weiterhin helfen, aber es ist nicht so aktuell in Bezug auf Prisma wie bei Sequelize.
- Stand: 15. Mai 2023:
- Auf NPM wurde Prisma zuletzt vor „6 Tagen“ aktualisiert und erhält 1.344.705 wöchentliche Downloads.
- Auf GitHub wurde Prisma zuletzt vor „3 Stunden“ aktualisiert, hat 1,1k Forks und 31,3k Stars.
Nachteile:
- Unterstützt keine Regex-Filterung für Postgres, hat aber die Filteroptionen „contains“, „includes“ und „startsWith“.
- Nach meinen Tests ist Prisma beim Erstellen der Einträge unseres großen Datensatzes in Postgres erheblich langsamer. Sequelize erstellte diese großen Einträge mit einer Rate von etwa 2,26 Sekunden pro Eintrag (JSON-Datei). Prisma hatte hingegen eine Rate von etwa 11,21 Sekunden pro Eintrag (JSON-Datei). Auf Grundlage dieser Ergebnisse ist Prisma bei dieser Aufgabe etwa 5x langsamer als Sequelize.
- Außerdem führte das Löschen eines Eintrags aus dem großen Datensatz zu einer Wartezeit von fast 4 Minuten, was sehr, sehr schlecht ist.
- Sequelize war beim Löschen eines Eintrags im größten und komplexesten Datensatz in meinen Tests deutlich schneller. Sequelize hatte beim Aufbau des Datensatzes keinen Vorteil gegenüber Prisma. Beide mussten mit einer dreistufigen tiefen Beziehung für diesen großen Datensatz umgehen, daher würde ich sagen, dass es ein fairer Vergleich war.
- Prisma ist ein Startup, was bedeutet, dass Prisma ein gewinnorientiertes Unternehmen mit 56,5 Millionen US-Dollar an Finanzierung ist. Wenn man das weiß, ist der Haupt-ORM-Code/das Hauptpaket von Prisma Open Source mit einer Apache-2.0-Lizenz. Das ist schön, aber da Prisma Investoren hat, würde es mich nicht überraschen, wenn sie in Bezug auf ihre Lizenz einen ähnlichen Schritt wie MongoDB machen würden.
Quellen
- 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