Saklı yordamlar yerine ORM kullanılması nasıl önerilebilir?


31

Tüm veri erişimi için yalnızca saklı yordamları kullanan bir şirkette çalışıyorum; bu, yerel veritabanlarımızı yeni işlemler yürütmemiz gerektiğinden, senkronize tutmamızı çok sinirlendirmektedir. Geçmişte bazı temel ORM'leri kullandım ve deneyimi daha iyi ve daha temiz buluyorum. Geliştirme yöneticisine ve ekibin geri kalanına, gelecekteki gelişim için bir tür ORM kullanmayı düşündüğümüzü söylemek isterim (ekibin geri kalanı yalnızca saklı prosedürlere aşina ve hiç bir şey kullanmadı). Şu anki mimari, .NET 1.1 gibi yazılmış ve ActiveRecord'un garip bir uygulamasını kullanan ve kodların arkasındaki dosyalara aktarılan türlenmemiş DataSet'leri döndüren "tanrı sınıfları" ile yazılmış .NET 3.5'tir - sınıflar şöyle çalışır:

class Foo { 
    public bool LoadFoo() { 
        bool blnResult = false;
        if (this.FooID == 0) { 
            throw new Exception("FooID must be set before calling this method.");
        }

        DataSet ds = // ... call to Sproc
        if (ds.Tables[0].Rows.Count > 0) { 
            foo.FooName = ds.Tables[0].Rows[0]["FooName"].ToString();
            // other properties set
            blnResult = true;
        }
        return blnResult;
    }
}

// Consumer
Foo foo = new Foo();
foo.FooID = 1234;
foo.LoadFoo();
// do stuff with foo...

Herhangi bir tasarım deseninin hemen hemen hiçbir uygulaması yoktur. Herhangi bir test yoktur (başka hiç kimse birim testlerini nasıl yazacağını bilemez ve testler web sitesini manuel olarak yüklemek ve dolaşmak yoluyla yapılır). Veritabanımıza baktığımızda: 199 tablo, 13 görüntü, bir toplam 926 saklı yordam ve 93 işlev. Toplu işler veya harici şeyler için yaklaşık 30 kadar tablo kullanılır, geri kalanı çekirdek uygulamamızda kullanılır.

Bu senaryoda farklı bir yaklaşım izlemeye bile değer mi? Yalnızca "çalıştığından" beri mevcut kodu yeniden düzenlememize izin vermediğimizden ileriye taşınmaktan bahsediyorum, bu nedenle mevcut sınıfları ORM kullanmak için değiştiremeyiz, ancak bunun yerine ne kadar sıklıkla yeni modüller eklediğimizi bilmiyorum mevcut modüllere ekleme / sabitleme olduğundan, bir ORM'nin doğru yaklaşım olup olmadığından emin değilim (saklı yordamlara ve DataSet'lere çok fazla yatırım yapılır). Doğru seçim ise, birini kullanmak için vakayı nasıl sunmalıyım? Kafamın tepesinde, düşünebildiğim tek fayda, daha temiz kodlara sahip olmak (mevcut mimaride olmadığı için olmasa da) ORM'leri göz önünde bulundurarak temelde gelecekteki modüllere jant donanımı olan ORM'leri oluşturacağız, ancak eskileri hala DataSet'i kullanıyor olacaktı) ve hangi prosedür komut dosyalarının çalıştırıldığını ve hangilerinin çalıştırılması gerektiğini hatırlamak için daha az güçlük çekti. ama bu kadar ve ne kadar zorlayıcı bir tartışma olacağını nasıl bilemiyorum. Sürdürülebilirlik bir başka endişe ancak benden başka kimsenin endişelenmediği bir konu.


8
Ekibi ORM kullanmaya ikna etmekten daha fazla probleminiz var gibi. Bana göre ekibiniz bazı iyi gelişim uygulamalarından haberdar değil (tasarım desenleri, birim testleri). Bunlar, ele almanız gereken daha önemli konulardır.
Bernard

6
İronik olarak, yaklaşık 5 yıllık bir gelişim içerisinde, sadece tasarım kalıpları ve birim testleri gibi şeylerin farkında olan bir avuç insan / ekiple tanıştığımı düşünüyorum; Genellikle şirkette bu şeyleri bilen tek kişi benim.
Wayne Molina

3
@Wayne M: Bunu biraz rahatsız edici buluyorum ama bundan da şaşırmadım.
Bernard

2
Çok buldum ... bulaşık yıkarken. Bir şey önerip, “farlarda geyik” gibi bir bakış attığınızda, diğer kişinin neden bahsettiğiniz hakkında en ufak bir fikre sahip olmadığını veya neden birisinin bunu yapmayı düşündüğünü belirten bir fikir olmadığını görmek garip. Geçmişte bu birkaç kez oldu.
Wayne Molina

2
Ben Saklı Prosedürün büyük bir hayranıyım, bu yüzden yorumum önyargılı, ancak bütün öncül ile tamamen aynı fikirde değilim. ORM'den hoşlanıyorsunuz ve bunu kullanmak istiyorsanız sorun değil. Ancak takımın geri kalanı Stored procs ile iyi durumda. Neden onları istediğin şeye zorla?
Karanlık Gece

Yanıtlar:


47

Saklı yordamlar kötüdür, genellikle yavaştır ve sıradan müşteri tarafı kodu kadar etkilidirler.

[Hızlandırma genellikle, istemci ve saklı yordam arabiriminin tasarlanma biçiminden ve işlemlerin kısa, odaklanmış SQL patlamaları olarak yazılmasından kaynaklanır.]

Saklı prosedürler kod koymak için en kötü yerlerden biridir. Uygulamanızı genellikle rastgele olan kurallara göre iki dilde ve platformda böler.

[Bu soru yaklaşık -30'luk bir puana sahip olacak, çünkü çoğu kişi saklı prosedürlerin sihirli güçlere sahip olduğunu ve neden oldukları sorunlara rağmen kullanılması gerektiğini düşünüyor.

Tüm saklı prosedür kodunu müşteriye taşımak, işleri herkes için çok daha kolaylaştıracaktır.

Şema ve ORM modelini zaman zaman güncellemeniz gerekecek. Bununla birlikte, şema değişiklikleri ORM değişikliklerinden izole edilmiştir ve uygulamalar ile veritabanı şeması arasında biraz bağımsızlık sağlar.

Depolanan tüm prosedürleri yeniden yazarken test edebilecek, düzeltebilecek, bakımını yapabilecek, anlayabilecek ve uyarlayabileceksiniz. Uygulamanız aynı şekilde çalışacak ve daha az kırılgan hale gelecektir çünkü artık iki farklı teknolojiye girmiyorsunuz.

ORM'ler sihir değildir ve iyi veritabanı tasarım becerileri çalışmasını sağlamak için kesinlikle gereklidir.

Ayrıca, çok fazla müşteri SQL içeren programlar, işlem sınırları hakkında zayıf düşünme nedeniyle yavaşlayabilir. Depolanan prosedürlerin hızlı görünmesinin sebeplerinden biri, saklı prosedürlerin çok, çok dikkatli tasarım işlemlerini zorlamasıdır.

ORM'ler sihirli bir şekilde dikkatli işlem tasarımını zorlamazlar. İşlem tasarımı hala saklı yordamlar yazarken olduğu gibi dikkatli yapılmalıdır.


19
+1 çünkü saklı yordamlar çalışmak için tam bir acıdır
Gary Rowe

3
: '(Saklı yordamlarla ilgili bir sorunum yok. Bu sadece benim için başka bir soyutlama katmanı.
Mike Weller

3
Eğer SP yaratırsak, veritabanı motoru derlenmiş form olarak saklar ve mümkün olduğu kadar hızlı çalışabilmesi için çalıştırma yolu oluşturur. Ancak ORM, derlenmesi ve veritabanı altyapısı tarafından çalıştırılması gereken her zaman SQL gönderir. Saklı yordam yerine bir ORM kullanmak daha yavaş olacağını düşünüyorum.
GeliştiriciArnab

4
Komik. ORM'den saklı yordamlara geri döndük, çünkü sadece ... HIZ. Programlama için ihtiyaç duyduğumuz süre değil, bir ORM'nin nesneleri gerçekleştirme, bir nesne arama, farklı istemcilerde güncelleme gibi şeyler için ihtiyaç duyduğu süre. SP nerede bir cehennem çok daha hızlı. Bir örnek: DB'den 30.000 obje okumak, yeni bir ORM ihtiyacı var ... eh. 2 Dakika sonra zaman aşımı. Saklı yordam çağırmak ve sonucu almak - 2 saniye. Evet - bir DB'den callign'i azaltmak için disk belleği gibi pek çok püf noktası var - fakat sadece bir
ORM'nin

2
@DeveloperArnab: Bu 20 yıl önce doğru olmuş olabilir, ancak modern DB motorları oldukça sofistike ve daha önce yürütülen sorguları tanıyabilir ve uygulama planlarını yeniden kullanabilirler, günümüzde hız farkı o kadar düşüktür ki, SP'lerin ek sıkıntısını zorlaştırmaz.
whatsisname,

20

Saklı yordamlar iyidir, hızlı ve çok verimlidirler ve veriyle ilgili kodunuzu koymak için ideal yerlerdir. Tüm bu kodları müşteriye taşımak, müşteri geliştiricisi olarak sizin için işleri biraz daha kolaylaştıracak (hafifçe şema ve ORM modelini değiştirdiğinizde bunları değiştirmek zorunda kalacağınız için), ancak varolan tüm kodu kaybedeceksiniz ve Uygulamanız tüm bu sql becerilerinin kaybını göz önünde bulundurarak daha yavaş ve muhtemelen daha kırılgan.

DBA'lar orada oturuyorlar mı diye merak ediyorum "ah, her iş, müşteriyi tekrar aşağı çekmek zorundayım, bunun yerine tüm kodu DB formlarına taşımalıyız."

Sizin durumunuzda, mevcut özel ORM'yi (yani komik sınıflarınız), kod arkası kodunuzun yazılışındaki değişiklikler dışında, herhangi bir kayıpsız olarak değiştirebilmelisiniz. SP'leri çoğu (hepsi?) ORM'leri mutlu bir şekilde arayacakları şekilde tutabilirsiniz. Bu yüzden, bu "Foo" sınıflarını bir ORM ile değiştirmenizi ve oradan gitmenizi öneririm. SP'lerinizi değiştirmenizi tavsiye etmem.

PS. Arkada kodlu sınıflarda birçok ortak kodunuz var, bu da onları kendi içinde bir tasarım deseni yapar. Bir tasarım modelinin ilk etapta ne olduğunu düşünüyorsunuz? (tamam, en iyisi, hatta iyi bir olmayabilir, ama hala bir DP)

Düzenleme: ve şimdi Dapper ile , ağır bir ORM üzerindeki sıçramaların önlenmesi için herhangi bir sebep kalmadı.


3
+1, açık olan ilk adım bir ORM'ye geçmek ve mevcut saklı yordamların sonuçlarını nesnelerle eşleştirmek için kullanmaktır. Bütün bu ds.Tables[0].Rows[0]["FooName"].ToString()saçmalıklardan kurtul . Müdür saklı yordamları seviyor mu? Onları elinde tutuyor. Ancak, bu tekrarlayan tüm kazan plakası kodunu, LINQ to SQL tarafından oluşturulan bir şeye dönüştürmenin kötü bir şey olduğunu iddia etmek fiziksel olarak imkansız olurdu.
Carson63000

11
Görevinizde ne kadar "yanlış" olduğuna inanamıyorum. Kodu çekmek zorunda kalacağınız bir DBA ile karşılaştırmanız uygunsuz ve tamamen anlamsız. Her şeyden önce, veritabanı, hikayenin sonuna kadar veri depolamak ve almak için bir HİZMET olduğunu. LOGIC, adından da anlaşılacağı gibi, API kodunun bir parçası olan İş Mantığı Katmanına girer. Uygulama daha kırılgan sprocs uzaklaşıyor? Ciddi misin yoksa sadece trolling mi? TDD'de mantıksal olan bir uygulamayı ve bana ne kadar eğlenceli olduğunu söyleyin. Ayrıca ORM'ler değiştirilmek için tasarlanmamıştır. Veritabanları, çünkü onlar sadece bir HİZMET.
Matteo Mosca

5
Neden bazılarının veritabanının her şeyin kutsal olduğu bir tür kutsal toprak olduğunu düşündüğünü anlayamıyorum. Bunun hakkında düşün. Bir üçüncü taraf şirket size hizmet sunduğunda, size db'lerine doğrudan erişim sağlıyor mu, yoksa bir API'nin arkasına mı maskeliyorlar? Popüler bir örnek kullanmak için herhangi bir Google hizmetini kullanın. Siz, geliştirici, ortak API'larına bağlanırsanız, hangi veritabanının altında olduğunu veya hiçbir veritabanı olup olmadığını bile bilmiyorsunuz. Bu şekilde sağlam ve ayrık bir yazılım tasarlıyorsunuz. Veritabanlarına doğrudan uygulamalar tarafından erişilmesi amaçlanmamıştır. Bunun için orta kademeler var.
Matteo Mosca

5
@Matteo Mosca: Elbette, ama katman yazılımı DB'ye nasıl erişiyor ... DB'nin müşterisi. "istemci", "GUI" veya "masaüstü uygulaması" anlamına gelmez. Uygulama katmanlarında çok sayıda gri alan var - GUI'ye veya sunucu / işletme mantığına onaylama yapıyor musunuz? Temiz bir tasarım olması için sunucuya girmesi gerekir, ancak performans ve kullanıcı tepkisi için gerçekten kötü olacaktır. Benzer şekilde, performansı ve (bu durumda) veri doğruluğunu daha iyi hale getirdiğinde DB'ye bir miktar mantık koyarsınız.
gbjbaanb

4
Üzgünüm ama hala aynı fikirde değilim. Uygulamanızı, kullandığınız aynı DB teknolojisinin olmadığı farklı bir ortamda dağıtmanız gerektiği gün, uygulamanızın çalışamayacağı bir durumda olduğunuzu, çünkü yeni veritabanında tüm bu çarklara sahip olmadığınızdan emin olun. .. ve onları yeniden yaratsanız bile (ki bu tam bir acıdır), SQL lehçelerinin farklılıkları nedeniyle farklı olabilirler. Bir standart (SOAP veya REST gibi) ile ortaya çıkmış mantık ve onaylama ile merkezi bir API bunu çözer. sorun ve test edilebilirlik, versiyonlama ve tutarlılık ekler.
Matteo Mosca

13

Takımınızı bir uç noktadan (saklı yordamlar ve veri kümeleri) diğerine (tam gelişmiş bir ORM) yönlendirmeye çalışıyor gibi görünüyorsunuz. Veri erişim katmanınızın kod kalitesini yükseltmek için uygulayabileceğiniz, ekibinizin kabul etmeye istekli olabileceği daha fazla başka değişiklik olduğunu düşünüyorum.

Yayınladığınız yarı-pişmiş aktif kayıt uygulama kodu özellikle şık değil - anlaşılması ve uygulaması kolay olan ve .NET geliştiricileri arasında çok popüler olan Havuz Modelini araştırmanızı tavsiye ederim. Bu model genellikle ORM'lerle ilişkilendirilir ancak düz ADO.NET kullanarak depo oluşturmak da kolaydır.

DataSet's gelince - yuck! Statik (veya hatta dinamik) yazılan nesneleri döndürürseniz, sınıf kütüphanelerinizle çalışmak çok daha kolay olacaktır. Bu çizimin DataSet hakkındaki düşüncelerimi benden daha iyi açıkladığına inanıyorum .

Ayrıca, depolanmış proc'ları ORM'ye atlamadan daraltabilirsiniz - SQL parametresini kullanırken yanlış bir şey yoktur. Aslında, sunucuya çok yönlü seyahatlerde tasarruf sağlayan karmaşık prosedürler olmadıkça, saklı proc'ları kullanmayı kesinlikle tercih ederim. Eski bir veritabanını açtığımda ve CRUD prosedürlerinin sonsuz bir listesini gördüğümde de nefret ediyorum.

ORM'lerin kullanımından vazgeçmiyorum - genellikle üzerinde çalıştığım birçok projede kullanırım. Bununla birlikte, bir projeyi tanıtmak için niçin bol miktarda sürtünme olabileceğini anlayabiliyorum ve ekibinize bunu nezaket göstererek, yaklaşık 8 yıl önce yeni şeyler öğrenmeyi bırakmış gibi geliyorlar. Dapper (bu siteyi daha az çalıştırmak için kullanılan) ve " Massive " gibi yeni türlerine kesinlikle bakacağımı ve her ikisini de SQL'e daha yakın tutmak için kesinlikle kolay bir şekilde kullanacağımı söylemiştim. Normal ORM'in yaptığı ve hangi takımınızın kabullenmeye daha istekli olacağı.


2
Sanırım sorun sadece uygulama yazıldığı zamandır. .NET için gerçek ORM notları yoktu, bu yüzden başka bir yolla (ASP.NET 1.1 yolu) yapıldı ve hiç kimse bunu farklı bir şekilde yapmayı düşünmedi (ya da başka bir şey) birkaç ay önce katılana kadar.
Wayne Molina

1
Dapper için +1. Bir projede kullanmaya başladım ve uygulanması ve kullanılması son derece kolay. Ben zaten büyük bir hayranınım.
SLoret

4

Ben de benzer bir durumdayım, aslında bizim donanım, güç ve politika veritabanımıza dayanıyor, bu yüzden her şey saklı bir prosedürden geçiyor. Ne yazık ki, özellikle meta veriler ve kod oluşturma söz konusu olduğunda kodlayıcı için bir acıdır, çünkü saklı yordamlarda tablo gibi zengin meta veriler yoktur.

Ne olursa olsun, saklı işlemleri kullanarak zarif ve temiz bir kod yazabilirsiniz. Şu anda Depo şablonunu tüm saklı yordamlarla kendim uyguluyorum. Veri okuyucusundan iş nesnelerinize eşleme yaparken onun parlak fikri için FluentAdo.net'e bakmanızı öneririm. Bu fikrin bir kısmını aldım ve kendi çözümüm için tekrar önerdim.


3

JFTR - Çok az PHP geliştiricisiyim, ancak bu ağırlıklı olarak politik bir sorun gibi görünüyor.

Uygulamayı ortaya çıkaran "çürük" ölçeğine bakıldığında, o zaman - en iyi uygulamalar bir yana - onu kökten çıkarmak için önemli bir ek yük olacaktır. Bu, yeniden yazma bölgesinde sınır gibi görünüyor.

Önerdiğiniz alternatifin işletmeye maliyetini doğrulamak için faydalar sağlayacağını garanti edebilir misiniz? Bu girişimin YG'sinin işletmeye satılması zor olabileceğinden şüpheleniyorum. Uygulama kararsız olmadıkça veya elden geçirmenin haklı olduğunu finansal şartlarda ispat edemezseniz - bu zor olabilir.

ORM SPROCS'a tek alternatif midir? Tam şişmiş bir ORM ve vanilya SQL arasında birkaç tasarım deseni vardır. Belki de bu SPROCS'u yavaş yavaş DB'den DBAL'a getirerek süreci başlatabilirsiniz. Elbette, bunun zaman içinde bir homebrew ORM'ye dönüşmesi tehlikesi var - ancak hedefe daha yakın bir adım atacaktınız.


2

Birkaç yıl önce SP'den ORM'ye geçtik.

Bir durumda 80 tabloyu güncellemek zorunda kaldık. Eski tahmin modeli bunun için entlib ve SP ile 80 saat olacağını tahmin ediyordu. 10'da başardık :)

Veri erişim katmanını geliştirmek için kullandığımız zamanın% 80 oranında azaltılmasını sağladı.


1
Ve tablo güncellemesini neden yazamadı?
Darknight

Bu, bellekte karmaşık bir nesneyi alıyordu ve onu raporlama için ilişkisel bir veritabanına kaydediyordu. Tablo yapısını oluşturmak için nesneyi yansıtan bir program yazdık.
Şiraz Bhaiji

-1

Bana göre daha fazla şey ifade ediyor; temel mesele, dağıtımlarınızın düzgün ve otomatik çalışmamasıdır.

Her bir işlemden sonra veritabanlarını gerektiği gibi yönetmeyi bilen sürekli bir inşaat motoru kurmak daha kolay olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.