Sequelize versus Prisma

Begin

Momenteel migreer ik bij eBay onze interne tools van het gebruik van MongoDB naar Postgres. Een project dat erg moeilijk is, maar ik ben enthousiast om het frontaal aan te pakken. Tijdens mijn onderzoek heb ik vastgesteld dat voor onze codebase het gebruik van een ORM het beste zou zijn, aangezien de codebase al was ontworpen om Mongoose te gebruiken. Maar nu is de uitdaging: welke ORM zou het beste zijn voor onze codebase? In deze blog ga ik die vraag onderzoeken. Houd er rekening mee dat ik niet alles in deze blog kan prijsgeven vanwege de aard van mijn contact met mijn werkgever.

Vereisten

Na zorgvuldige analyse van de behoeften van het project heb ik de volgende essentiële criteria vastgesteld waaraan elke ORM-oplossing zou moeten voldoen:

  • Een JavaScript-pakket zijn; aangezien het grootste deel van de code in JavaScript is geschreven
  • Moet Postgres en de meeste van zijn functies ondersteunen
  • De prestaties moeten minstens gelijkwaardig zijn aan, of beter zijn dan, Mongoose
  • Moet open source en onderhouden zijn

ORM’s

Na veel onderzoek te hebben gedaan, heb ik vastgesteld dat de drie beste ORM’s die aan de vereisten voldoen zijn: Sequelize, Prisma, & TypeORM. Uiteindelijk heb ik besloten me alleen te richten op Sequelize en Prisma, omdat ik door deadlines niet genoeg tijd had om drie verschillende ORM’s volledig te testen.

Testomgeving

Voor mijn testomgeving draaide ik Postgres via Docker. Ik nam onze grootste en meest complexe dataset, zette die om van een documentstructuur naar een tabelstructuur en voegde die toe aan mijn lokale Postgres-instantie. Ik heb de dataset omgezet met behulp van kolommen, een-op-een-relaties, een-op-veel-relaties en enkele JSONB-kolommen.

Van daaruit schreef ik JavaScript-code die die specifieke ORM gebruikte en mat ik:

  • Hoe lang het zou duren om een vermelding aan te maken
  • Hoe lang het zou duren om een vermelding bij te werken
  • Hoe lang het zou duren om een geneste vermelding bij te werken (relatie en/of sleutel-waarde in een JSON)
  • Hoe lang het zou duren om een vermelding te verwijderen
  • Hoe lang het zou duren om een vermelding op te vragen/op te halen

Ik heb repos aangemaakt voor elke ORM-testomgeving. Ik zou deze repos graag delen, maar ze zijn technisch gezien eigendom van eBay, dus ik kan ze niet delen.

Resultaten

Rond 15 mei 2023 besloot ik dat Sequelize de betere ORM was voor onze use case en dat het de ORM zou worden die we zouden gebruiken voor onze migratie van MongoDB naar Postgres. Uiteindelijk koos ik voor Sequelize omdat:

  • Het “echt open-source” was en niet werd onderhouden door een gefinancierde startup.
  • De meeste functies van Postgres ondersteunde.
  • Goede prestaties had, vooral in vergelijking met Prisma.
  • Goede documentatie heeft, al is die niet zo goed gedocumenteerd als Prisma’s docs.

Ik koos uiteindelijk voor Sequelize, maar ik heb ook een lijst met voor- en nadelen opgesteld voor elke ORM die ik heb getest, in de hoop dat dit mensen beter helpt bepalen of Sequelize of Prisma zou werken voor hun use case.

Voor- en nadelen van Sequelize

Voordelen:

  • Heeft een sync()-functie die automatisch tabellen voor je aanmaakt en beheert
  • Kan complexe joins afhandelen (geneste gegevens)
  • Ondersteunt veel filteropties (zoals Regex)
  • Model-/schemarepresentatie gebeurt in ruwe JavaScript met behulp van klassen, die zeer aanpasbaar zijn.
  • Sequelize handelt verbindingen voor je geselecteerde database(s) af.
  • Sequelize ondersteunt meerdere leesverbindingen
  • Ondersteunt ruwe SQL-query’s.
  • Per 15 mei 2023:
    • Op NPM was Sequelize voor het laatst bijgewerkt “14 dagen geleden” en krijgt het 1.505.835 wekelijkse downloads.
    • Op GitHub was Sequelize voor het laatst bijgewerkt “gisteren”, heeft het 4,2k forks en 27,9k sterren.
    • Sequelize heeft een MIT-licentie en is al meer dan 10 jaar open source. Dus het zal naar verwachting zeer waarschijnlijk open source blijven in de nabije toekomst.

Nadelen:

  • Model-/schemarepresentatie kan erg complex en opgeblazen worden. Bijvoorbeeld: de Mongoose-representatie van onze grote dataset was ongeveer 262 regels (inclusief spaties). Dezelfde dataset, weergegeven via Sequelize, is 564 regels (inclusief spaties).
  • De syntaxis voor Sequelize wordt in bepaalde gevallen echt verwarrend en ingewikkeld.
  • Het migreren van je database (het bewerken ervan) is erg lastig. Je kunt sequelize-cli gebruiken om JavaScript-migratiesjabloonscripts te genereren. MAAR dit lijkt in bijna alle ORM’s hetzelfde te zijn. Migreren in een relationele database is in de meeste gevallen niet eenvoudig.
  • De documentatie is niet zo geweldig. Het is beter geworden, maar heeft nog steeds werk nodig. Maar met tools zoals ChatGPT is dit niet zo’n groot probleem als vroeger, aangezien ChatGPT een zeer goed begrip van Sequelize heeft, waarschijnlijk omdat Sequelize al een decennium bestaat.
  • Sequelize is minder typesensitief in vergelijking met Prisma, wat tot problemen kan leiden.
  • Het ondersteunt TypeScript niet goed, wat voor mijn project geen probleem is, maar voor veel andere projecten wel een groot probleem kan zijn.

Voor- en nadelen van Prisma

Voordelen:

  • Heeft zijn eigen schemataal. Dit betekent dat je je schema/model gemakkelijker en netter kunt maken. Bijvoorbeeld: de Mongoose-representatie van onze grote dataset was ongeveer 262 regels (inclusief spaties). Maar dezelfde dataset, weergegeven door Prisma, was slechts 221 regels (inclusief spaties).
  • Prisma heeft een CLI-tool die het gemakkelijker maakt om je database aan te maken en te migreren (aan te passen). Dat is erg handig. Het is geen wondermiddel, maar het is het beste dat ik tot nu toe van een ORM heb gezien.
  • Ondersteunt ruwe SQL-query’s.
  • De code voor Prisma is netjes en eenvoudig. Je moet nog steeds Prisma’s syntaxis leren en je daarin verdiepen, maar het is veel makkelijker te begrijpen dan Sequelize’s syntaxis.
  • Prisma heeft een client die automatisch querybuilders genereert voor Node.js & TypeScript.
  • De documentatie is erg, erg goed en overzichtelijk. ChatGPT kan nog steeds helpen, maar is niet zo up-to-date over Prisma als over Sequelize.
  • Per 15 mei 2023:
    • Op NPM was Prisma voor het laatst bijgewerkt “6 dagen geleden” en krijgt het 1.344.705 wekelijkse downloads.
    • Op GitHub was Prisma voor het laatst bijgewerkt “3 uur geleden”, heeft het 1,1k forks en 31,3k sterren.

Nadelen:

  • Ondersteunt geen Regex-filtering voor Postgres, maar heeft wel filteropties “contains”, “includes” en “startsWith”.
  • Uit mijn tests blijkt dat Prisma aanzienlijk langzamer is bij het aanmaken van vermeldingen van onze grote dataset in Postgres. Sequelize maakte die grote vermeldingen aan met een snelheid van ongeveer 2,26 seconden per vermelding (JSON-bestand). Terwijl Prisma een snelheid had van ongeveer 11,21 seconden per vermelding (JSON-bestand). Op basis van deze resultaten is Prisma ongeveer 5x langzamer dan Sequelize bij deze taak.
  • Ook resulteerde het verwijderen van één vermelding uit de grote dataset in een wachttijd van bijna 4 minuten, wat erg, erg slecht is.
  • Sequelize was veel sneller bij het verwijderen van een vermelding in de grootste en meest complexe dataset in mijn tests. Sequelize had geen voordeel ten opzichte van Prisma als het ging om de opbouw van de dataset. Beide moesten omgaan met een relatie van drie niveaus diep voor deze grote dataset, dus ik zou zeggen dat het een eerlijke vergelijking was.
  • Prisma is een startup, wat betekent dat Prisma een winstgevend bedrijf is met $56,5 miljoen aan financiering. Als je dit weet, is de hoofd-ORM-code/-pakket van Prisma open source met een Apache-2.0-licentie. Dat is mooi, maar aangezien Prisma investeerders heeft, zou het me niet verbazen als ze een MongoDB-trekje uithalen als het gaat om hun licentie.

Bronnen