Sequelize vs Prisma
Başlangıç
Şu anda eBay’de, iç araçlarımızı MongoDB’den Postgres’e geçirmekteyim. Çok zor bir proje ama bu zorluğun üstesinden gelmek için heyecanlıyım. Araştırma yaparken, kod tabanımız için bir ORM kullanmanın en iyisi olacağına karar verdim çünkü kod tabanı zaten Mongoose kullanacak şekilde tasarlanmıştı. Ama şimdi sorun şu, kod tabanımız için en iyi ORM hangisi olacak? Bu blogda bu sorunun üzerine gideceğim. İşverenimle olan ilişkim nedeniyle bu blogda her şeyi açıklayamam.
Gereksinimler
Projenin ihtiyaçlarını dikkatlice analiz ettikten sonra, herhangi bir ORM çözümünün karşılaması gereken aşağıdaki temel kriterleri belirledim:
- JavaScript paketi olmalı; çünkü kodun çoğu JavaScript ile yazılmıştır
- Postgres’i ve çoğu özelliğini desteklemelidir
- Performansı en az Mongoose ile eşit veya daha iyi olmalıdır
- Açık kaynak olmalı ve bakımı yapılmalıdır
ORM’ler
Birçok araştırma yaptıktan sonra, gereksinimlere uyan en iyi üç ORM’nin Sequelize, Prisma ve TypeORM olduğunu belirledim. Sonunda, üç farklı ORM’yi tam olarak test edecek zamanım olmadığı için sadece Sequelize ve Prisma’ya odaklanmaya karar verdim.
Test Ortamı
Test ortamım için, Postgres’i Docker üzerinden çalıştırdım. En büyük ve en karmaşık veri setimizi aldım, bunu bir belge yapısından bir tablo yapısına dönüştürdüm ve yerel Postgres örneğime ekledim. Veri setini sütunlar, bire-bir ilişkiler, bire-çok ilişkiler ve bazı JSONB sütunları kullanarak dönüştürdüm.
Oradan, o belirli ORM’yi kullanan JavaScript kodu yazacak ve ölçüm yapacaktım:
- Bir giriş oluşturmanın ne kadar süreceği
- Bir girişi güncellemenin ne kadar süreceği
- İç içe bir girişi (ilişki ve/veya JSON’daki anahtar-değer) güncellemenin ne kadar süreceği
- Bir girişi silmenin ne kadar süreceği
- Bir girişi sorgulamanın/ne kadar süreceği
Her ORM test ortamı için repos oluşturduğum. Bu reposları paylaşmayı çok isterdim ama teknik olarak eBay’e ait oldukları için paylaşamam.
Sonuçlar
15 Mayıs 2023 civarında, Sequelize’ın kullanım durumumuz için daha iyi bir ORM olduğuna ve MongoDB’den Postgres’e geçişimiz için kullanılacak ORM olacağına karar verdim. Sonuç olarak, Sequelize’ı seçtim çünkü:
- “Gerçekten açık kaynak” ve finanse edilen bir girişim tarafından bakım yapılmıyor.
- Postgres’in çoğu özelliğini destekliyordu.
- Özellikle Prisma ile karşılaştırıldığında iyi bir performansa sahipti.
- İyi bir belgeleri var, ancak Prisma’nın belgeleri kadar iyi değil.
Sequelize’da karar kıldım, ama aynı zamanda test ettiğim her ORM için artı ve eksiler listesi de hazırladım, umarım bu, insanların Sequelize veya Prisma’nın kullanım durumları için işe yarayıp yaramayacağını daha iyi belirlemelerine yardımcı olur.
Sequelize Artıları ve Eksileri
Artılar:
- Sizin için otomatik olarak tabloları oluşturan ve yöneten bir sync() fonksiyonu var
- Karmaşık birleştirmeleri (iç içe veriler) yönetebilir
- Birçok filtreleme seçeneğini destekler (örneğin Regex)
- Model/şema temsili, son derece özelleştirilebilir sınıflar kullanarak ham JavaScript ile yapılır.
- Sequelize, seçtiğiniz veritabanı(lar) için bağlantıları yönetir.
- Sequelize, birden fazla okuma bağlantısını destekler
- Ham SQL sorgularını destekler.
- 15 Mayıs 2023 itibarıyla:
- NPM’de, Sequelize son olarak “14 gün önce” güncellendi ve haftada 1,505,835 indirme alıyor.
- GitHub’da, Sequelize son olarak “dün” güncellendi, 4.2k Forks ve 27.9k Stars’a sahip.
- Sequelize, MIT lisansına sahiptir ve 10 yıldan fazla bir süredir açık kaynak olmuştur. Bu nedenle, muhtemelen yakın gelecekte açık kaynak kalmaya devam edecektir.
Eksiler:
- Model/şema temsili çok karmaşık ve şişkin hale gelebilir. Örneğin, büyük veri setimizin Mongoose temsili yaklaşık 262 satır (boşluklar dahil) idi. Aynı veri setinin Sequelize ile temsili 564 satır (boşluklar dahil) oldu.
- Sequelize için sözdizimi bazı durumlarda gerçekten kafa karıştırıcı ve karmaşık hale geliyor.
- Veritabanınızı taşımak (düzenlemek) çok zahmetli. JavaScript göç şablonları oluşturmak için sequelize-cli kullanabilirsiniz. AMA, bu durum neredeyse tüm ORM’ler için aynı gibi görünüyor. İlişkisel bir veritabanında göç yapmak çoğu durumda kolay değildir.
- Belgeler o kadar iyi değil. Daha iyi hale geldi ama hala çalışmaya ihtiyaç var. Ancak ChatGPT gibi araçlarla, bu artık geçmişteki kadar büyük bir sorun değil çünkü ChatGPT’nin Sequelize hakkında çok iyi bir anlayışı var, muhtemelen Sequelize on yıldır var olduğu için.
- Sequelize, Prisma ile karşılaştırıldığında o kadar tür duyarlı değildir, bu da sorunlara yol açabilir.
- TypeScript’i iyi desteklemiyor, bu benim projem için bir sorun değil ama birçok diğer proje için büyük bir sorun olabilir.
Prisma Artıları ve Eksileri
Artılar:
- Kendi şema diline sahiptir. Bu, şemanızı/modelinizi daha kolay ve temiz bir şekilde oluşturabileceğiniz anlamına gelir. Örneğin, büyük veri setimizin Mongoose temsili yaklaşık 262 satır (boşluklar dahil) idi. Ama Prisma ile temsil edilen aynı veri seti sadece 221 satır (boşluklar dahil) oldu.
- Prisma, veritabanınızın oluşturulması ve taşınmasını (değiştirilmesini) kolaylaştıran bir CLI aracına sahiptir. Bu çok kullanışlıdır. Bu bir gümüş mermi değil ama şu ana kadar bir ORM’den gördüğüm en iyi şey.
- Ham SQL sorgularını destekler.
- Prisma’nın kodu temiz ve basittir. Prisma’nın sözdizimini öğrenip ona alışmanız gerekiyor ama Sequelize’ın sözdiziminden çok daha kolay anlaşılır.
- Prisma, Node.js ve TypeScript için otomatik olarak sorgu oluşturucuları üreten bir istemciye sahiptir.
- Belgeler çok çok iyi ve temizdir. ChatGPT hala yardımcı olabilir ama Prisma hakkında Sequelize kadar güncel değil.
- 15 Mayıs 2023 itibarıyla:
- NPM’de, Prisma son olarak “6 gün önce” güncellendi ve haftada 1,344,705 indirme alıyor.
- GitHub’da, Prisma son olarak “3 saat önce” güncellendi, 1.1k Forks ve 31.3k Stars’a sahip.
Eksiler:
-
Postgres için Regex filtrelemeyi desteklemiyor ama “içerir”, “dahil eder” ve “başlar” filtreleme seçeneklerine sahip.
-
Testlerime göre, Prisma, büyük veri setimizin girişlerini Postgres’te oluştururken önemli ölçüde daha yavaş. Sequelize, bu büyük girişleri yaklaşık 2.26 saniye hızında oluşturdu (JSON dosyası). Oysa Prisma, yaklaşık 11.21 saniye hızında oluşturdu (JSON dosyası). Bu sonuçlara dayanarak, Prisma bu görevde Sequelize’dan yaklaşık 5 kat daha yavaş.
-
Ayrıca, büyük veri setinden bir girişi silmek neredeyse 4 dakikalık bir bekleme süresine neden oldu, bu çok çok kötü.
-
Sequelize, testlerimde en büyük ve en karmaşık veri setinde bir girişi silerken çok daha hızlıydı. Veri setinin inşası söz konusu olduğunda, Sequelize’ın Prisma’ya karşı bir avantajı yoktu. Her ikisi de bu büyük veri seti için üç katman derinliğinde bir ilişkiyle başa çıkmak zorundaydı, bu yüzden adil bir karşılaştırma olduğunu söyleyebilirim.
-
Prisma bir girişimdir, yani Prisma, 56.5 milyon dolarlık bir finansmanla kâr amacı güden bir şirkettir. Bunu bilerek, Prisma’nın ana ORM kodu/paketi açık kaynak olup Apache-2.0 lisansına sahiptir. Bu güzel, ama Prisma’nın yatırımcıları olduğu için, lisanslarıyla ilgili MongoDB gibi bir durumla karşılaşmam beni şaşırtmaz.
Kaynaklar
- 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