Sequelize vs Prisma
Inizio
Attualmente, in eBay, sto migrando i nostri strumenti interni dall’uso di MongoDB a Postgres. Un progetto molto difficile, ma che sono entusiasta di affrontare a testa alta. Durante la ricerca, ho stabilito che per la nostra base di codice, l’uso di un ORM sarebbe stato il migliore, poiché la base di codice era già stata progettata per usare Mongoose. Ma ora la sfida è: quale ORM sarebbe il migliore per la nostra base di codice? In questo blog, approfondirò questa domanda. Si prega di notare che non posso divulgare tutto in questo blog a causa della natura del mio rapporto 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 dovrebbe soddisfare:
- Essere un pacchetto JavaScript; poiché la maggior parte del codice è scritta in JavaScript
- Deve supportare Postgres e la maggior parte delle sue funzionalità
- Le sue prestazioni devono essere almeno pari o migliori di quelle di Mongoose
- Deve essere open source e mantenuto
ORM
Dopo aver fatto 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 il tempo di testare a fondo tre ORM diversi 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 complesso, l’ho convertito da una struttura a documenti a una struttura a tabelle e l’ho aggiunto alla mia istanza locale di Postgres. Ho convertito il dataset usando colonne, relazioni uno-a-uno, relazioni uno-a-molti e alcune colonne JSONB.
Da lì, avrei scritto codice JavaScript che utilizzasse quell’ORM specifico e avrei misurato:
- Quanto tempo ci vorrebbe per creare una voce
- Quanto tempo ci vorrebbe per aggiornare una voce
- Quanto tempo ci vorrebbe per aggiornare una voce nidificata (relazione e/o chiave-valore in un JSON)
- Quanto tempo ci vorrebbe per eliminare una voce
- Quanto tempo ci vorrebbe per interrogare/ottenere una voce
Ho creato repository per ogni ambiente di test ORM. Mi piacerebbe molto 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 il miglior ORM 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, soprattutto rispetto a Prisma.
- Ha una buona documentazione, anche se non documentato altrettanto bene quanto quella di Prisma.
Mi sono deciso per Sequelize, ma ho anche stilato un elenco 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 vostro caso d’uso.
Pro e Contro di Sequelize
Pro:
- Ha una funzione sync() che crea e gestisce automaticamente le tabelle per te
- Può gestire join complessi (dati nidificati)
- Supporta molte opzioni di filtraggio (come Regex)
- La rappresentazione del modello/schema è fatta in JavaScript grezzo usando classi altamente personalizzabili.
- Sequelize gestisce le connessioni per il database(i) selezionato(i).
- Sequelize supporta più connessioni di lettura
- Supporta query SQL grezze.
- 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 Star.
- Sequelize ha una licenza MIT ed è open source da oltre 10 anni. Quindi molto probabilmente rimarrà open source per il prossimo futuro.
Contro:
- La rappresentazione del modello/schema può diventare molto complessa e ingombrante. Ad esempio, la rappresentazione Mongoose del nostro grande dataset era di circa 262 righe (spazi inclusi). Lo stesso dataset rappresentato tramite Sequelize è di 564 righe (spazi inclusi).
- La sintassi di Sequelize diventa davvero confusa e complicata in certi casi.
- Migrare il database (modificarlo) è molto fastidioso. Puoi usare sequelize-cli per generare script modello di migrazione JavaScript. MA, questo sembra essere lo stesso caso per quasi tutti gli ORM. Migrare in un database relazionale non è facile nella maggior parte dei casi.
- La documentazione non è così buona. È migliorata ma ha ancora bisogno di lavoro. Ma con strumenti come ChatGPT, questo non è un problema così grande come una volta, visto che ChatGPT ha una comprensione molto buona di Sequelize, probabilmente grazie al fatto che Sequelize esiste da un decennio.
- Sequelize non è sensibile ai tipi quanto Prisma, il che potrebbe portare a problemi.
- Non supporta bene TypeScript, il che per il mio progetto non è un problema ma per molti altri progetti potrebbe essere un grosso problema.
Pro e Contro di Prisma
Pro:
- Ha un proprio linguaggio di schema. Questo significa che puoi creare il tuo schema/modello in modo più facile e pulito. Ad esempio, la rappresentazione Mongoose del nostro grande dataset era di circa 262 righe (spazi inclusi). Ma lo stesso dataset rappresentato da Prisma era di sole 221 righe (spazi inclusi).
- Prisma ha uno strumento CLI che rende più facile 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 grezze.
- Il codice di Prisma è pulito e semplice. Devi comunque imparare e abituarti alla sua sintassi, ma è molto più facile da capire della sintassi di Sequelize.
- Prisma ha un client che genera automaticamente costruttori di query per Node.js e TypeScript.
- La documentazione è molto, molto buona e pulita. ChatGPT può ancora aiutare, ma non è così 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 Star.
Contro:
- Non supporta il filtraggio Regex per Postgres, ma dispone delle opzioni di filtro “contains”, “includes” e “startsWith”.
- Dai miei test, Prisma è significativamente più lento nel creare le 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). In base a 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 era molto più veloce nell’eliminare una voce nel dataset più grande e più 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 profonda tre livelli per questo grande dataset, quindi direi che è stata una comparazione equa.
- Prisma è una startup, il che significa che Prisma è un’azienda a scopo di lucro con 56,5 milioni di dollari di finanziamenti. Sapendo questo, il codice/pacchetto ORM principale di Prisma è open source con una licenza Apache-2.0. Questo è bello, ma poiché Prisma ha investitori, non mi sorprenderei se facessero una 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