Sequelize vs Prisma
Inizio
Attualmente, presso eBay, sto migrando i nostri strumenti interni dall’uso di MongoDB a Postgres. Un progetto molto difficile ma che affronto con entusiasmo. Durante la ricerca, ho determinato che per il nostro codebase sarebbe meglio usare un ORM poiché il codebase era già progettato per usare Mongoose. Ma ora la sfida è: quale ORM sarebbe il migliore per il nostro codebase? In questo blog, approfondirò quella domanda. Si prega di notare che non posso divulgare tutto in questo blog a causa della natura del mio contatto con il mio datore di lavoro.
Requisiti
Dopo un’attenta analisi delle esigenze del progetto, ho stabilito i seguenti criteri essenziali che qualsiasi soluzione ORM avrebbe bisogno di soddisfare:
- Essere un pacchetto JavaScript; dato che la maggior parte del codice è scritta in JavaScript
- Deve supportare Postgres e la maggior parte delle sue funzionalità
- Le sue prestazioni devono essere almeno alla pari o migliori di Mongoose
- Deve essere open source e mantenuto
ORM
Dopo molte ricerche, ho determinato che i primi tre ORM che soddisfano i requisiti sono: Sequelize, Prisma e TypeORM. Alla fine ho deciso di concentrarmi solo su Sequelize e Prisma perché non avevo tempo per testare completamente tre diversi ORM a causa delle scadenze.
Ambiente di test
Per il mio ambiente di test, ho eseguito Postgres tramite Docker. Ho preso il nostro dataset più grande e più complesso, l’ho convertito da una struttura a documenti a una struttura a tabelle e l’ho aggiunto alla mia istanza Postgres locale. Ho convertito il dataset utilizzando colonne, relazioni uno-a-uno, relazioni uno-a-molti e alcune colonne JSONB.
Da lì, ho scritto codice JavaScript che utilizzava quell’ORM specifico e ho misurato:
- Quanto tempo ci voleva per creare una voce
- Quanto tempo ci voleva per aggiornare una voce
- Quanto tempo ci voleva per aggiornare una voce nidificata (relazione e/o coppia chiave-valore in un JSON)
- Quanto tempo ci voleva per eliminare una voce
- Quanto tempo ci voleva per interrogare/ottenere una voce
Ho creato repository per ogni ambiente di test dell’ORM. Mi piacerebbe condividere questi repository ma sono tecnicamente di proprietà di eBay, quindi non posso condividerli.
Risultati
Intorno al 15 maggio 2023, ho deciso che Sequelize era l’ORM migliore per il nostro caso d’uso e che sarebbe stato l’ORM utilizzato per la nostra migrazione da MongoDB a Postgres. Alla fine, ho scelto Sequelize perché:
- Era “veramente open source” e non mantenuto da una startup finanziata.
- Supportava la maggior parte delle funzionalità di Postgres.
- Aveva buone prestazioni, specialmente rispetto a Prisma.
- Ha una buona documentazione, anche se non è documentata bene come la documentazione di Prisma.
Ho scelto Sequelize, ma ho anche stilato una lista di pro e contro per ogni ORM che ho testato nella speranza che possa aiutare le persone a determinare meglio se Sequelize o Prisma funzionerebbero per il loro caso d’uso.
Pro e Contro di Sequelize
Vantaggi:
- Ha una funzione sync() che crea automaticamente e gestisce le tabelle per te
- Può gestire join complessi (dati nidificati)
- Supporta molte opzioni di filtraggio (come le Regex)
- La rappresentazione del modello/schema è fatta in JavaScript puro usando classi altamente personalizzabili.
- Sequelize gestisce le connessioni per il/i database selezionato/i.
- Sequelize supporta più connessioni di sola lettura
- Supporta query SQL raw.
- Al 15 maggio 2023:
- Su NPM, Sequelize è stato aggiornato l’ultima volta “14 giorni fa” e riceve 1,505,835 download settimanali.
- Su GitHub, Sequelize è stato aggiornato l’ultima volta “ieri”, ha 4.2k Fork e 27.9k Stelle.
- Sequelize ha una licenza MIT ed è open source da oltre 10 anni. Quindi molto probabilmente resterà open source per il prossimo futuro.
Svantaggi:
- La rappresentazione del modello/schema può diventare molto complessa e ingombrante. Per esempio, la rappresentazione in Mongoose del nostro grande dataset era di circa 262 righe (inclusi gli spazi). Lo stesso dataset rappresentato tramite Sequelize è di 564 righe (inclusi gli spazi).
- La sintassi per Sequelize diventa davvero confusa e complicata in alcuni casi.
- Migrare il tuo database (modificarlo) è molto fastidioso. Puoi usare sequelize-cli per generare script di template di migrazione in JavaScript. PERÒ, questo sembra essere lo stesso caso in quasi tutti gli ORM. Migrare in un database relazionale non è facile nella maggior parte dei casi.
- La documentazione non è eccezionale. È migliorata ma necessita ancora di lavoro. Ma con strumenti come ChatGPT, questo non è un problema così grande come lo era, poiché ChatGPT ha una comprensione molto buona di Sequelize molto probabilmente dovuto al fatto che Sequelize esiste da un decennio.
- Sequelize non è sensibile ai tipi quanto Prisma, il che potrebbe portare a problemi.
- Non supporta TypeScript molto bene, il che per il mio progetto non è un problema ma per molti altri progetti potrebbe essere un grosso problema.
Pro e Contro di Prisma
Vantaggi:
- Ha un proprio linguaggio di schema. Questo significa che puoi creare il tuo schema/modello in modo più semplice e pulito. Per esempio, la rappresentazione in Mongoose del nostro grande dataset era di circa 262 righe (inclusi gli spazi). Ma lo stesso dataset rappresentato da Prisma era solo di 221 righe (inclusi gli spazi).
- Prisma ha uno strumento CLI che facilita la creazione e la migrazione (modifica) del tuo database. Il che è molto comodo. Non è una soluzione miracolosa ma è la cosa migliore che abbia visto finora da un ORM.
- Supporta query SQL raw.
- Il codice per Prisma è pulito e semplice. Devi comunque imparare e abituarti alla sintassi di Prisma ma è molto più facile da capire rispetto alla sintassi di Sequelize.
- Prisma ha un client che genera automaticamente builder di query per Node.js e TypeScript.
- La documentazione è molto, molto buona e chiara. ChatGPT può ancora aiutare ma non è aggiornato su Prisma come lo è su Sequelize.
- Al 15 maggio 2023:
- Su NPM, Prisma è stato aggiornato l’ultima volta “6 giorni fa” e riceve 1,344,705 download settimanali.
- Su GitHub, Prisma è stato aggiornato l’ultima volta “3 ore fa”, ha 1.1k Fork e 31.3k Stelle.
Svantaggi:
- Non supporta il filtraggio con Regex per Postgres ma ha opzioni di filtro come “contains”, “includes” e “startsWith”.
- Dai miei test, Prisma è significativamente più lento nella creazione delle voci del nostro grande dataset in Postgres. Sequelize ha creato quelle grandi voci a una velocità di circa 2,26 secondi per voce (file JSON). Mentre Prisma aveva una velocità di circa 11,21 secondi per voce (file JSON). Sulla base di questi risultati, Prisma è circa 5 volte più lento di Sequelize in questo compito.
- Inoltre, eliminare una voce dal grande dataset ha comportato un tempo di attesa di quasi 4 minuti, il che è molto, molto grave.
- Sequelize è stato molto più veloce nell’eliminare una voce nel dataset più grande e complesso nei miei test. Sequelize non ha avuto un vantaggio su Prisma quando si è trattato della costruzione del dataset. Entrambi hanno dovuto gestire una relazione a tre livelli per questo grande dataset, quindi direi che è stato un confronto equo.
- Prisma è una startup, il che significa che Prisma è una società a scopo di lucro con 56,5 milioni di dollari di finanziamenti. Sapendo questo, il codice/pacchetto principale ORM di Prisma è open source con una licenza Apache-2.0. Questo è bello, ma dato che Prisma ha investitori, non mi sorprenderei se facessero qualcosa di simile a MongoDB quando si tratta della loro licenza.
Fonti
- 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