Apakah akan memasukkan logika bisnis dalam Prosedur Tersimpan atau Tidak?

21

Selalu ada perdebatan tentang topik - "Apakah akan menempatkan logika bisnis dalam Prosedur Tersimpan atau Tidak?". Jika kami memutuskan untuk tidak menggunakan Alat ORM dan tidak menempatkan Logika Bisnis dalam Prosedur Tersimpan maka di mana kami akan menempatkan Logika Bisnis?

Dalam aplikasi saya sebelumnya, saya selalu lebih suka menempatkan semua Logika Bisnis dalam Prosedur Tersimpan saja. Kemudian dari .NET code saya sebut Prosedur Tersimpan ini menggunakan Blok Aplikasi Akses Data. SQLHelper dll. Tapi ini tidak bisa menjadi skenario sepanjang waktu. Jadi saya melakukan googling tetapi berakhir dengan kebingungan .......

Ada saran ...?

Pravin Patil
sumber
Saya bias -> Procs Disimpan selalu. Tapi kemudian saya bias. Lupakan pemrograman Agile, kenyataan yang menyedihkan adalah bahwa dalam dunia bisnis perubahan selalu terjadi secara ad-hoc dan perlu dilakukan "segera". Prosedur tersimpan memungkinkan itu. Ini adalah penyelamat. Mencoba membuat perubahan seperti itu melalui basis kode tidak akan layak.
Darknight
4
@Darknight, Sangat bergantung pada platform dan arsitektur Anda untuk membuat pernyataan seperti itu. Saya tidak mengerti mengapa penerapan prosedur tersimpan ke basis data jauh lebih sedikit memakan waktu daripada mengatakan, menjalankan skrip build dan deploy untuk membangun file WAR baru, menyebarkannya dan memulai kembali server aplikasi.
maple_shaft
7
Disimpan prosedur - tangki septik ilmu komputer.
Mongus Pong
1
Prosedur tersimpan - hanya alat lain seperti yang lainnya.
sam yi

Jawaban:

15

Saya akan mengadopsi pendekatan pragmatis - secara historis 'manfaat' utama dari menjaga logika bisnis dalam procs yang disimpan adalah untuk alasan kinerja (2.5 tingkat arsitektur), sedangkan memisahkan logika bisnis menjadi tingkat BLL (tingkat 3 / N) umumnya lebih bersih dari perspektif perawatan, dan lebih mudah untuk menguji (Mock / stub out akses data).

Namun, mengingat bahwa. ORMS BERSIH berkemampuan LINQ seperti LINQ2SQL, EF dan NHibernate sekarang membuat kueri SQL berparameter, di mana paket kueri dapat di-cache, diloloskan ke SQL Injection dll, saya akan menduga bahwa langkah menuju arsitektur tingkat 3 / N adalah lebih menarik dari sebelumnya, dan sebagian besar SPROC (terutama yang berpusat pada permintaan) dapat dihindari sama sekali. Pola repositori di .NET biasanya mengekspos IQueryable / menerima parameter pohon Ekspresi, memungkinkan untuk jenis akses yang aman, namun fleksibel ke tabel Anda. (Secara pribadi dalam arsitektur tipe SOA, saya tidak akan mengekspos IQueryable di luar BLL, yaitu tingkat Layanan dan Presentasi Anda harus bekerja dengan serangkaian metode yang terdefinisi dengan baik. Alasannya adalah jika tidak, Anda tidak akan pernah dapat sepenuhnya menguji sistem Anda, dan Anda akan menang '

Namun, dalam sistem ukuran yang layak, akan selalu ada beberapa pengecualian, di mana sepotong kode yang benar-benar intensif data mungkin masih perlu ditulis sebagai Stored Proc untuk alasan kinerja. Dalam hal ini saya akan menyimpan SPROC, dan mengekspos SPROC melalui ORM, tetapi masih mengekspos fungsi sebagai metode pass-through pada BLL Anda.

StuartLC
sumber
1
+1 untuk lebih mudah menulis pengujian unit pada tingkat aplikasi, namun kerangka kerja pengujian unit DB otomatis sudah jauh.
maple_shaft
14

Menjadi pengembang java preferensi saya adalah untuk menempatkan logika bisnis di BLL (kontrol sumber yang bagus dan mudah, keakraban dll dll).

Namun, setelah bekerja untuk perusahaan besar dengan banyak aplikasi terdistribusi menggunakan teknologi berbeda (C #, Java, Pilih (jangan tanya)) satu manfaat signifikan dari menggunakan prosedur tersimpan menjadi jelas:

Prosedur Tersimpan dapat dibagikan di berbagai aplikasi .

NimChimpsky
sumber
Poin yang sangat bagus
NoChance
1
Ini sangat benar, dan kami menggunakannya untuk memberikan pengaruh yang baik di lingkungan kami. Namun, berbagi kode menggunakan lapisan data selalu tampak agak berbahaya bagi saya. Jika Anda memiliki banyak konsumen dari sepotong logika / data tertentu maka saya lebih suka meletakkan layanan di depannya daripada memiliki banyak konsumen dari database yang sama.
RationalGeek
2
Jika Anda membagi manajemen data menjadi pustaka, pustaka tersebut juga dapat dibagikan di aplikasi yang berbeda secara teoritis ...
glenatron
2
Saya setuju sebagian. Semua teknologi ini mengakses database secara langsung; jadi Anda menggunakan prosedur tersimpan untuk berbagi kode umum di antara mereka. Anda bisa juga memecahkan masalah yang sama dengan memiliki tingkat menengah dan memiliki solusi heterogen mengakses tingkat menengah Anda alih-alih database Anda, dan tingkat menengah itu berbagi kode seperti itu.
Ekevoo
1
Karena jawaban ini adalah omong kosong, 6 tahun kemudian - hanya data yang masuk dalam database. Anda menempatkan logika di sana Anda memiliki banyak masalah di telepon. Hanya membangun microservice dalam bahasa pilihan Anda yang mengakses db.
NimChimpsky
6

Tim kami memiliki aturan lunak di sini. Terkadang lebih baik untuk menyelesaikan Logika Bisnis dalam T-SQL, kadang-kadang lebih mudah untuk melakukannya di c # (Lapisan Bisnis).

Jadi kami memiliki solusi pragmatis: Letakkan di tempat yang lebih cocok. Saya tahu teorinya kadang sangat ketat tentang itu ... tapi itu teori :-)

gsharp
sumber
2
Tentunya ini adalah solusi terburuk dari semua? Bagaimana cara pengembang pengembang mengetahui di mana logika disimpan? Saya akan membayangkan bahwa kadang-kadang juga merayap ke dalam lapisan aplikasi, atau lebih buruk lagi, UI?
Paul T Davies
2
Nggak. Itu selalu menjadi Lapisan Bisnis atau T-SQL. Mencari tahu di mana logika disimpan mungkin adalah masalah terkecil ketika datang ke pemeliharaan.
gsharp
Apa yang terjadi ketika seseorang bergabung dengan tim dan Anda memberi tahu mereka aturan ini? Bagaimana mereka bisa tahu di mana sesuatu "lebih cocok"? Ini hampir tampak seperti non-aturan bagi saya. Sangat subyektif berdasarkan individu.
RationalGeek
3
Ayo teman-teman, serius? Kami mempekerjakan orang-orang yang memiliki otak untuk berpikir dan datang dengan beberapa pengalaman di atas kapal. Lalu .. oh ya mereka punya mulut untuk bertanya dan melakukan percakapan. Saya dapat mengatakan bahwa perangkat lunak kami membutuhkan perawatan yang sangat rendah dan fitur-fitur baru dapat diimplementasikan dengan baik oleh hampir semua orang di tim kami. tidak mungkin salah apa yang kita lakukan.
gsharp
4
Saya benar-benar tidak melihat rasa untuk menyalahgunakan c # untuk hal-hal yang SQLServer dapat lakukan jauh lebih baik, dan sebaliknya.
gsharp
3

Ada kelebihan dan kekurangan untuk keduanya (menurut saya):

Prosedur tersimpan dapat menjadi mimpi buruk jika Anda tidak menggunakan semacam kontrol sumber SQL (yang banyak tempat tidak) dan Anda memiliki beberapa pengembang yang mengatasinya. Seseorang dapat mengubah prosedur tersimpan dan lupa memperbarui kode yang menyebut prosedur itu dan sebelum Anda mengetahuinya, Anda baru saja membangun dan menggunakan situs yang akan melempar pengecualian yang tidak ditangani (jumlah parameter ketidakcocokan dll).

Di sisi lain, prosedur tersimpan memungkinkan perbaikan bug lebih cepat dalam situasi tertentu. Jika ada bug dengan prosedur tersimpan Anda baru saja memperbaikinya dan Anda selesai. Perbaikan bug dalam ORM membutuhkan pembangunan kembali. Bergantung pada proses pembuatan Anda, ini bisa panjang / menjengkelkan.

AndrewC
sumber
+1 untuk kebutuhan kontrol sumber dengan procs tersimpan jika Anda akan menggunakannya dengan berat. Banyak DBA yang saya kerjakan sangat menentang ide ini.
RationalGeek
2

Kami selalu menempatkan Logika Bisnis kami di Lapisan Logika Bisnis. Jika Anda memasukkannya ke Prosedur Tersimpan, itu akan hilang begitu Anda mengubah RDBMS Anda.

šljaker
sumber
16
Hal terakhir yang berubah adalah RDBMS ;-)
gsharp
Jadi apakah itu berarti, bahwa Anda membatasi Prosedur Tersimpan untuk mengambil, Memperbarui, dan Memasukkan data ....?
Pravin Patil
1
Setiap sistem besar yang saya lihat, kenyataannya adalah bahwa database itu sistemnya. Bahasa pemrograman hampir menjadi tidak relevan pada saat ini hanya sebagai "ujung depan" ..
Darknight
2
@ gsharp, itu tidak selalu benar. Anda mungkin ingin menambahkan RDBMS lain seperti Oracle, atau untuk sepenuhnya mengganti yang sudah ada. Atau, dalam beberapa kasus, Anda ingin mengganti data nyata dengan data dummy.
šljaker
2
@ šljaker tentu saja itu tidak selalu benar. Tetapi lebih mungkin bahwa perubahan program (mendesain ulang perangkat lunak, bahasa pemrograman baru, dll) daripada DB.
gsharp
2

"Logika bisnis" adalah istilah yang tidak jelas. Maksud saya tidak memiliki definisi tunggal. Aturan praktisnya adalah untuk meminimalkan komunikasi antara tingkatan ketika Anda bisa. Jadi, Anda tidak perlu mengirim nama pelanggan kosong ke server untuk memeriksanya sebelum memasukkan baris.

Ada kasus, ketika aturan didasarkan pada basis data yang dibaca. Katakanlah Anda ingin mentransfer uang dari Akun 1 ke Akun 2. Anda harus membaca kedua akun, pastikan mereka dalam status baik dan jumlah dalam Akun 1 cukup. Dalam hal ini, server adalah kandidat yang lebih baik untuk aturan ini karena klien (menjadi BL di sini) tidak perlu mengeluarkan 3 panggilan ke tingkat basis data untuk proses ini.

Tentu saja, jika Anda membutuhkan solusi Anda untuk menjadi basis data independen, buat procs yang disimpan hanya untuk CRUD (jika sama sekali digunakan).

Tidak ada kesempatan
sumber
1

Logika harus dalam BLL selalu karena:

  • Itu bisa diuji dengan benar
  • Ketika SQL 20XX menjadi usang dan Anda perlu mengubah ke versi terbaru, Anda tidak perlu menulis ulang kode Anda.
  • Orang tidak tergoda untuk melakukan perubahan saat itu (yang tampaknya diajukan sebagai argumen UNTUK SP)
  • SP, menurut pengalaman saya, adalah satu-satunya titik kesalahan pengembang terbesar, terutama setelah beberapa generasi pemeliharaan / perubahan.

Saya percaya harus ada undang-undang yang menyatakan bahwa setelah SP lebih dari garis X panjang, tidak berfungsi sebagaimana dimaksud.

Paul T Davies
sumber
Apa yang salah dengan perubahan dengan cepat? Jika ada bug dalam prosedur tersimpan dan mudah diperbaiki, maka perbaiki. Ini positif karena itu berarti Anda tidak perlu melakukan rilis ulang untuk sesuatu yang sepele. Selama orang tidak mulai menutupi bug dalam kode dengan mengubah prosedur yang tersimpan maka saya tidak melihat masalah.
AndrewC
Dengan perubahan on the fly, saya maksudkan hal-hal yang tidak diuji dan tidak mengikuti prosedur rilis formal. Dan ya, perubahan sp untuk bug kode mask adalah sesuatu yang saya lihat cukup adil.
Paul T Davies
0

Kami membuat lapisan layanan yang berisi semua logika bisnis kami diimplementasikan dalam bahasa yang dipilih dan hanya menggunakan database untuk kueri. Pendekatan ini diamanatkan oleh kami karena tujuan kami adalah menciptakan solusi COTS untuk mengirimkan aplikasi dengan berbagai implementasi basis data. Hibernate telah terbukti menjadi penyelamat bagi kami dalam keadaan ini.

Saya pikir keuntungan terbesar dari pendekatan ini, selain dari portabilitas basis data, adalah Anda dapat menemukan semua jawaban Anda dalam satu pencarian.

Selain itu, terlepas dari beberapa jawaban untuk sebuah forum, saya punya teman yang bekerja untuk perusahaan asuransi yang memiliki kekayaan 100 orang yang melakukan 2 konversi basis data dalam tiga tahun karena basis data pilihan untuk perusahaan berubah.

Thom
sumber
0

Dalam pengalaman saya yang terbatas, saya lebih suka menjaga integritas data dengan prosedur tersimpan dan fitur basis data lainnya. Misalnya, jika saya menerapkan transfer dana antara dua akun, saya akan menulis prosedur tersimpan. Saya merasa berharga untuk dapat menggunakan beberapa bahasa aplikasi.

kevin cline
sumber