Veri taşıma sistemlerinin karşılaştırılması ve seçimi

Veri taşıma sistemlerinin karşılaştırılması ve seçimi

Veri taşıma sistemlerinin karşılaştırılması ve seçimi

Veri modeli, geliştirme süreci sırasında değişme eğilimindedir ve bir noktada artık veritabanına karşılık gelmez. Elbette veritabanı silinebilir ve ardından ORM modele uygun yeni bir sürüm oluşturacaktır ancak bu prosedür mevcut verilerin kaybolmasına yol açacaktır. Dolayısıyla geçiş sisteminin işlevi, bir şema değişikliği sonucunda mevcut verileri kaybetmeden uygulamadaki veri modeliyle senkronize edilmesini sağlamaktır.

Bu yazıda veritabanı geçişlerini yönetmek için çeşitli araçlara bakmak istiyoruz. Bu incelemenin benzer bir seçimle karşı karşıya kalan geliştiriciler için faydalı olacağını umuyoruz.

Görev

Şirketimiz şu anda aktif olarak yeni nesil ürün olan Dokümanlar Güvenlik Paketi'ni (DSS) geliştirmektedir. Sunucu kısmı .Net Core ile yazılmış olup DBMS olarak Entity Framework Core kullanılmıştır. Bir uygulama tasarlarken Code First yaklaşımını kullanırız.

Uygulama etki alanı modeli aynı anda birden fazla geliştirici tarafından oluşturulur; her biri sistemin kendi mantıksal kısmından sorumludur.

Önceki nesil DSS, geçiş yönetimi sistemi olarak klasik Entity Framework Migrations'ı (EF 6) kullanıyordu. Bununla birlikte, ona karşı bazı şikayetler birikmiştir; bunlardan en önemlisi, EF'in sürüm çakışmalarını çözme konusunda aklı başında bir yaklaşıma sahip olmamasıdır. Desteğin bir parçası olarak hataları düzeltirken bu gerçek bizi hala üzüyor, bu yüzden alternatif seçenekleri değerlendirmeye karar verdik.

Tartışma sonucunda göç yönetim sistemi için aşağıdaki gereksinimler oluşturuldu:

  1. Çeşitli DBMS'ler için destek. MS SQL Server, PostgreSQL, Oracle gereklidir ancak diğerlerini kullanmak da potansiyel olarak mümkündür
  2. ORM'le çalışmak. Başlangıçta EF Core'un kullanılması planlanmıştı ancak tasarım aşamasında diğer ORM'leri değerlendirmeye hazırdık
  3. Geçişlerin otomatik oluşturulması. Code First'ün gelişimini dikkate alarak, geçişlerin "elle yazılması" ihtiyacını ortadan kaldırmak istiyorum
  4. Sürüm çakışmaları. Dağıtılmış bir geliştirme ortamında, birleştirme sırasında EF Core çatışmalara maruz kalabilir. Uygulamanın farklı bölümleri farklı geliştiriciler tarafından oluşturulduğundan bu önemli bir sorun haline gelir, dolayısıyla her birine çok fazla zaman harcamanız gerekir.
  5. Gelişmiş belgeler ve destek. Burada bize öyle geliyor ki hiçbir açıklamaya gerek yok
  6. Özgür. Kriter koşulludur, çünkü sistemler çok pahalı veya pahalı değildir, ancak kolaylık açısından idealdir, biz de dikkate almaya hazırdık

Küçük bir araştırma sonucunda aşağıdaki seçenekler bulundu ve değerlendirilmeye değer bulundu:

  1. EF Temel Geçişleri
  2. DBup
  3. Cezaevi
  4. ThinkingHome.Migrator
  5. akıcı göçmen

Ve şimdi biraz daha detay

Veri taşıma sistemlerinin karşılaştırılması ve seçimi
EntityFramework Temel Geçişleri

Doğal olarak bu, seçilecek ilk ve ana seçenekti. Tefle uğraşmadan kutunun dışında çalışan yerel bir enstrüman. Çok miktarda belge, resmi ve öyle değil, basitlik vb. Ancak klasik EF ile ilgili yapılan şikayetler EF Core için de oldukça geçerli.

Böylece EF Core'un avantajları vurgulanıyor:

  • Microsoft desteği, belgeler, Rusça dahil, büyük topluluk
  • CodeFirst'e dayalı olarak geçişlerin otomatik oluşturulması
  • EF 6 ile karşılaştırıldığında EF Core artık veritabanının anlık görüntüsünü saklamamaktadır. Code First'te EF Core ile çalışırken artık veritabanı dağıtmanıza gerek yok
  • Code First'ten dans ettiğimiz için gerekli tüm veri erişim sağlayıcılarına tek bir geçiş yapmak mümkün
  • Sağlayıcılarla ilgili olarak PostgreSQL desteklenir, Oracle desteklenir vb. ve hatta MS SQL Server 

Ve ayrıca dezavantajları:

  • Çatışma çözümü aynı seviyede kaldı. Geçişleri sıralamak ve veritabanı anlık görüntülerini güncellemek gerekir
  • Geçişlerin oluşturulduğu modellere bağımlılık

DbUp

Veri taşıma sistemlerinin karşılaştırılması ve seçimi
dbup.github.io

DbUp, NuGet tarafından yüklenen ve değişikliklerin SQL Server'a aktarılmasına yardımcı olan bir .NET kitaplığıdır. Hangi değişiklik komut dosyalarının halihazırda yürütülmüş olduğunu takip eder ve veritabanını güncellemek için gerekli olanları çalıştırır. Kütüphane, ASP.NET üzerinde açık kaynaklı bir blog motoruna yönelik bir projeden doğmuştur ve MIT lisansı altında bulunmaktadır ve kod GitHub'da bulunmaktadır. Geçişler T-SQL kullanılarak açıklanmaktadır.

Avantajları nelerdir:

  • Çok sayıda DBMS desteği (MS SQL Server, PstgreSQL, MySQL)
  • Komut dosyaları T-SQL'de yazıldığı için oldukça basit görünüyorlar
  • Çatışmalar SQL kullanılarak da çözülür

Ve eksileri:

  • Desteklenen tüm DBMS çeşitleriyle Oracle bunlardan biri değil
  • ORM ile etkileşime girmez
  • T-SQL komut dosyalarını elle yazmak, hedeflediğimiz şey değildi
  • Dokümantasyon ve topluluk böyledir, ancak SQL komut dosyalarının yazılması açısından gerekli olmayabilir.

Cezaevi

Veri taşıma sistemlerinin karşılaştırılması ve seçimi
github.com/chucknorris/roundhouse

Apache 2.0 lisansı altında dağıtılan bu geçiş yönetimi aracı, önceki araç gibi T-SQL geçiş motorunda çalışır. Görünen o ki geliştiriciler rahat bir geliştirme süreci yaratmaktan ziyade DBMS desteğiyle ilgili teknik sorunları çözmeye öncelik vermişler.

Artıları:

  • Gerekli DBMS'yi destekler (Oracle dahil)

Eksileri:

  • Oracle (ve bizim için alakasız olan Access) .NET Core'da desteklenmez, yalnızca .NET Full Framework'te desteklenir
  • ORM ile çalışmıyor
  • Önceki araca göre daha az belge var
  • Tekrar ediyorum; geçişler komut dosyaları tarafından yazılıyor

ThinkingHome.Migrator

Veri taşıma sistemlerinin karşılaştırılması ve seçimi

MIT lisansı altında dağıtılan, .NET Core platformuna sürümlendirilmiş veritabanı şeması geçişi için bir araç. Geliştiricinin kendisi neredeyse bir yıl önce en son sürümü hakkında yazdı.

Artıları:

  • .NET Core için tasarlandı
  • Dallara ayrılan bir geçiş dizisi uygulandı
  • Geçiş günlüğü uygulandı

Eksileri:

  • En son bir yıl önce güncellendi. Görünüşe göre proje desteklenmiyor
  • Oracle tarafından desteklenmiyor (makalede bunun .NET Core için kararlı bir uygulama eksikliğinden kaynaklandığı belirtiliyor - ancak bu bir yıl önceydi)
  • Otomatik geçiş oluşturma yok

Genel olarak proje umut verici görünüyor, özellikle de gelişecekse, ancak burada ve şimdi bir karar vermemiz gerekiyordu.

akıcı göçmen

Veri taşıma sistemlerinin karşılaştırılması ve seçimi
github.com/fluentmigrator/fluentmigrator

Geniş bir hayran kitlesine sahip en popüler geçiş aracı. Apache 2.0 lisansı altında dağıtılmaktadır. Açıklamada belirtildiği gibi, Ruby on Rails Migrations'a benzer şekilde .NET için bir geçiş çerçevesidir. Veritabanı şemasındaki değişiklikler C# sınıflarında açıklanmaktadır.

Burada avantajlar var:

  • Gerekli DBMS desteği
  • .NET Çekirdek desteği
  • Büyük gelişmiş topluluk
  • Geçişler arasındaki çakışmalar sırayla çözümlenir; geçişlerin yürütülme sırası belirtilir. Ek olarak, bir varlık etrafında bir çatışma ortaya çıkarsa, kodu birleştirirken bu, kodun geri kalanında olduğu gibi çözülür.
  • Başarılı bir geçişin ardından yürütülen profiller var. Ve servis fonksiyonlarını taşıyabiliyorlar.Son güncelleme bir ay önceydi yani proje hayatta

Eksilere gelince, işte bunlar:

  • Otomatik geçiş oluşturma yok
  • EF modelleriyle bağlantı yok
  • Veritabanı anlık görüntüsü yok

Seçimimiz neydi?

Veri taşıma sistemlerinin karşılaştırılması ve seçimi

Hararetli tartışmalar iki parametre etrafında dönüyordu: göçlerin otomatik olarak oluşması ve çatışmaların akılcı bir şekilde çözülmesi. Diğer faktörler çok daha az korkutucuydu. Sonuç olarak ekip, tartışmanın sonuçlarına göre yeni projede Fluent Migrator'ı kullanmaya karar verdi. Çünkü gelecekte çatışmaların çözülmesi çok daha fazla fayda sağlayacaktır.

Bulgular

Elbette mükemmel araçlar yoktur. Bu yüzden bir seçim yapmak için “isteklerimize” öncelik vermemiz gerekiyordu. Ancak diğer ekipler ve diğer görevler için başka faktörler belirleyici olabilir. Bu makalenin bir seçim yapmanıza yardımcı olacağını umuyoruz.

Kaynak: habr.com

Yorum ekle