Sequelize vs Prisma

Start

Derzeit bei eBay migriere ich unsere internen Tools von MongoDB zu Postgres. Ein Projekt, das sehr schwierig ist, aber ich bin gespannt, es direkt anzugehen. Bei meinen Recherchen stellte ich fest, dass es für unseren Codebestand am besten wäre, ein ORM zu verwenden, da der Codebestand bereits für Mongoose ausgelegt war. Aber jetzt besteht die Herausforderung darin, welches ORM am besten für unseren Codebestand geeignet wäre? In diesem Blog werde ich diese Frage näher beleuchten. Bitte beachten Sie, dass ich aufgrund der Natur meines Kontakts mit meinem Arbeitgeber nicht alles in diesem Blog offenlegen kann.

Anforderungen

Nach sorgfältiger Analyse der Bedürfnisse des Projekts habe ich die folgenden wesentlichen Kriterien festgelegt, die jede ORM-Lösung erfüllen muss:

  • Muss 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 gleichwertig oder besser als die von Mongoose sein
  • Muss Open Source und gewartet sein

ORMs

Nach umfangreicher Recherche stellte ich fest, dass die drei besten ORMs, die den Anforderungen entsprechen, Sequelize, Prisma und TypeORM sind. Letztendlich entschied ich mich, mich nur auf Sequelize und Prisma zu konzentrieren, da ich aufgrund von Fristen keine Zeit hatte, drei verschiedene ORMs vollständig zu testen.

Testumgebung

Für meine Testumgebung führte ich Postgres über Docker aus. Ich nahm unseren größten und komplexesten Datensatz, konvertierte ihn von einer Dokumentstruktur in eine Tabellenstruktur und fügte ihn meiner lokalen Postgres-Instanz hinzu. Ich konvertierte den Datensatz, indem ich Spalten, Eins-zu-eins-Beziehungen, Eins-zu-viele-Beziehungen und einige JSONB-Spalten verwendete.

Von dort aus schrieb ich JavaScript-Code, der dieses spezifische ORM verwendete und maß:

  • Wie lange es dauert, einen Eintrag zu erstellen
  • Wie lange es dauert, einen Eintrag zu aktualisieren
  • Wie lange es dauert, einen verschachtelten Eintrag (Beziehung und/oder Schlüssel-Wert in einem JSON) zu aktualisieren
  • Wie lange es dauert, einen Eintrag zu löschen
  • Wie lange es dauert, einen Eintrag abzufragen/zu erhalten

Ich erstellte Repos für jede ORM-Testumgebung. Ich würde diese Repos gerne teilen, aber sie gehören technisch gesehen eBay, also kann ich sie nicht teilen.

Ergebnisse

Um den 15. Mai 2023 entschied ich, dass Sequelize das bessere ORM für unseren Anwendungsfall war und dass es das ORM sein würde, das für unsere Migration von MongoDB zu Postgres verwendet wird. Letztendlich wählte ich Sequelize, weil:

  • Es war “wirklich Open Source” und wurde nicht von einem finanzierten Startup gewartet.
  • Unterstützte die meisten Funktionen von Postgres.
  • Hatte eine gute Leistung, insbesondere im Vergleich zu Prisma.
  • Hat eine gute Dokumentation, obwohl sie nicht so gut dokumentiert ist wie die von Prisma.

Ich entschied mich für Sequelize, aber ich erstellte auch eine Pro- und Contra-Liste für jedes ORM, das ich getestet habe, in der Hoffnung, dass es den Menschen helfen wird, besser zu bestimmen, ob Sequelize oder Prisma für ihren Anwendungsfall geeignet wäre.

Sequelize Vor- und Nachteile

Vorteile:

  • Hat eine sync() Funktion, die automatisch Tabellen für Sie erstellt und verwaltet
  • Kann komplexe Joins (verschachtelte Daten) verarbeiten
  • Unterstützt viele Filteroptionen (wie Regex)
  • Modell-/Schema-Darstellung erfolgt in reinem JavaScript unter Verwendung von Klassen, die hochgradig anpassbar sind.
  • Sequelize verwaltet die Verbindungen für Ihre ausgewählten Datenbanken.
  • Sequelize unterstützt mehrere Leseverbindungen
  • Unterstützt rohe SQL-Abfragen.
  • Stand 15. Mai 2023:
    • Auf NPM wurde Sequelize “vor 14 Tagen” zuletzt aktualisiert und erhält 1.505.835 wöchentliche Downloads.
    • Auf GitHub wurde Sequelize “gestern” zuletzt aktualisiert, hat 4,2k Forks und 27,9k Sterne.
    • 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:

  • Modell-/Schema-Darstellung kann sehr komplex und aufgebläht werden. Zum Beispiel betrug die Mongoose-Darstellung unseres großen Datensatzes etwa 262 Zeilen (einschließlich Leerzeichen). Der gleiche Datensatz, der durch Sequelize dargestellt wird, umfasst 564 Zeilen (einschließlich Leerzeichen).
  • Die Syntax für Sequelize wird in bestimmten Fällen wirklich verwirrend und kompliziert.
  • Die Migration Ihrer Datenbank (Bearbeitung) ist sehr mühsam. Sie können sequelize-cli verwenden, um ein JavaScript-Migrationsvorlagenskript zu generieren. ABER, dies scheint in fast allen ORMs der gleiche Fall zu sein. Die Migration in einer relationalen Datenbank ist in den meisten Fällen nicht einfach.
  • Die Dokumentation ist nicht besonders gut. Sie hat sich verbessert, benötigt aber immer noch Arbeit. Mit Tools wie ChatGPT ist dies jedoch nicht mehr so großes Problem wie früher, da ChatGPT ein sehr gutes Verständnis von Sequelize hat, wahrscheinlich weil Sequelize seit einem Jahrzehnt existiert.
  • Sequelize ist im Vergleich zu Prisma nicht so typensensitiv, was zu Problemen führen könnte.
  • Es unterstützt TypeScript nicht gut, was für mein Projekt kein Problem darstellt, aber für viele andere Projekte ein großes Problem sein könnte.

Prisma Vor- und Nachteile

Vorteile:

  • Hat eine eigene Schema-Sprache. Das bedeutet, dass Sie Ihr Schema/Modell einfacher und sauberer erstellen können. Zum Beispiel betrug die Mongoose-Darstellung unseres großen Datensatzes etwa 262 Zeilen (einschließlich Leerzeichen). Aber der gleiche Datensatz, der durch Prisma dargestellt wird, umfasst nur 221 Zeilen (einschließlich Leerzeichen).
  • Prisma hat ein CLI-Tool, das die Erstellung und Migration (Änderung) Ihrer Datenbank erleichtert. Was sehr praktisch ist. Es ist kein Allheilmittel, aber es ist das Beste, was ich bisher von einem ORM gesehen habe.
  • Unterstützt rohe SQL-Abfragen.
  • Der Code für Prisma ist sauber und einfach. Sie müssen sich zwar immer noch in die Syntax von Prisma einarbeiten, aber sie ist viel einfacher zu verstehen als die Syntax von Sequelize.
  • Prisma hat einen Client, der automatisch Abfrage-Builder für Node.js & TypeScript generiert.
  • Die Dokumentation ist sehr, sehr gut und sauber. ChatGPT kann immer noch helfen, ist aber nicht so aktuell über Prisma wie über Sequelize.
  • Stand 15. Mai 2023:
    • Auf NPM wurde Prisma “vor 6 Tagen” zuletzt aktualisiert und erhält 1.344.705 wöchentliche Downloads.
    • Auf GitHub wurde Prisma “vor 3 Stunden” zuletzt aktualisiert, hat 1,1k Forks und 31,3k Sterne.

Nachteile:

  • Unterstützt kein Regex-Filtering für Postgres, hat aber “contains”, “includes” und “startsWith” Filteroptionen.
  • Aus meinen Tests ergibt sich, dass Prisma beim Erstellen der Einträge unseres großen Datensatzes in Postgres erheblich langsamer ist. Sequelize erstellte diese großen Einträge mit einer Rate von etwa 2,26 Sekunden pro Eintrag (JSON-Datei). Während Prisma eine Rate von etwa 11,21 Sekunden pro Eintrag (JSON-Datei) hatte. Basierend auf diesen Ergebnissen ist Prisma bei dieser Aufgabe etwa 5x langsamer als Sequelize.
  • Auch das Löschen eines Eintrags aus dem großen Datensatz führte zu einer Wartezeit von fast 4 Minuten, was sehr, sehr schlecht ist.
  • Sequelize war bei der Löschung eines Eintrags im größten und komplexesten Datensatz in meinen Tests viel schneller. Sequelize hatte keinen Vorteil gegenüber Prisma, wenn es um den Aufbau des Datensatzes ging. Beide mussten sich mit einer dreischichtigen Beziehung für diesen großen Datensatz auseinandersetzen, 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 Dollar an Finanzierung ist. In Anbetracht dessen ist der Haupt-ORM-Code/Paket von Prisma Open Source mit einer Apache-2.0-Lizenz. Das ist schön, aber da Prisma Investoren hat, wäre ich nicht überrascht, wenn sie bei ihrer Lizenz ähnlich wie MongoDB vorgehen.

Quellen