Sequelize vs Prisma
Mulai
Saat ini di eBay, saya sedang memigrasikan alat internal kami dari menggunakan MongoDB ke Postgres. Proyek yang sangat sulit tetapi saya bersemangat untuk menanganinya secara langsung. Saat meneliti, saya menentukan bahwa untuk basis kode kami, menggunakan sebuah ORM akan menjadi yang terbaik karena basis kode sudah dirancang untuk menggunakan Mongoose. Tetapi sekarang tantangannya adalah, ORM mana yang paling cocok untuk basis kode kami? Dalam blog ini, saya akan menyelami pertanyaan itu. Harap dicatat bahwa saya tidak dapat mengungkapkan semuanya dalam blog ini karena sifat kontak saya dengan pemberi kerja saya.
Persyaratan
Setelah analisis cermat terhadap kebutuhan proyek, saya menetapkan kriteria penting berikut yang harus dipenuhi oleh solusi ORM manapun:
- Menjadi paket JavaScript; karena sebagian besar kode ditulis dalam JavaScript
- Harus mendukung Postgres dan sebagian besar fiturnya
- Performa harus setidaknya setara atau lebih baik daripada Mongoose
- Harus sumber terbuka dan dipelihara
Beberapa ORM
Setelah melakukan banyak penelitian, 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 memiliki waktu untuk menguji tiga ORM berbeda sepenuhnya karena tenggat waktu.
Lingkungan Pengujian
Untuk lingkungan pengujian saya, saya menjalankan Postgres melalui Docker. Saya mengambil dataset terbesar dan paling kompleks kami, mengonversinya dari struktur dokumen ke struktur tabel, dan menambahkannya ke instance Postgres lokal saya. Saya mengonversi dataset tersebut dengan menggunakan kolom, relasi satu-ke-satu, relasi satu-ke-banyak, dan beberapa kolom JSONB.
Dari sana, saya menulis kode JavaScript yang menggunakan ORM tersebut dan mengukur:
- Berapa lama waktu yang dibutuhkan untuk membuat sebuah entri
- Berapa lama waktu yang dibutuhkan untuk memperbarui sebuah entri
- Berapa lama waktu yang dibutuhkan untuk memperbarui entri bersarang (relasi dan/atau pasangan kunci-nilai dalam JSON)
- Berapa lama waktu yang dibutuhkan untuk menghapus sebuah entri
- Berapa lama waktu yang dibutuhkan untuk melakukan query/mendapatkan sebuah entri
Saya membuat repo untuk setiap lingkungan pengujian ORM. Saya ingin sekali membagikan repo-repo ini tetapi secara teknis mereka 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 itu akan menjadi ORM yang digunakan untuk migrasi kami dari MongoDB ke Postgres. Pada akhirnya, saya memilih Sequelize karena:
- Itu “benar-benar sumber terbuka” dan tidak dipelihara oleh sebuah startup yang didanai.
- Mendukung sebagian besar fitur Postgres.
- Memiliki performa yang baik, terutama dibandingkan dengan Prisma.
- Memiliki dokumentasi yang baik, meskipun tidak sebaik dokumentasi Prisma.
Saya memutuskan untuk menggunakan Sequelize, tetapi saya juga menyusun daftar kelebihan dan kekurangan untuk setiap ORM yang saya uji dengan harapan akan membantu orang menentukan apakah Sequelize atau Prisma akan bekerja 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 database pilihan Anda.
- Sequelize mendukung banyak koneksi baca
- Mendukung query SQL mentah.
- Per 15 Mei 2023:
- Di NPM, Sequelize terakhir diperbarui “14 hari yang lalu” dan mendapatkan 1,505,835 unduhan mingguan.
- Di GitHub, Sequelize terakhir diperbarui “kemarin”, memiliki 4.2k Forks, dan 27.9k Stars.
- Sequelize memiliki lisensi MIT dan telah menjadi sumber terbuka selama lebih dari 10 tahun. Jadi kemungkinan besar akan tetap menjadi sumber terbuka untuk masa mendatang.
Kekurangan:
- Representasi model/skema bisa menjadi sangat kompleks dan membengkak. Misalnya, representasi Mongoose dari dataset besar kami sekitar 262 baris (termasuk spasi). Dataset yang sama yang direpresentasikan melalui Sequelize adalah 564 baris (termasuk spasi).
- Sintaks untuk Sequelize menjadi sangat membingungkan dan rumit dalam kasus tertentu.
- Memigrasikan database Anda (mengeditnya) sangat menyusahkan. Anda dapat menggunakan sequelize-cli untuk menghasilkan skrip template migrasi JavaScript. TAPI, ini tampaknya menjadi kasus yang sama di hampir semua ORM. Migrasi di database relasional tidak mudah dalam banyak kasus.
- Dokumentasinya tidak terlalu hebat. Ini telah menjadi lebih baik tetapi masih perlu pekerjaan. Namun dengan alat seperti ChatGPT, ini tidak menjadi masalah sebesar dulu karena ChatGPT kemungkinan besar memiliki pemahaman yang sangat baik tentang Sequelize kemungkinan karena Sequelize telah ada selama satu dekade.
- Sequelize tidak sepeka tipe dibandingkan Prisma, yang dapat menyebabkan masalah.
- Ini 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 lebih mudah dan bersih membuat skema/model Anda. Misalnya, representasi Mongoose dari dataset besar kami sekitar 262 baris (termasuk spasi). Tetapi dataset yang sama yang direpresentasikan oleh Prisma hanya 221 baris (termasuk spasi).
- Prisma memiliki alat CLI yang mempermudah pembuatan dan migrasi (modifikasi) database Anda. Yang sangat nyaman. Itu bukan solusi ajaib tetapi ini adalah hal terbaik yang pernah saya lihat sejauh ini dari sebuah ORM.
- Mendukung query SQL mentah.
- Kode untuk Prisma bersih dan sederhana. Anda masih harus belajar dan membiasakan diri dengan sintaks Prisma tetapi itu jauh lebih mudah dipahami daripada sintaks Sequelize.
- Prisma memiliki client yang secara otomatis menghasilkan pembangun query untuk Node.js & TypeScript.
- Dokumentasinya sangat sangat baik dan bersih. ChatGPT masih bisa membantu tetapi tidak sedetail tentang Prisma seperti halnya dengan Sequelize.
- Per 15 Mei 2023:
- Di NPM, Prisma terakhir diperbarui “6 hari yang lalu” dan mendapatkan 1,344,705 unduhan mingguan.
- Di GitHub, Prisma terakhir diperbarui “3 jam yang lalu”, memiliki 1.1k Forks, dan 31.3k Stars.
Kekurangan:
- Tidak mendukung penyaringan Regex untuk Postgres tetapi memiliki opsi penyaringan “contains”, “includes”, dan “startsWith”.
- Dari pengujian saya, Prisma secara signifikan lebih lambat dalam membuat entri dataset besar kami di Postgres. Sequelize membuat entri besar tersebut dengan laju sekitar 2.26 detik per entri (file JSON). Sementara Prisma memiliki laju sekitar 11.21 detik per entri (file JSON). Berdasarkan hasil ini, Prisma sekitar 5x lebih lambat daripada Sequelize untuk tugas ini.
- Juga, menghapus satu entri dari dataset besar menghasilkan waktu tunggu hampir 4 menit, yang sangat sangat buruk.
- Sequelize jauh lebih cepat dalam menghapus sebuah entri dalam dataset terbesar dan paling kompleks dalam pengujian saya. Sequelize tidak memiliki keuntungan dibanding Prisma ketika datang ke konstruksi dataset. Keduanya harus menangani relasi tiga lapis untuk dataset besar ini, jadi saya akan mengatakan itu perbandingan yang adil.
- Prisma adalah sebuah startup, artinya Prisma adalah perusahaan yang mencari keuntungan dengan pendanaan $56,5 juta. Mengetahui hal ini, kode/paket ORM utama Prisma bersifat sumber terbuka dengan lisensi Apache-2.0. Ini bagus, tetapi karena Prisma memiliki investor, saya tidak akan terkejut jika mereka melakukan seperti yang dilakukan MongoDB ketika menyangkut lisensi mereka.
Sumber
- 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