Uygulama mantığına karşı veya veritabanı katmanına yerleştirmenin argümanları nelerdir?


74

NOT programmers.se kitlesini ve dba.se farklıdır ve farklı bakış açılarına sahip, bu yüzden bu durumda ben çoğaltmak için geçerli olduğunu düşünüyorum karşı veya veritabanı katmanında uygulama mantığını koymak için argümanlar nelerdir? programmers.se üzerinde.

Bu konuda zaten dba hakkında bir tartışma bulamadım ve orijinal yazı her şeyi söylüyor:

Çoğu yazılım geliştirici, uygulama mantığını uygulama katmanında tutmak ister ve burada tutmamız bizim için büyük olasılıkla doğaldır. Veritabanı geliştiricileri, uygulama mantığını tetikleyiciler ve saklı yordamlar olarak veritabanı katmanına koymak istiyor gibi görünmektedir.

Şahsen, katmanların sorumluluklarını ayıklamayı ve sorumluluklarını ayrı tutmayı kolaylaştırmak için uygulama katmanında mümkün olduğunca tutmayı tercih ederim.

Bu konudaki düşünceleriniz neler ve veri tabanı katmanında uygulamak için ne uygun olmalı veya ne olmamalıdır?

NB Bu soru için OP değilim, ancak orijinal ifadeyi bozulmadan bıraktım.


4
Buradaki ve SO üzerindeki cevapları karşılaştırarak, boşluk dikkat çekicidir. Geliştiriciler, veritabanındaki merkezileştirme süreçlerinden kaynaklanan gecikmeleri protesto ediyorlar, ancak bu iyi bir şey olan DBA'ları . İnsanları daha fazla zaman ve çaba göstererek yeni bir görüş veya sproc istemek için zorlamak, verilerle temas noktalarının sayısını azaltır, tutarlılığı korumayı kolaylaştırır ve optimizasyon noktalarının sayısını azaltır.
Tüm İşlemlerden Jon,

Bana göre buradaki cevaplar veri tabanını kullanmanın belli bir yolunu aldığını (çoklu uygulamalar, bazı kullanıcıların doğrudan veri tabanı erişimine izin veriyorlar vs.) sanırım bu farkın temel nedeni.
JMD Coalesce

Yanıtlar:


56

Çeşitli düşünceler ...

Veritabanı kodunuz, uygulama istemci teknolojinizi aşacak. ADO.NET -> Linq -> EF'in yanı sıra çeşitli ORM'leri de düşünün. Halbuki SQL Server 2000 kodunu son binyılda yukarıdaki tüm istemci teknolojilerine karşı da çalıştırabilirsiniz .

Ayrıca birden fazla müşteri sorununuz var: .net, java ve Excel. Bu 3 set uygulama mantığı.

"İş mantığı", "veri bütünlüğü mantığı" ile karıştırılmamalıdır. İşlemleri başlatan ve çeşitli kontroller yapan müşterileriniz varsa, bu çok fazla db çağrısı ve uzun bir işlemdir.

Uygulama mantığı, yüksek veri hacimleri için ölçeklendirilmez. Depolanmış işlemleri kullanarak saniyede 50k satırımız var. Hazırda Bekletme kullanan bir kardeş ekip saniyede bir tane alamaz


İlişkisel veritabanları ile kaldığınız sürece
JMD Coalesce

1
@JMDCoalesce: Hala iş mantığına ihtiyacınız var ve birden fazla müşteri uygulamasına sahip olmak zorundasınız.
gbn

40

Tüm kullanıcılara ve veritabanındaki tüm uygulamalara uygulanacak tüm mantığı istiyorum. Bunu koyacak tek akıllıca yer burası.

Çalıştığım son Fortune 500'de OLTP veritabanlarına isabet eden en az 25 dilde yazılmış uygulamalar vardı. Bu programlardan bazıları 1970'lerde üretime geçti.

Bu tür bir gerekliliği veritabanında yerine getirmenin alternatifi, her uygulama programcısının, kapıdan yürüdüğü ilk günden şirket dışına çıkana kadar, editörlerini her ateşlediğinde,% 100'ünün tümünü veya bir kısmını doğru şekilde yeniden düzenlemesini sağlamaktır. iş.

Olasılıklar neler?

Bu gezegendeki en büyük tek " kendini tekrar etme " değil mi?


Bu sadece birden fazla uygulama bir veritabanı kullanıyorsa geçerlidir
JMD Coalesce

1
@JMDCoalesce birçok ortamda yaygındır. Ana uygulama, Excel raporlama, sunucu tarafı raporlama, toplu özetler: yakında ekler. Neredeyse tüm bankacılık uygulamalarında çok sayıda istemci uygulaması vardır
gbn

Elbette, ancak tüm başvurular bankacılık amaçlı değildir.
JMD Coalesce,

29

Cevapları siteler arasında kutuplaşmış gibi göründüğüm için eski cevabımı programcılar.se 'de düzenlenmeyenler arasında taşıyorum.

Acı veren bir dünya için bulunduğumu biliyorum, ama veritabanına iş mantığı koydum, çünkü:

  • İş dünyası kullanıcılarının veritabanına doğrudan erişmesine izin verebilir ve onları mahvettiğinden endişe etmeyebilirsiniz (veya uygulama tabanlı mantığa göre daha az endişe duymazsınız).
  • Bir uzman kullanıcı, yeni bir yazılım sürümü beklemeden yeni raporlar oluşturabilir.
  • SP / TRIGGER kodunu, tıpkı uygulama tabanlı mantığı test ettiğiniz gibi veritabanının bir kopyasında test edebilirsiniz.
  • Metin dosyalarında sp'ler ve tetikleyiciler oluşturmak için SQL'i koruyabilirsiniz (bunu zaten tablo / görünüm kodu için yapmalısınız)
  • İş mantığını taşımadan dilleri karıştırabilir ve eşleştirebilirsiniz
  • Yazılımın her bir parçasını yükseltmeden iş mantığında değişiklikler yapabilirsiniz.
  • Yapıyı denetlersiniz, veritabanı faaliyetini denetlediğiniz gibi - günlük kaydı yoluyla
  • Son derece gelişmiş güvenlik ve hassas erişim kontrolü (çoğu uygulama tabanlı mantık uygulaması kendi güvenlik modelini kullanır, bu nedenle verilerin ele geçirilmesi çok kolaydır. Tersine çevrilebilir parola şifrelemesi nadir değildir)
  • Veritabanı tarafı kullanıcı güvenliği, SQL'in yapabileceği zararı / hırsızlığı büyük ölçüde azaltır

Dezavantajları şunlardır: - Geliştiriciler, kullanıcılar özel raporlar için geliştiricilere daha az bağımlı olduklarında tehdit oluşturuyorlar - Geliştiricilerin başka bir programlama dili öğrenmesi gerekiyor

Bunların hiçbiri yetenekli bir geliştirici için önemli olmamalıdır.

Dikkat etmek gerekirse, çoğu cevap, yazılım bir işletme işlevi sağlamak için orada bulunmuyormuş gibi, "iş mantığı" değil "uygulama mantığı" açısından konuşur.


1
* Saklanan işlemler / tetikleyiciler, tüm uygulama kodlarını değiştirmek zorunda kalmadan veritabanında yapısal değişiklikler yapmanızı sağlayan bir soyutlama düzeyi sağlayabilir. * Veritabanının her kullanıcısı ara katman yazılımınızı sadık bir şekilde kullanmayacaktır. * Hadi, bir yabancı anahtar olduğunu bir iş kuralı !! * Tüm kontrolleri / kısıtlamaları / kodu db'den kaldırmak, tutarsızlığa / bozulmaya karşı kendini koruyamayacağı anlamına gelir. * Her uygulama, başarılı olduktan sonra geliştirilen bir eBay gibi sıraya dayalı işlemsiz tasarımlar için çağrı yapmaz ve bunu inşa etmeye yetebilir. * SQL o kadar da zor değil millet.
Craig

23

En önemli sorun, veritabanının üzerindeki herhangi bir 'katmanın' verinin kendisine ait olduğunu düşündüğüdür. Eşzamanlılık ve veri bütünlüğü, çözümün bir RDBMS olduğu problemlerdir - bazı uygulamalar veri tabanı sadece kişisel bir bit kovasıymış gibi geliştirilir ve elbette tekerleği her türlü şekilde yeniden icat etmeye çalışmakla sonuçlanır başka bir uygulama aynı veritabanına erişir erişmez telafi edilemez şekilde kırılma


1
Sistemin sponsoru kim varsa verilere sahip olduğunu düşünüyorum - bunun için ödediler. Ayrıca veritabanına girmeden önce çok sayıda eşzamanlılık sorunu çözüyorum - çoğu durumda bu çok daha kolay.
AK,

4
'kendi' özelliğini benden farklı bir anlamda kullanıyorsunuz: benim açımdan, eşzamanlılık sorunlarını veritabanına çarpmadan önce “çözüyorsanız”, aynı zamanda sizin veritabanınıza çarpan uygulamaların veya bunların çözülmesi gerektiğinden emin olmanız gerektiğidir. yine aynı seviyede. Üst oylamada verilen cevaba katılıyorum: "Veri tabanı kodunuz uygulama müşteri teknolojinizi [muhtemelen] aşacaktır."
Jack Douglas

17

Bu cevabım kadar yazdım benim blog . Sonuç olarak, uygulamada bunu yapmak, tüm uygulama yaşam döngüsünü düşündüğünüzde ölçeklenmez.


3. Temel veritabanına bütünlük / kontrol kısıtlamaları ekleyin,veritabanının saklı yordam dilinde uygulanan daha karmaşık kod ile. Bundan sonra korumak için tek bir merkezi konum elde ettik ve bilmediğimiz uygulamalar için bile kuralların mutlak şekilde uygulanmasını sağladık! İş dünyası kurallarını, uygulama portföyünün tamamı ve yaşam döngüsü boyunca ifade edecek bir dil ediniriz; çünkü du jour dili veritabanından çok daha sık değişir. Ve zaten en önemli uygulamalar kadar kritik bir sistemde çalışıyor. Hatalar, bu uygulamalardaki veritabanı hatalarını işleyen mevcut kodla gerçekleştirilir. Bir uygulamanın elbette kırılması riski hala var, ancak üç senaryoda, bu en az ve yalnızca hatalı uygulamanın herhangi bir değişiklik yapması gerekiyor, hepsi değil (ve çoğu SP / veritabanı mekanizması, gerçekten, gerçekten gerekliyse bir uygulama için bir istisna yapılmasına izin verecektir). Bunun yeşil alan sitenizde veya küçük şirketinizde önemli olmadığını mı düşünüyorsunuz? İşiniz başarılı olursa, 30 yıl içinde bilgeliğime kulak vermeyi dilediniz!

… Bazı [itirazlar] Sık sık duyuyorum:

  • DB'de konuşlandırılmış SP kodunu kontrol etmek zor. Bir uygulama sunucusunda konuşlandırılmış Java kodunun sürüm kontrolünün yapılmasının zor olduğunu söylemekten daha doğru olduğunu sanmıyorum, yani, hiç zor değil, sıradan. Ve Ruby-land’ta kitapların tamamı, kodunuzu bir geliştirme ortamından üretime nasıl alacağınız hakkında yazıyor, başka hiçbir dil topluluğunun mücadele edemediği bir şey. Ancak saklı bir prosedürü kontrol eden sürüm görünüşte çok zor.
  • Saklı prosedürleri test etmek zordur. Bu garip bir şey. Başlangıç ​​için, SP'ler kesinlikle yazılmıştır; Derleyici, içeride veya dışarıda bir anlam ifade etmeyen bir kod yolu olup olmadığını size söyleyecektir ve en azından Oracle'da tüm bağımlılıkları sizin için hesaplayacaktır. Demek ki Ruby'de ihtiyaç duyacağınız bir dizi ortak birim testi yarasadan silindi. OO kodunu test etmek için nesneyi test senaryosunu temsil etmek için gereken iç duruma zorlamak için alay etmek gerekir - test verilerini nasıl farklı kılar? PL / SQL ve bunun yanı sıra diğer araçlar için bir TAP üreticisi var. Ayrıca hata ayıklayıcılar ve profilciler var.
  • Saklı bir prosedür dili tam özellikli bir dil değildir. Peki, sadece saklı yordamlarda tüm bir uygulamayı yazmaya çalışmıyoruz! Çoğu özel SP dili, beklediğiniz tüm modern yapılara sahiptir ve Oracle’da, en azından Oracle’da Java Saklı Prosedürlerini, OO geliştiricilerin aşina olduğu tüm dil özellikleri veya herhangi bir dilde harici prosedürler ile kullanabilirsiniz. Önemli olan mantığın uygulandığı yer - bir yerde, verilere yakın - gerçek dil sadece bir ayrıntı. PL / SQL yerel kod için derlenir ve veritabanında işlem görür; bundan daha yüksek performanslı bir mimari yoktur.
  • Başka bir dil öğrenmek zorunda kalmak istemiyorum. Bir saniyeliğine bakıldığında bu, herhangi bir geliştiricideki (özellikle de başka dillerde olabilecek üretim uygulamalarını değiştirmeyi öneren! , WebLogic, Maven, Hudson, Anthill, Subversion ve başkalarının tamamında, tek bir uygulama kodu satırı yazmadan önce öğrenmeniz gereken bir çok şey var. Çok yüksek düzeyde bir SP dilinin çalışma bilgisi kıyaslandığında basittir ve size yardımcı olmak için muhtemelen bir uzman veya DBA'nın olması muhtemeldir. Geliştirici favori Hibernate'in kendi sorgu diliyle geldiğinden bahsetmiyorum bile…

...


12

SQL set mantığı ve uygulama odaklı sonuçları filtreleme gibi şeyler yapar mı? SQL harika bir set manipülasyon dilidir.

Ek olarak, GBN'nin yukarıda belirtildiği gibi, SQL kodu uygulama kodunu neredeyse evrensel olarak geçersiz kılacaktır.

EF veya NHibernate veya LinqToSql veya daha hızlı kod oluşturmanıza izin verecek her ne kadar doğru olsa da, performanslarına değer olan her programcı yalnızca SQL'i optimize etmenin veri alımını optimize edeceğini bilir. RDBMS sadece SQL'i anlar, bu yüzden her şey söylenmeden ve yapılmadan önce her şeyi SQL'e dahil etmeniz gerekir. (TSQL ve PLSQL'in hala SQL olduğu konusunda hemfikir olduğumuzu varsayarak)


11

İnsanların mutlaka tartışmayacakları bir yanlısı - artılar burada bitkin - maliyettir.

Veri tabanı sunucusundaki CPU'lar, yazılım lisansının maliyetini yükseltirken, herhangi bir kuruluştaki en pahalı CPU'lardır. Bu nedenle, iş mantığını veri katmanına taşımak, mutlaka aynı şekilde değil, mantıklı bir şekilde yapılması gereken bir şeydir.


7

Geliştiricilerin (DV'ler) ve DBA'ların kafasında kaçınılmaz olarak gerçekleşmesi gereken, yani zihinlerin buluşması. Business Logic (BL) ile çalışmak ve böyle bir veritabanında saklamak, uygulanmasını yücelten veya dehşete düşüren bir etkiye sahip olabilir.

Bazı RDBMS ürünleri için, uygulamalarında hızlıca öğrenip kullanabilecekleri İş Mantığı ve Nesne Altyapıları için üstün kütüphaneler / araçlar / API'ler bulunmaktadır. Diğer RDBMS için, kitaplık / araç / API yoktur.

Geçmişte, istemci sunucu uygulamaları, Saklı Prosedürler (SP) aracılığıyla köprüyü BL yapmıştır. Oracle ve SQL Server gibi ürünler için bu erken yapıldı. PostgreSQL ve MySQL gibi açık kaynak veritabanları ortaya çıktıkça, bunları kullananlar BL'da saklı yordamlarla yeni bir çığır açma riski taşıyorlardı. PostgreSQL bu konuda çok hızlı bir şekilde olgunlaştı, çünkü yalnızca saklı yordamlar uygulanmadı, aynı zamanda müşteri dillerini oluşturma yeteneği de ortaya çıktı. MySQL temel olarak saklı yordamlar dünyasında evrimleşmeyi bıraktı ve birçok kısıtlamaya sahip bir dilden soyuldu. Bu yüzden, BL'a gelince, tamamen MySQL'in ve onun Kayıtlı Prosedür dilinin insafına kalmışsınızdır.

Sadece bir tek soru var: RDBMS'den bağımsız olarak, BL tamamen veya kısmen veritabanında mı kalmalı?

Geliştirici düşünün. Bir uygulamada işler ters gittiğinde, hata ayıklama işlemi, Geliştirici'nin aralıklı olarak doğru olabilecek ya da olmayabilir veri değişikliklerini izlemesi için bir veritabanına girip çıkacaktır. Bir C ++ uygulamasını kodlamak ve ortasında Assembler kodunu çağırmak gibidir. Kaynak koddan, sınıflardan ve yapılardan kesintilere, kayıtlara ve ofsetlere geçmek zorundasınız. Bu aynı seviyede hata ayıklama alıyor.

Geliştiriciler, veritabanı yerine bellekte oturan iş nesneleri yoluyla dil yapılandırmalarıyla (C ++ için derleyici bayrakları, PHP / Python için farklı ayarlar, vb.) Bağlantılı olarak BL yürütmek için yüksek hızlı bir yöntem oluşturabilirler. Bazıları bu ideolojiyi daha hızlı çalıştırma kodları için veritabanına yerleştirmeyi denedi.

Bu nedenle, Geliştirici'nin iki dilde kaynak kodunu ve BL'yi geliştirmesi, hata ayıklaması ve bakımını yapması istenmektedir.

Şimdi DBA'yı düşünün. DBA Veritabanını saklı işlemler alanında mümkün olduğunca yalın ve ortalama tutmak istemektedir. DBA, BL'yi Veritabanının dışında bir şey olarak görebilir. Ancak, SQL, BL için gereken verileri aradığında, SQL'in yalın ve ortalama olması gerekir.

Şimdi, zihinlerin buluşması için !!!

Geliştirici SP kodları ve yinelemeli yöntemler kullanır. DBA SP'ye bakar. DBA, tek bir SQL ifadesinin Geliştirici tarafından yazılan yinelemeli yöntemleri değiştirebileceğini belirler. Geliştirici, DBA tarafından önerilen SQL ifadesinin, SQL ifadesinin normal yürütme planlarını izlemeyen diğer BL ile ilgili kodu veya SQL'i çağırmayı gerektirdiğini görür.

Bunun ışığında, yapılandırma, performans ayarlama ve SP kodlama, veri alımı için BL derinliğinin ve veri yoğunluğunun bir işlevi haline gelir. Veritabanına verilen veri ve işlem gücü miktarı için BL ne kadar derin ve veri yoğunluğu arttıkça, Geliştiriciler ve DBA aynı sayfada olmalıdır.

SONUÇ

Veri toplama şekli her zaman hem Geliştirici hem de DBA kamplarını içermelidir. Hem hız hem de verim için, hangi kodlama yöntemlerinin ve veri alma paradigmalarının birlikte çalışabileceği konusunda taviz verilmelidir. Kaynak kodun işlenmesi için verilerin hazırlanması, kod verileri almadan önce yalnızca bir kez yapılırsa, DBA yalın ve ortalama SQL kullanımını dikte etmelidir. BL, DBA ile uyumlu olmayan bir şeyse, dizginler daha sonra Geliştiricinin elindedir. Bu nedenle, DBA kendini ve proje ekibinin bir bölümünü görmeli ve kendine ait bir ada değil, geliştirici DBA'nın gerekli gördüğü durumlarda SQL'in ince ayarını yapmasına izin vermelidir.


4

DBA's dolu bir web sitesinde sormak güzel bir soru. Umarım cevapların çoğu, veritabanını bir ACID durumunda tutmaya ve dolayısıyla iş mantığını veritabanında tutmaya yönelik "pro" olacaktır. :-)

Bence iş mantığını hem uygulamalarınızda hem de veritabanlarınızda uygulamanız gerektiğini düşünüyorum. Bu yaklaşım daha fazla zaman ve paraya mal olacak, ancak bunun sonucunda nitel olarak daha iyi bir iş çözümü olacağını düşünüyorum.


1
İki katmanda aynı mantık?
dezso

Yeni bir müşteri oluşturmak istiyorsanız, adını ve bir müşteri numarasını (her zaman 4 sayı içeren) saklamanız gerekiyorsa, başvurumun bir SQL bildirimi göndermeden önce müşteri numarasının geçerli olup olmadığını kontrol etmesini istiyorum. veritabanı (ifadeyi bilmek veri tabanındaki businness mantığımı geçmeyecek).
Ruud van de Beeten

2
Tüm iş mantığı mantığı veritabanında uygulanmalıdır (bu nedenle 'mantığı' bölmeyin). Uygulamalarda kolayca kontrol edebileceğiniz her şey (örneğin, Javascript’te normal ifadelerle) veritabanı için daha az işe yarar (geçersiz girdi olması durumunda).
Ruud van de Beeten

2
+1, yaptığım şey bu; sadece "iş girişini veritabanına koymak ve uygulamada kolaylık kontrolleri koymak" olarak adlandırıyorum
Jack Douglas

1
Bu işi yapmak için sistematik bir yaklaşıma sahip olmanız gerekir. Verileri her zaman beklentilere uygun hale getiren çekirdek bütünlük mantığı, önce veritabanında yapılması gerekir. İstisnai koşulların veritabanından uygulamaya geri doğru iletişimi sağlamak ve müşteriyi bunları kullanıcıya yeterli şekilde iletebilmek, sonra gelir. O zaman veritabanına bir gezi yapmadan önce bunları tekrarlamak en yinelenen kısım olacak ve mutlaka senkronize tutulmaları gerekecektir - bunları senkronize etme ihtiyacını en aza indirebilirseniz en iyisi siz olursunuz.
Cade Roux

2

Adam Musch'un yukarıda söylediği gibi, burada performans için düşünülecek daha çok şey var. CPU kullanımı. Hafıza kullanımı.

Açıkça yanlış şeyler veritabanına almasını engelle.

  • Basit bir şekilde uymayan e-posta adreslerini silin.
  • Uzunlukları kontrol

Derinleştiğinde karar vermeniz gereken zaman budur. DB sunucusu, müşterinin kolayca yapabileceği şeyler yapmak için çok pahalı bir yerdir. örnek: veri biçimlendirme, tarih biçimlendirme, dizeleri birleştirme, vb istemci tarafı.

İstemcide veya DB sunucusunda matematik / işlem yapıyor musunuz? Benim için bu, karmaşıklığa ve ilgili kayıt sayısına bağlı. İş mantığı gerçekten DB'nin içinde yapılmalı ve böylece her şey aynı şekilde ele alınmalıdır.
Gelecekte başınız ağrılardan kurtulmak için verileri DB'ye yazmak için procs okumak ve saklamak için gerçekten bir görünümler API'si oluşturmalısınız.

Her iki tarafın güçlü yanlarını sizin yararınıza kullanın.

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.