Sequelize ve Prisma
Başlangıç
Şu anda eBay’de, dahili araçlarımızı MongoDB kullanmaktan Postgres’e geçiriyorum. Çok zor ama doğrudan üstlenmekten heyecan duyduğum bir proje. Araştırma yaparken, kod tabanımız zaten Mongoose kullanacak şekilde tasarlanmış olduğundan, kod tabanımız için bir ORM kullanmanın en iyisi olacağına karar verdim. Ama şimdi zorluk şu: kod tabanımız için hangi ORM en iyisi olur? Bu yazıda bu soruyu ele alacağım. Lütfen, işverenimle olan ilişkim niteliği nedeniyle bu blogda her şeyi açıklayamayacağımı unutmayın.
Gereksinimler
Projenin ihtiyaçlarının dikkatli bir analizinden sonra, herhangi bir ORM çözümünün karşılaması gereken aşağıdaki temel ölçütleri belirledim:
- JavaScript paketi olmak; çünkü kodun çoğu JavaScript ile yazılmıştır
- Postgres’i ve onun özelliklerinin çoğunu desteklemeli
- Performansı en az Mongoose kadar iyi, ya da daha iyi olmalı
- Açık kaynaklı ve bakımı yapılıyor olmalı
ORM’ler
Çok fazla araştırma yaptıktan sonra, gereksinimlere uyan ilk üç ORM’in şunlar olduğunu belirledim: Sequelize, Prisma ve TypeORM. Sonunda yalnızca Sequelize ve Prisma’ya odaklanmaya karar verdim çünkü teslim tarihlerinden dolayı üç farklı ORM’i tamamen test edecek zamanım yoktu.
Test Ortamı
Test ortamım için Postgres’i Docker üzerinden çalıştırdım. En büyük ve en karmaşık veri kümeğimizi aldım, onu bir belge yapısından tablo yapısına dönüştürdüm ve yerel Postgres örneğime ekledim. Veri kümesini 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’i kullanan JavaScript kodu yazacak ve şunları ölçecektim:
- 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 güncellemenin ne kadar süreceği (bir ilişki ve/veya bir JSON içindeki anahtar-değer)
- Bir girişi silmenin ne kadar süreceği
- Bir girişi sorgulamanın/almanın ne kadar süreceği
Her ORM test ortamı için depolar oluşturdum. Bu depoları paylaşmayı çok isterdim ama teknik olarak eBay’e aitler, bu yüzden paylaşamam.
Sonuçlar
Yaklaşık 15 Mayıs 2023’te, Sequelize’in kullanım senaryomuz için daha iyi ORM olduğuna ve MongoDB’den Postgres’e geçişimizde kullanılacak ORM olacağına karar verdim. Sonuç olarak Sequelize’i seçtim çünkü:
- “Gerçekten açık kaynaklıydı” ve fonlanan bir girişim tarafından sürdürülmüyordu.
- Postgres’in özelliklerinin çoğunu destekliyordu.
- Özellikle Prisma ile karşılaştırıldığında iyi performansa sahipti.
- İyi dokümantasyona sahip, ancak Prisma’nın belgeleri kadar iyi belgelenmiş değil.
Sequelize üzerinde karar kıldım, ancak Sequelize veya Prisma’nın kullanım senaryonuz için uygun olup olmadığını insanların daha iyi belirlemesine yardımcı olacağını umarak test ettiğim her ORM için bir artılar ve eksiler listesi de derledim.
Sequelize Artıları ve Eksileri
Artıları:
- Sizin için tabloları otomatik olarak oluşturan ve yöneten bir sync() işlevine sahiptir
- Karmaşık join’leri (iç içe verileri) işleyebilir
- Çok sayıda filtreleme seçeneğini destekler (Regex gibi)
- Model/şema gösterimi, son derece özelleştirilebilir sınıflar kullanılarak ham JavaScript içinde yapılır.
- Sequelize, seçtiğiniz veritabanı/veritabanları 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 en son “14 gün önce” güncellendi ve haftalık 1.505.835 indirme alıyor.
- GitHub’da Sequelize en son “dün” güncellendi, 4.2k Fork ve 27.9k Yıldız’a sahip.
- Sequelize’in MIT lisansı vardır ve 10 yıldan uzun süredir açık kaynaktır. Bu nedenle, öngörülebilir gelecek için büyük olasılıkla açık kaynak olarak kalacaktır.
Eksileri:
- Model/şema gösterimi çok karmaşık ve şişkin hale gelebilir. Örneğin, büyük veri kümemizin Mongoose gösterimi yaklaşık 262 satırdı (boşluklar dahil). Aynı veri kümesi Sequelize üzerinden gösterildiğinde 564 satırdı (boşluklar dahil).
- Sequelize sözdizimi bazı durumlarda gerçekten kafa karıştırıcı ve karmaşık hale gelir.
- Veritabanınızı taşımak (düzenlemek) çok zahmetlidir. JavaScript geçiş şablonu betikleri oluşturmak için sequelize-cli kullanabilirsiniz. AMA bu, neredeyse tüm ORM’lerde aynı durum gibi görünüyor. İlişkisel bir veritabanında taşımak çoğu durumda kolay değildir.
- Dokümantasyon o kadar iyi değil. Daha iyi hale geldi ama hâlâ çalışmaya ihtiyaç duyuyor. Ancak ChatGPT gibi araçlarla bu, eskisi kadar büyük bir sorun değil çünkü ChatGPT’nin Sequelize’i çok iyi anlamasının nedeni büyük olasılıkla Sequelize’in on yıldır var olmasıdır.
- Sequelize, Prisma’ya kıyasla tür duyarlılığı açısından o kadar iyi değildir; bu da sorunlara yol açabilir.
- TypeScript’i iyi desteklemez; bu benim projem için sorun değil ama birçok başka 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 daha temiz bir şekilde oluşturabileceğiniz anlamına gelir. Örneğin, büyük veri kümemizin Mongoose gösterimi yaklaşık 262 satırdı (boşluklar dahil). Ancak aynı veri kümesi Prisma tarafından gösterildiğinde yalnızca 221 satırdı (boşluklar dahil).
- Prisma, veritabanınızı oluşturma ve taşıma (değiştirme) sürecini daha kolay hale getiren bir CLI aracına sahiptir. Bu da oldukça kullanışlıdır. Mükemmel çözüm değildir ama bir ORM’den şimdiye kadar gördüğüm en iyi şey bu.
- Ham SQL sorgularını destekler.
- Prisma’nın kodu temiz ve basittir. Yine de Prisma’nın sözdizimini öğrenmeniz ve ona alışmanız gerekir ama Sequelize’inkinden anlaması çok daha kolaydır.
- Prisma’nın Node.js ve TypeScript için otomatik olarak sorgu oluşturucular üreten bir istemcisi vardır.
- Dokümantasyon çok çok iyi ve temizdir. ChatGPT yine de yardımcı olabilir ancak Prisma konusunda Sequelize’e kıyasla o kadar güncel değildir.
- 15 Mayıs 2023 itibarıyla:
- NPM’de Prisma en son “6 gün önce” güncellendi ve haftalık 1.344.705 indirme alıyor.
- GitHub’da Prisma en son “3 saat önce” güncellendi, 1.1k Fork ve 31.3k Yıldız’a sahip.
Eksileri:
- Postgres için Regex filtrelemeyi desteklemez, ancak “contains”, “includes” ve “startsWith” filtre seçeneklerine sahiptir.
- Testlerime göre Prisma, büyük veri kümemizin girişlerini Postgres’te oluştururken önemli ölçüde daha yavaştır. Sequelize bu büyük girişleri giriş başına yaklaşık 2,26 saniye hızla oluşturdu (JSON dosyası). Prisma ise giriş başına yaklaşık 11,21 saniye hızına sahipti (JSON dosyası). Bu sonuçlara göre Prisma, bu görevde Sequelize’den yaklaşık 5 kat daha yavaştır.
- Ayrıca, büyük veri kümesinden bir girişi silmek neredeyse 4 dakikalık bir bekleme süresiyle sonuçlandı, ki bu çok çok kötüdür.
- Testlerimdeki en büyük ve en karmaşık veri kümesinde bir girişi silme konusunda Sequelize çok daha hızlıydı. Veri kümesinin oluşturulması söz konusu olduğunda Sequelize’in Prisma’ya karşı bir avantajı yoktu. İkisi de bu büyük veri kümesi için üç katman derinliğinde bir ilişkiyle uğraşmak zorundaydı, bu yüzden bunun adil bir karşılaştırma olduğunu söyleyebilirim.
- Prisma bir girişimdir; yani Prisma, 56,5 milyon dolar fonlamaya sahip kâr amacı güden bir şirkettir. Bunu bilerek, Prisma’nın ana ORM kodu/paketi Apache-2.0 lisansı ile açık kaynaklıdır. Bu güzel, ancak Prisma’nın yatırımcıları olduğu için, lisans konusunda bir MongoDB hamlesi yapmalarına şaşırmam.
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