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 ...?
Jawaban:
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.
sumber
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 .
sumber
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 :-)
sumber
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.
sumber
Kami selalu menempatkan Logika Bisnis kami di Lapisan Logika Bisnis. Jika Anda memasukkannya ke Prosedur Tersimpan, itu akan hilang begitu Anda mengubah RDBMS Anda.
sumber
"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).
sumber
Logika harus dalam BLL selalu karena:
Saya percaya harus ada undang-undang yang menyatakan bahwa setelah SP lebih dari garis X panjang, tidak berfungsi sebagaimana dimaksud.
sumber
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.
sumber
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.
sumber