Sequelize vs Prisma

Mulai

Saat ini di eBay, saya sedang memigrasikan alat internal kami dari menggunakan MongoDB ke Postgres. Sebuah proyek yang sangat sulit tetapi saya antusias untuk menghadapinya secara langsung. Saat melakukan riset, saya menentukan bahwa untuk basis kode kami, menggunakan ORM akan menjadi yang terbaik karena basis kode tersebut memang sudah dirancang untuk menggunakan Mongoose. Tetapi sekarang tantangannya adalah, ORM mana yang akan paling baik untuk basis kode kami? Dalam blog ini, saya akan membahas pertanyaan itu. Harap dicatat bahwa saya tidak dapat mengungkapkan semuanya dalam blog ini karena sifat hubungan saya dengan pemberi kerja saya.

Persyaratan

Setelah analisis cermat terhadap kebutuhan proyek, saya menetapkan kriteria penting berikut yang harus dipenuhi oleh solusi ORM apa pun:

  • Menjadi paket JavaScript; karena sebagian besar kode ditulis dalam JavaScript
  • Harus mendukung Postgres dan sebagian besar fiturnya
  • Kinerjanya harus setidaknya setara atau lebih baik daripada Mongoose
  • Harus bersumber terbuka dan dipelihara

ORM

Setelah melakukan banyak riset, saya menentukan tiga ORM teratas yang sesuai dengan persyaratan adalah: Sequelize, Prisma, & TypeORM. Pada akhirnya saya memutuskan untuk hanya fokus pada Sequelize dan Prisma karena saya tidak punya waktu untuk menguji tiga ORM yang berbeda secara menyeluruh karena tenggat waktu.

Lingkungan Pengujian

Untuk lingkungan pengujian saya, saya menjalankan Postgres melalui Docker. Saya mengambil kumpulan data terbesar dan paling kompleks kami, mengubahnya dari struktur dokumen menjadi struktur tabel, dan menambahkannya ke instans Postgres lokal saya. Saya mengonversi kumpulan data tersebut dengan menggunakan kolom, relasi satu-ke-satu, relasi satu-ke-banyak, dan beberapa kolom JSONB.

Dari sana, saya akan menulis kode JavaScript yang menggunakan ORM tertentu itu dan mengukur:

  • Berapa lama waktu yang dibutuhkan untuk membuat entri
  • Berapa lama waktu yang dibutuhkan untuk memperbarui entri
  • Berapa lama waktu yang dibutuhkan untuk memperbarui entri bersarang (relasi dan/atau pasangan nilai-kunci dalam JSON)
  • Berapa lama waktu yang dibutuhkan untuk menghapus entri
  • Berapa lama waktu yang dibutuhkan untuk mengkueri/mengambil entri

Saya membuat repo untuk setiap lingkungan pengujian ORM. Saya sangat ingin membagikan repo-repo ini tetapi secara teknis dimiliki oleh eBay, jadi saya tidak bisa membagikannya.

Hasil

Sekitar 15 Mei 2023, saya memutuskan bahwa Sequelize adalah ORM yang lebih baik untuk kasus penggunaan kami dan bahwa ORM itu akan digunakan untuk migrasi kami dari MongoDB ke Postgres. Pada akhirnya, saya memilih Sequelize karena:

  • Itu benar-benar “bersumber terbuka” dan tidak dipelihara oleh startup yang didanai.
  • Mendukung sebagian besar fitur Postgres.
  • Memiliki performa yang baik, terutama dibandingkan dengan Prisma.
  • Memiliki dokumentasi yang bagus, meskipun tidak terdokumentasi sebaik dokumentasi Prisma.

Saya memilih Sequelize, tetapi saya juga menyusun daftar kelebihan dan kekurangan untuk setiap ORM yang saya uji dengan harapan akan membantu orang lebih baik menentukan apakah Sequelize atau Prisma akan cocok untuk kasus penggunaan Anda.

Kelebihan & Kekurangan Sequelize

Kelebihan:

  • Memiliki fungsi sync() yang secara otomatis membuat dan menangani tabel untuk Anda
  • Dapat menangani join yang kompleks (data bersarang)
  • Mendukung banyak opsi penyaringan (seperti Regex)
  • Representasi model/skema dilakukan dalam JavaScript mentah menggunakan kelas yang sangat dapat disesuaikan.
  • Sequelize menangani koneksi untuk basis data yang Anda pilih.
  • Sequelize mendukung beberapa koneksi baca
  • Mendukung kueri SQL mentah.
  • Per 15 Mei 2023:
    • Di NPM, Sequelize terakhir diperbarui “14 days ago” dan mendapatkan 1.505.835 unduhan mingguan.
    • Di GitHub, Sequelize terakhir diperbarui “yesterday”, memiliki 4.2k Fork, dan 27.9k Star.
    • Sequelize memiliki lisensi MIT dan telah bersumber terbuka selama lebih dari 10 tahun. Jadi kemungkinan besar akan tetap bersumber terbuka untuk masa mendatang.

Kekurangan:

  • Representasi model/skema bisa menjadi sangat kompleks dan membengkak. Misalnya, representasi Mongoose dari kumpulan data besar kami sekitar 262 baris (termasuk spasi). Kumpulan data yang sama yang direpresentasikan melalui Sequelize adalah 564 baris (termasuk spasi).
  • Sintaks untuk Sequelize menjadi sangat membingungkan dan rumit dalam kasus-kasus tertentu.
  • Memigrasikan basis data Anda (mengeditnya) sangat merepotkan. Anda dapat menggunakan sequelize-cli untuk menghasilkan skrip templat migrasi JavaScript. TETAPI, ini tampaknya sama di hampir semua ORM. Melakukan migrasi dalam basis data relasional tidak mudah dalam kebanyakan kasus.
  • Dokumentasinya tidak begitu bagus. Ini sudah membaik tetapi masih perlu perbaikan. Namun dengan alat seperti ChatGPT, ini bukan masalah sebesar dulu karena ChatGPT memiliki pemahaman yang sangat baik tentang Sequelize kemungkinan besar karena Sequelize sudah ada selama satu dekade.
  • Sequelize tidak sepeka tipe dibandingkan dengan Prisma, yang dapat menyebabkan masalah.
  • Itu tidak mendukung TypeScript dengan baik, yang untuk proyek saya bukan masalah tetapi untuk banyak proyek lain bisa menjadi masalah besar.

Kelebihan dan Kekurangan Prisma

Kelebihan:

  • Memiliki bahasa skema sendiri. Ini berarti Anda dapat dengan lebih mudah dan rapi membuat skema/model Anda. Misalnya, representasi Mongoose dari kumpulan data besar kami sekitar 262 baris (termasuk spasi). Tetapi kumpulan data yang sama yang direpresentasikan oleh Prisma hanya 221 baris (termasuk spasi).
  • Prisma memiliki alat CLI yang memudahkan pembuatan dan migrasi (modifikasi) basis data Anda. Ini sangat praktis. Ini bukan solusi ajaib, tetapi ini adalah hal terbaik yang sejauh ini saya lihat dari sebuah ORM.
  • Mendukung kueri SQL mentah.
  • Kode untuk Prisma bersih dan sederhana. Anda tetap harus belajar dan memahami sintaks Prisma tetapi jauh lebih mudah dipahami daripada sintaks Sequelize.
  • Prisma memiliki klien yang secara otomatis menghasilkan pembangun kueri untuk Node.js & TypeScript.
  • Dokumentasinya sangat-sangat bagus dan rapi. ChatGPT masih bisa membantu tetapi tidak seupdate Prisma seperti halnya dengan Sequelize.
  • Per 15 Mei 2023:
    • Di NPM, Prisma terakhir diperbarui “6 days ago” dan mendapatkan 1.344.705 unduhan mingguan.
    • Di GitHub, Prisma terakhir diperbarui “3 hours ago”, memiliki 1.1k Fork, dan 31.3k Star.

Kekurangan:

  • Tidak mendukung penyaringan Regex untuk Postgres tetapi memiliki opsi filter “contains”, “includes”, dan “startsWith”.
  • Dari pengujian saya, Prisma secara signifikan lebih lambat dalam membuat entri kumpulan data besar kami di Postgres. Sequelize membuat entri besar tersebut dengan kecepatan sekitar 2,26 detik per entri (berkas JSON). Sementara Prisma memiliki kecepatan sekitar 11,21 detik per entri (berkas JSON). Berdasarkan hasil ini, Prisma sekitar 5x lebih lambat daripada Sequelize untuk tugas ini.
  • Selain itu, menghapus satu entri dari kumpulan data besar menghasilkan waktu tunggu hampir 4 menit, yang sangat-sangat buruk.
  • Sequelize jauh lebih cepat dalam menghapus entri pada kumpulan data terbesar dan paling kompleks dalam pengujian saya. Sequelize tidak memiliki keunggulan atas Prisma ketika menyangkut konstruksi kumpulan data. Keduanya harus menangani relasi tiga lapis yang dalam untuk kumpulan data besar ini, jadi saya akan mengatakan itu adalah perbandingan yang adil.
  • Prisma adalah startup, yang berarti Prisma adalah perusahaan berorientasi laba dengan pendanaan $56,5 juta. Mengetahui hal ini, kode/paket ORM utama Prisma bersumber terbuka dengan lisensi Apache-2.0. Ini bagus, tetapi karena Prisma memiliki investor, saya tidak akan terkejut jika mereka melakukan seperti MongoDB dalam hal lisensi mereka.

Sumber