Neden ORM kullanmalısınız? [kapalı]


114

Bir ORM'nin "avantajlarına" motive olursanız ve yönetim / müşteri için neden ORM'yi kullanırsınız, bu nedenler nelerdir?

En iyi neden olarak hangisinin oylandığını görebilmemiz için yanıt başına bir nedeni tutmaya çalışın.


3
Anket yapmak istiyorsan wiki yapmalısın
frankodwyer

Bir anket istiyorsanız bunu wiki yapmak için +1
cletus

16
Ya dolandırıcılık?
Brian Matthews

4
Ve kaşık da yok. Hayır, gerçekten, bir dezavantaj var: performans. ORM'den geçmeniz gerekmediğinde DB sorgularını optimize etmek çok daha kolaydır. (- Geçenlerde geçtikten Ben şikayetçi değilim etmek ;; genel amaçlı, orm gitmek yoludur ama yakından metale sorguları çalıştırmak için bir yol tutmak, ORM onunla çoğunlukla mutluyum IFF performansı gerekir)
Piskvor

2
@ UğurGümüşhan, IMHO bir ORM kullanmanın başlıca faydası, geliştiricilerin uygulamalarının geri kalanında kullandıkları aynı dilde ve OO paradigmasında programlamalarına izin vererek geliştiricileri daha verimli hale getirmektir. Depolanan yordamlar, geliştirici kodunu RDBMS saklı yordam dilinde oluşturduklarında bunu sağlayamaz. Onlar Yani olamaz her şeyi bir ORM can.
Bill Karwin

Yanıtlar:


53

Veri erişimini daha soyut ve taşınabilir hale getirmek. ORM uygulama sınıfları, satıcıya özgü SQL yazmayı bilir, bu nedenle sizin yapmanız gerekmez.


61
Bunun ORM'lerin bir özelliği olduğunu kabul etmeme rağmen, kullanım durumunun oldukça sınırlı olduğunu öneririm. Yaklaşık on yıldır MySql ve sqlite dışında hiçbir şey kullanmadım. Çoğu geliştirici için muhtemelen çok nadir bir gereklilik olduğunu düşünüyorum.
troelskn

40
@troelskn: Kabul ediyorum, birçok RDBMS ürünü kullandım, ancak proje başına asla bir veya ikiden fazla olmadı. Dolayısıyla taşınabilirlik, SQL'i soyutlamanın en pratik değeri değildir. Bence birçok ORM kullanıcısı SQL'de kodlama yapmaktan kaçınmak istiyor.
Bill Karwin

2
satıcılar her zaman yeni sürümler / özellikler çıkarırlar ... sadece lehçeyi yazmak için bazı havalı insanlara ihtiyaç duyarlar ve kolay yükseltilir!
dotjoe

5
Tipik faydasız cevap Neden iyi cevap olarak işaretlendiğini merak ediyorum, soruyu soran adam patronuna ORM kullanması gerektiğini haklı çıkarmaya çalışıyor gibi görünüyor :) Benim sorum Hibernate ile ne tür bir sorunla karşılaşacağınızı tercih eder stackoverflow.com/questions/6477170/…
user310291

2
@ user310291: OP problem veya tuzaklar istemedi, ORM kullanmanın faydalarını istedi. Elbette artıları ve eksileri var, ancak artılarını istedi. Açıkçası, bu cevabın kabul edilmesine ve olduğu kadar çok olumlu oy almasına şaşırdım, çünkü bunu bir ORM'nin başlıca faydası olarak saymazdım.
Bill Karwin

83

ORM kullanmanın en önemli nedeni, zengin, nesne odaklı bir iş modeline sahip olabilmeniz ve yine de onu depolayabilmeniz ve ilişkisel bir veritabanına karşı hızlı bir şekilde etkili sorgular yazabilmenizdir. Benim bakış açıma göre, iyi bir ORM'nin yazabileceğiniz gelişmiş sorgu türleri dışında diğer oluşturulan DAL'larla karşılaştırıldığında size sağladığı gerçek avantajlar görmüyorum.

Düşündüğüm sorgu türlerinden biri polimorfik bir sorgu. Basit bir ORM sorgusu, veritabanınızdaki tüm şekilleri seçebilir. Geri bir şekil koleksiyonu elde edersiniz. Ancak her örnek, ayırt edicisine göre bir kare, daire veya dikdörtgendir.

Başka bir sorgu türü, tek bir veritabanı çağrısında bir nesneyi ve bir veya daha fazla ilgili nesneyi veya koleksiyonu hevesle getiren bir sorgu olabilir. Örneğin, her şekil nesnesi, tepe noktası ve yan koleksiyonları doldurulmuş olarak döndürülür.

Buradaki pek çok kişiye katılmadığım için üzgünüm, ancak kod oluşturmanın tek başına bir ORM ile gitmek için yeterince iyi bir neden olduğunu düşünmüyorum. ORM'lerin yaptığı kavramsal veya performans ek yüküne sahip olmayan kod üreteçleri için birçok iyi DAL şablonu yazabilir veya bulabilirsiniz.

Veya, bir ORM kullanmak için iyi SQL yazmayı bilmenize gerek olmadığını düşünüyorsanız, yine katılmıyorum. Tekli sorgu yazma açısından bir ORM'ye güvenmenin daha kolay olduğu doğru olabilir. Ancak, geliştiriciler sorgularının ORM ve çevrildikleri SQL ile nasıl çalıştığını anlamadıklarında, ORM'ler ile zayıf performans gösteren rutinler oluşturmak çok kolaydır.

Birden çok veritabanında çalışan bir veri katmanına sahip olmak bir avantaj olabilir. Yine de o kadar sık ​​güvenmek zorunda olduğum bir şey değil.

Sonunda, deneyimlerime göre, ORM'nizin daha gelişmiş sorgu özelliklerini kullanmıyorsanız, kalan sorunları daha az öğrenme ve daha az CPU döngüsü ile çözen başka seçenekler de olduğunu yinelemek zorundayım.

Oh evet, bazı geliştiriciler ORM'lerle çalışmayı eğlenceli buluyor, bu nedenle ORM'ler de geliştiricilerinizi-mutlu tutma perspektifinden iyi. =)


1
İyi söyledin. Orijinal poster özellikle "eksileri" değil "artıları" aradı, ben de ORM'yi NASIL kullandığınızın etkilerini anlamamaktan kaynaklanan bazı HORRIBLE SQL gördüm. Bana göre en büyük fayda, işlemsel sistemler için DAL kodunuzun çoğunluğu olan basit CRUD işlemleri içindir.Saf ORM ve diğer oluşturulan DAL yöntemleri arasında tüyleri ayırdığınızı düşünüyorum. Nesneler ve DB arasında çeviri yapmanıza yardımcı olan herhangi bir şeyin ORM olarak düşünülebileceğini düşünüyorum, bu sadece farklı bir operasyonel modeldir.
Doug Lampe

1
@Doug - Sanırım peşinde olduğum ayrım, basit bir DAL'ın oluşturulan CRUD SQL'den biraz daha fazlasını içermesi, oysa bir ORM'nin gezinme özellikleri, koleksiyon kalıcılığı, özel sorgu dilleri, önbellekler vb. Gibi çok daha fazla soyutlamayı içermesiydi. - Daha iyi bir yol Gözlemlerinizin ışığında benim açımdan belirtmek gerekirse, bir ORM'nin daha fazla özelliğini kullanmanın daha hızlı uygulamanıza izin verdiği doğru olsa da, bu özelliklerin nasıl çalıştığı konusunda bilgisiz kalmanın hiçbir şekilde kabul edilemez olduğu olabilir. Belki de ORM'lerin soyutlamaları çoğundan daha fazla sızdırdığı içindir. ( En.wikipedia.org/wiki/Leaky_abstraction )
Chuck,

lütfen bunu biraz daha detaylandırın: "ORM'nizin daha gelişmiş sorgu özelliklerini kullanmıyorsanız, kalan sorunları çözen başka seçenekler de vardır". ayrıca, hazırda bekletme gavin king'in yaratıcısının dediği gibi: "Aslında, Hibernate gibi sistemler kasıtlı olarak" sızıntılı soyutlamalar "olarak tasarlanmıştır, böylece gerektiğinde yerel SQL'de kolayca karıştırılabilir. ORM soyutlamasının sızdırmazlığı bir özelliktir, bir hata değil !" - reddit.com/r/programming/comments/2cnw8x/…
jungle_mole

1) Bu eski. O zamanlar, ORM'ler tüm özelliklere sahipti (önbellekler, sorgular, gruplama, vb.). IMHO, nesne tabanlı, polimorfik sorgular, kod geninin (açık ADO eşlemesi) kolayca sağlayamadığı tek ORM özelliğiydi. 2) Kasıtlı olarak bazı yararlı boşluklar bırakılırken, ORM'lerde yüksek bir öğrenme eğrisi oluşturan gerekli kötülükler ve gelişmiş özellikler de vardı. Bu yüzden, cevabım, gelişmiş sorgulara ihtiyacınız olmadıkça ORM'ler yerine kod gen kullanmaktı. *) Şimdiki zaman, ORM'lerde, ekibiniz için doğru özellik setinin muhtemelen orada olduğuna dair yeterince çeşitlilik vardır. Ekibim artık Linq2DB'ye düşkün.
Chuck

60

Hızlı gelişme. Örneğin, sorgu sonuç alanlarını nesne üyeleriyle eşlemek gibi tekrarlayan kodu ortadan kaldırmak ve bunun tersi de geçerlidir.


3
Tekrarlayan kod çok kötü, ancak bunu ortadan kaldıracak bir soyutlama oluşturamaz mısınız? Örneğin, size daha sonra bir şeyler yapabileceğiniz satırları geri verecek bir tablo / sorgu sonuçları nesnesine sahip olabilirsiniz. ORM'ler, sorgu sonuçlarının tabloları / satırları olan DB'nin seçilen soyutlamasına girmek yerine, satırları ayrı sınıf örneklerine ayırıyor gibi görünüyor. Bunun ORM'lerin iyi olmadığı anlamına geldiğini söylemiyorum, ancak bunun tek başına onları kullanmak için bir neden olduğundan emin değilim.
Benjohn

@Benjohn, ORM çözümünün tek tek satırları nesne olarak ele aldığını, RDBMS ise satır kümelerini bir varlık olarak ele aldığını kabul ediyorum . RDBMS zihniyetinde yapabileceğiniz, OO zihniyetinde yapamayacağınız şeyler vardır.
Bill Karwin

Bu, sırf bagajı kullanmak için bütün bir arabayı satın almak gibidir, tekrarlayan işlerden kaçınmanın birçok yolu vardır
mohas

15

Veri erişim katmanınızda iş kurallarının OO kapsüllenmesini destekler. İş kurallarını, hantal tetik ve saklı yordam dilleri yerine tercih ettiğiniz uygulama dilinde yazabilir (ve hata ayıklayabilirsiniz).


Yine de iş kurallarınızın veritabanında olmasını istemiyor musunuz? Bu, bir veritabanının bir avantajıdır: birden fazla müşteri, DBMS tarafından sağlanan aynı arayüzü kullanabilir. Arayüz mantığınızın çoğu belirli bir istemcinin ORM kodunda kilitliyse, veritabanında değildir ve diğer istemciler onu kullanmıyordur. Ön büro arka ofis molalarını (bir müşteri modeli diğerininkiyle çizgiyi aşıyor).
Benjohn

1
@Benjohn, veritabanına basitçe iş kuralları koyma eğilimindeyim, ancak bildirimsel kısıtlamalarda daha karmaşık kurallar kolayca oluşturulamaz. Örneğin "müşteri, aynı markadan üçten fazla pantolon satın aldığında tüm siparişte% 10 indirim alır." Bu iş kuralını veritabanına nasıl koyardınız (saklanan prosedürleri içeren bir cevabın hantal olduğunu unutmayın).
Bill Karwin

Yıl 2020, artık saklı yordamları kullanan kimseyi görmüyorum. Öyleyse hala duruyorlar mı?
ospider

Sanırım benim açımdan, insanlar saklanan prosedürleri değil , uygulama kodunu kullanıyorlar. Farklı bir şey anladın mı?
Bill Karwin


8

Bir soyutlama geliştiriyorsunuz çünkü farklı veritabanı yazılımlarına kolayca geçebilirsiniz.


41
30 yıldan fazla veri tabanı çalışması yaptığım için, bunu bir kez yapmak zorunda kalmadım.
HLGEM 01

4
Mümkün olmadığı anlamına gelmez! :)
Matt Fenelon

2
@ HLGEM, müşteri için seçenekleri kapattığınız anlamına gelir. Sadece 3 yıllık web uygulamaları çalışmasında gerçekleşebilirdi,
ORM'leri

1
Bellek içi veri tabanında testler yapmak istemeniz durumunda faydalı bulabilirsiniz
Carlos Parraga

Aynı yazılımın birkaç örneğinin farklı veritabanları kullanması mümkündür. Ancak var olan verileri bir DB yazılımından diğerine taşımak gerçekten nadiren gerçekleşir. Ve bu olduğunda, birçok ORM aslında size bu konuda yardımcı olmuyor.
jlh

4

Böylece nesne modeliniz ve kalıcılık modeliniz eşleşir.


1
Belki kalıcılığınızın nesne modelinize göre şeffaf olması için
S. Lot

4

Gelişim mutluluğu, IMO. ORM, SQL'de yapmanız gereken pek çok çıplak metal şeyi özetler. Kod tabanınızı basit tutar: yönetmek için daha az kaynak dosya ve şema değişiklikleri saatlerce bakım gerektirmez.

Şu anda bir ORM kullanıyorum ve geliştirmemi hızlandırdı.



3

Araştırmamın nedeni VS2005'in DAL araçlarından (şema eşleme, TableAdapters) üretilen koddan kaçınmaktır.

Bir yıldan uzun bir süre önce oluşturduğum DAL / BLL, başka biri üretilen işlevlerden bazılarından yararlanmak için kullanmaya başlayana kadar (ki orada olduğunu bilmiyordum) iyi çalışıyordu (onu inşa ettiğim şey için)

DAL / BLL çözümünden çok daha sezgisel ve temiz bir çözüm sağlayacak gibi görünüyor. http://wwww.asp.net adresindeki

Kendi SQL Command C # DAL kod oluşturucumu oluşturmayı düşünüyordum, ancak ORM daha zarif bir çözüme benziyor


2

Sorguların derlenmesi ve test edilmesi.

ORM'lerin araçları geliştikçe, derleme zamanı hataları ve testleri yoluyla sorgularınızın doğruluğunu daha hızlı belirlemek daha kolaydır.

Sorgularınızı derlemek, geliştiricilerin hataları daha hızlı bulmasına yardımcı olur. Sağ? Sağ. Bu derleme, geliştiricilerin artık yalnızca SQL veya SQL benzeri ifadeler yerine iş nesnelerini veya modellerini kullanarak kodda sorgular yazması nedeniyle mümkün olmuştur.

NET'te doğru veri erişim modellerini kullanıyorsanız, sorgu mantığınızı bellek koleksiyonlarına karşı birim testi yapmak kolaydır. Bu, testlerinizin yürütülmesini hızlandırır çünkü veritabanına erişmeniz, veritabanında veri kurmanız ve hatta tam kapsamlı bir veri bağlamı döndürmeniz gerekmez. [DÜZENLE] Bu, birim olarak düşündüğüm kadar doğru değil bellekte test etmek zor zorluklar yaratabilir üstesinden gelinmesi gereken . Ancak yine de bu entegrasyon testlerini yazmayı önceki yıllara göre daha kolay buluyorum. [/ EDIT]

Bu, sorunun sorulduğu birkaç yıl öncesine göre bugün kesinlikle daha alakalı, ancak bu yalnızca deneyimlerimin yattığı Visual Studio ve Entity Framework için geçerli olabilir. Mümkünse kendi ortamınızı ekleyin.


1

SQL'i zamanın% 95'inden uzaklaştırın, bu nedenle ekipteki herkesin veritabanına özel süper verimli sorgular yazmayı bilmesine gerek kalmaz.


1

Burada pek çok iyi nokta olduğunu düşünüyorum (taşınabilirlik, geliştirme / bakım kolaylığı, OO iş modeline odaklanma vb.), Ancak müşterinizi veya yönetiminizi ikna etmeye çalışırken, bunların tümü kullanarak ne kadar tasarruf edeceğinize bağlıdır. bir ORM .

Tipik görevler (veya hatta yaklaşan büyük projeler) için bazı tahminler yapın ve (umarız!), Geçiş için göz ardı edilmesi zor birkaç argüman alırsınız.


0

kod smith şablonlarını kullanan .net katmanları

http://nettiers.com/default.aspx?AspxAutoDetectCookieSupport=1

Neden aynı zamanda üretilebilecek bir şeyi kodlayın?


Ugh. Net Katmanları büyük bir ticari projede kullandık ve kullanılmamasını şiddetle tavsiye ediyorum. Sorun, bir araya getirilemez olmasıdır. Foo ve Bar nesnelerini sorgulamak mı istiyorsunuz? Birleştirme yazamazsınız, istediğiniz her nesne türü için ayrı sorgular vermeniz gerekir. Bu, veritabanına birçok çağrıya neden olur ve bu da performansı ve atomikliği bozabilir. Kötü, kötü, kötü. Uzak dur.
Judah Gabriel Himango

0

Değişiklikler geldiğinde ne kadar zamandan / paradan tasarruf edeceğinizi ve ORM aracı bunu sizin için yapacağından SQL'inizi yeniden yazmak zorunda kalmayacağınızı onlara ikna edin


0

Bence bir dezavantajı, ORM'nin POJO'nuzda biraz güncellemeye ihtiyaç duyacağıdır. esas olarak şema, ilişki ve sorgulama ile ilgilidir. bu nedenle, model nesnelerinde değişiklik yapmanızın beklenmediği senaryo, proje veya s / b istemci ve sunucudakinden daha fazlası arasında paylaşıldığı için olabilir. bu nedenle bu gibi durumlarda, ek çaba gerektirecek şekilde iki seviyeye bölmeniz gerekecektir.

Ben bir android geliştiricisiyim ve bildiğiniz gibi mobil uygulamaların boyutu genellikle çok büyük değildir, bu nedenle saf model ve orm-etkilenen modeli ayırmaya yönelik bu ek çaba, tam anlamıyla değmez.

Bu sorunun genel bir soru olduğunu anlıyorum. ancak mobil uygulamalar da genel bir şemsiyenin içine giriyor.

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.