İş mantığını Saklı Prosedürde koymak veya kullanmamak?


21

"İş mantığını Saklı Prosedürde koymak veya kullanmamak?" Konulu üzerinde her zaman bir tartışma vardır. ORM Aracını kullanmamaya ve İş Mantığını Saklı Prosedürde koymamaya karar verirsek, İş Mantığını nereye koyarız?

Önceki uygulamalarımda, her zaman İş Mantığını yalnızca Saklı Prosedürlerde kullanmayı tercih ettim. Ardından .NET kodundan, Data Access Application Blocks'u kullanarak bu Saklı Prosedürleri çağırırım. SQLHelper vb. Ama bu her zaman senaryo olamaz. Bu yüzden biraz googling yaptım ama karışıklığa neden oldu .......

Herhangi bir öneriniz var mı?


Önyargılıyım -> Saklı İşlemler her zaman. Ama sonra önyargılıyım. Çevik programlamayı unutun, üzücü gerçeklik iş dünyasında değişikliklerin her zaman geçici olması ve "derhal" yapılması gerektiğidir. Saklı yordamlar buna izin verir. Bu bir hayat kurtarıcı. Bu tür değişiklikleri kod tabanı aracılığıyla yapmaya çalışmak mümkün olmaz.
Karanlık Gece

4
@Darknight, Böyle bir açıklama yapmak için platformunuza ve mimarinize büyük ölçüde bağlıdır. Saklı bir yordamın bir veritabanına dağıtılmasının neden yeni bir WAR dosyası oluşturmak, onu dağıtmak ve uygulama sunucusunu yeniden başlatmak için bir derleme ve çalıştırma komut dosyası çalıştırmaktan çok daha az zaman aldığını anlamıyorum.
maple_shaft

7
Saklı yordamlar - bilgisayar biliminin septik tankı.
Mongus Pong

1
Saklı yordamlar - diğerleri gibi başka bir araç.
sam yi

Yanıtlar:


15

Pragmatik bir yaklaşım benimsemektim - tarihsel olarak iş mantığını depolanan süreçlerde tutmanın temel 'yararı' performans nedenleriyle (2.5 kademe mimari), iş mantığını ise BLL katmanına (3 / N kademe) ayırmak genellikle bakım perspektifi ve test edilmesi daha kolay (Veri erişimini sahte / engelle).

Ancak, LINQ2SQL, EF ve NHibernate gibi LINQ etkin .NET ORMS'lerinin şimdi, sorgu planlarının önbelleğe alınabileceği parametreli SQL sorguları oluşturduğu göz önüne alındığında, SQL Injection vb. her zamankinden daha çekici ve SPROC'ların çoğundan (özellikle sorgu merkezli olanlar) tamamen kaçınılabilir. .NET'teki depo desenleri genel olarak IQueryable / accept Expression ağacı parametrelerini gösterir ve bu sayede tablolarınıza güvenli, ancak esnek bir erişim sağlar. (Şahsen SOA tipi mimarilerde, IQueryable’e BLL’nin ötesinde maruz kalmam, yani Hizmet ve Sunum katmanlarınız iyi tanımlanmış yöntemlerle çalışmalıdır. Aksi halde sisteminizi asla tam olarak test edemezsiniz ve kazanırsınız '

Bununla birlikte, iyi bir büyüklükte bir sistemde, performans nedenleriyle gerçekten veri yoğun bir kod parçasının yine de Stored Proc olarak yazılması gerekebilecek birkaç istisna olacaktır. Bu gibi durumlarda, SPROC’yi koruyacağım ve SPROC’yi ORM aracılığıyla göstereceğim, ancak yine de işlevi BLL’nizde bir geçiş yöntemi olarak göstereceğim.


1
Uygulama katmanında birim testlerini yazmak daha kolay + 1, ancak otomatik DB birim test çerçeveleri uzun bir yol kat etti.
maple_shaft

14

Bir java geliştiricisi olmak, tercihim BLL'ye iş mantığı koymaktı (hoş ve kolay kaynak kontrolü, tanıdıklık vb. Vb.).

Bununla birlikte, farklı teknolojiler kullanan birçok dağıtılmış uygulamaya sahip (C #, Java, Pick (sorma)) büyük bir işletme için çalıştıktan sonra, saklı yordamları kullanmanın önemli bir yararı ortaya çıktı:

Saklı yordamlar farklı uygulamalar arasında paylaşılabilir .


Çok iyi bir nokta
NoChance

1
Bu çok doğru ve çevremizi iyi etkilemek için kullanıyoruz. Ancak, veri katmanını kullanarak kod paylaşımı her zaman benim için biraz tehlikeli görünüyordu. Belirli bir mantık / veri parçasından birden fazla tüketiciniz varsa, o zaman önüne aynı veritabanında birden fazla tüketiciye sahip olmak yerine hizmet vermeyi tercih ederim.
RationalGeek

2
Veri yönetiminizi kütüphanelere
ayırırsanız

2
Kısmen katılıyorum. Tüm bu teknolojiler veritabanına doğrudan erişiyor; Yani aralarında ortak kod paylaşmak için saklı yordamları kullanıyorsunuz. Aynı problemi bir orta kademe ile çözebilir ve veritabanınız yerine orta kademe erişen heterojen çözümlere sahip olabilirsiniz ve bu orta kademe bu kodu paylaşır.
Ekevoo

1
fyi bu cevap baloney, 6 yıl sonra - sadece veri veritabanına giriyor. Oraya mantık koyarsanız, çizginin aşağısında bir sürü sorun yaşarsınız. Sadece db'ye erişen seçtiğiniz dilde bir mikro servis oluşturun.
NimChimpsky

6

Ekibimizin burada yumuşak bir kuralı var. Bazen Business Logic'i T-SQL'de çözmek daha iyidir, bazen c # (Business Layer) ile yapmak daha kolaydır.

Bu yüzden pragmatik bir çözümümüz var: Daha iyi uyan bir yere koyun. Teorinin bazen çok katı olduğunu biliyorum ... ama bu teori :-)


2
Elbette bu, hepsinin en kötü çözümü? Bakım yapan bir geliştirici, mantığın nerede saklandığını nasıl biliyor? Bazen uygulama katmanına da süründüğünü, hatta daha da kötüsü kullanıcı arayüzünün içinde olduğunu tahmin ediyorum.
Paul T Davies

2
Hayır! Her zaman İş Katmanı veya T-SQL'e girer. Mantığın nerede depolandığını bulmak muhtemelen bakım konusunda en küçük problemdir.
gsharp

Birisi takıma katıldığında ve onlara bu kuralı söylediğinde ne olur? Bir şeyin "daha iyi uyduğunu" nereden bilebilirler? Bu neredeyse bana kuralsız gibi görünüyor. Bireye göre çok öznel.
RationalGeek

3
Hadi millet, ciddi? Düşünmek ve gemide biraz deneyime sahip olmak için beyni olan insanlar kullanırız. O zaman .. oh evet, soracak ve konuşacakları bir ağızları var. Yazılımımızın çok az bakım gerektirdiğini ve ekibimizin neredeyse herkes tarafından yeni özelliklerin uygulanabileceğini söyleyebilirim. Yaptıklarımız yanlış olamaz.
gsharp

4
Gerçekten SQLServer'ın çok daha iyisini yapabileceği şeyler için c # 'yı kötüye kullanma duygusu görmüyorum.
gsharp

3

Her ikisinin de avantajları ve dezavantajları vardır (bence):

Bir tür SQL kaynak kontrolü kullanmıyorsanız (birçok yerde kullanmayan) ve üzerinde çalışan birden fazla geliştiriciniz varsa, saklı yordamlar kabus olabilir. Birisi saklı bir prosedürü değiştirebilir ve bu prosedürü çağıran kodu güncellemeyi unutabilir ve bunu bilmeden önce işlenmeyen istisnalar atacak bir site oluşturup dağıttığınızı unutmayın (parametre sayısı uyuşmazlığı vb.).

Öte yandan, saklı yordamlar, belirli durumlarda daha hızlı hata düzeltmelerini sağlar. Saklı yordamda bir hata varsa, onu düzeltmeniz yeterlidir. ORM'deki bir hata düzeltmesi yeniden oluşturulmasını gerektirir. Yapım sürecinize bağlı olarak bu uzun / can sıkıcı olabilir.


Yoğun kullanacaksanız, depolanmış işlemlerde kaynak kontrolü ihtiyacı için +1. Çalıştığım birçok DBA bu fikre karşı çok dirençli.
RationalGeek

2

İş Mantığımızı daima İş Mantığı Katmanına koyarız. Saklı Prosedür'e koyarsanız, RDBMS'nizi değiştirdikten sonra kaybolacaktır.


16
Değişen son şey RDBMS ;-)
gsharp

Yani, Saklı Prosedürü, verileri alma, Güncelleme ve Ekleme ile sınırlandırdığınız anlamına mı geliyor?
Pravin Patil

1
Gördüğüm her büyük sistem, gerçek şu ki, veritabanı sistemdir. Programlama dilleri bu noktada neredeyse sadece "ön uç" olarak anlamsız hale gelir ..
Darknight

2
@gsharp, bu her zaman doğru değildir. Oracle gibi başka bir RDBMS eklemek veya mevcut olanı tamamen değiştirmek isteyebilirsiniz. Veya, bazı durumlarda, gerçek verileri yapay verilerle değiştirmek isteyebilirsiniz.
jljaker

2
@ šljaker elbette her zaman doğru değildir. Ancak DB'nin yerine programın değişmesi (yazılımın yeniden tasarımı, yeni programlama dilleri vb.) Daha olasıdır.
gsharp

2

"İş mantığı" biraz belirsiz bir terimdir. Demek istediğim, tek bir tanımı yok. Bir kural, mümkün olduğunda katmanlar arasındaki iletişimi en aza indirmektir. Bu nedenle, bir satır eklemeden önce kontrol etmek için sunucuya boş müşteri adı göndermenize gerek yoktur.

Bir kuralın okuma veritabanına dayanması durumunda durumlar vardır. Hesap 1'den Hesap 2'ye para aktarmak istediğinizi söyleyin. Her iki hesabı da okumanız, iyi durumda olduklarından ve Hesap 1'deki tutarın yeterli olduğundan emin olmanız gerekir. Bu durumda, sunucu bu kural için daha iyi bir adaydır, çünkü müşterinin (burada BL olan) bu işlem için veri tabanı katmanına 3 çağrı yapması gerekmez.

Tabiki, çözümünüzün veri tabanından bağımsız olması gerekiyorsa, yalnızca CRUD için saklanan işlemleri yapın (eğer kullanılıyorsa).


1

Mantık her zaman BLL'de olmalıdır, çünkü:

  • Düzgün test edilebilir
  • SQL 20XX eski hale geldiğinde ve en son sürüme geçmeniz gerektiğinde, kodunuzu yeniden yazmak zorunda değilsiniz.
  • İnsanlar anında değişiklik yapma eğiliminde değiller (SP'lerin argümanı olarak öne sürüldüler)
  • SP'ler benim tecrübelerime göre, özellikle birkaç nesil bakım / değişiklikten sonra, en büyük geliştirici hatasının noktasıdır.

Bir SP'nin X satırından daha uzun sürmesinden sonra, amaçlandığı gibi çalışmadığını belirten bir yasa olması gerektiğine inanıyorum.


Anında değişikliklerin nesi var? Saklı yordamda bir hata varsa ve kolayca düzeltildiyse düzeltin. Olumlu bir şey çünkü önemsiz bir şey için tekrar yayın yapmak zorunda değilsiniz. İnsanlar saklı yordamları değiştirerek koddaki hataları maskelemeye başlamazlarsa, o zaman sorun göremiyorum.
AndrewC

Anında değişiklikler yaparak, test edilmemiş ve resmi bir sürüm prosedürünü izlemeyen şeyleri kastediyorum. Ve evet, sp kod hatalarına maske değişiklikleri adil bir şey gördüm.
Paul T Davies

0

Seçilen dilde uygulanan tüm iş mantığımızı içeren bir hizmet katmanı yaratır ve veritabanını yalnızca sorgular için kullanırız. Bu yaklaşım bizim tarafımızdan zorunludur, çünkü amacımız çeşitli veritabanı uygulamaları olan uygulamalar sunmak için COTS çözümleri oluşturmaktır. Hazırda Bekletme bu durumlarda bizim için bir cankurtaran olduğunu kanıtladı.

Veritabanının taşınabilirliği dışında, bu yaklaşımın en büyük avantajının, tüm cevaplarınızı tek bir aramada bulabilmeniz olduğunu düşünüyorum.

Ayrıca, bir foruma verilen cevapların bir kısmına rağmen, şirket için tercih edilen veri tabanı değiştiği için üç yılda 2 veri tabanı dönüşümü yapan bir servet 100 sigorta şirketi için çalışan bir arkadaşım var.


0

Sınırlı deneyimimde, saklı yordamlar ve diğer veritabanı özellikleriyle veri bütünlüğünü korumayı tercih ediyorum. Örneğin, iki hesap arasında para transferi gerçekleştiriyor olsaydım, saklı bir prosedür yazardım. Birden fazla uygulama dilini kullanabilmek için değerli buluyorum.

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.