Setelah beberapa tahun, pertanyaannya tetap penting ...
Aturan praktis sederhana untuk saya: jika itu adalah kendala logis atau ekspresi di mana-mana (pernyataan tunggal), letakkan di database (ya, kunci asing dan periksa kendala juga logika bisnis!). Jika itu prosedural, dengan mengandung loop dan cabang kondisional (dan benar-benar tidak dapat diubah menjadi ekspresi), masukkan ke dalam kode.
Hindari DB dump sampah
Upaya untuk benar-benar menempatkan semua logika bisnis dalam kode aplikasi kemungkinan akan mengubah basis data (relasional) menjadi tempat sampah, di mana desain relasional sebagian besar dihilangkan sepenuhnya, di mana data dapat memiliki keadaan tidak konsisten, dan normalisasi hilang (biasanya XML, JSON) , CSV dll. Kolom trashbin).
Logika khusus-aplikasi semacam ini mungkin merupakan salah satu alasan utama munculnya NoSQL - tentu saja dengan kelemahannya bahwa aplikasi harus mengurus semua logika itu sendiri, apa yang telah dibangun menjadi DB relasional selama beberapa dekade. Namun, database NoSQL lebih cocok untuk jenis penanganan data ini, misalnya, dokumen data mempertahankan "integritas relasional" tersirat dalam diri mereka sendiri. Untuk DB relasional, itu hanya penyalahgunaan, yang menyebabkan lebih banyak masalah.
Ekspresi (set-based) alih-alih kode prosedural
Dalam kasus terbaik, setiap kueri atau operasi data harus dikodekan sebagai ekspresi, bukan kode prosedural. Dukungan hebat untuk ini adalah ketika bahasa pemrograman mendukung ekspresi, seperti LINQ di dunia .NET (sayangnya, hanya permintaan saat ini, tidak ada manipulasi). Di sisi DB relasional, telah diajarkan untuk waktu yang lama, untuk lebih suka ekspresi pernyataan SQL daripada loop kursor prosedural. Sehingga DB dapat mengoptimalkan, melakukan operasi paralel, atau apa pun yang mungkin berguna.
Memanfaatkan mekanisme integritas data DB
Ketika datang ke RDBMS dengan Foreign Key dan Periksa kendala, kolom terhitung, mungkin pemicu dan pandangan, ini adalah tempat untuk menyimpan logika bisnis dasar dalam database. Normalisasi yang tepat membantu menjaga integritas data, untuk memastikan contoh data yang unik dan berbeda. Bahkan jika Anda harus menduplikatnya dalam kode dan DB, mekanisme dasar integritas data ini tidak boleh dihilangkan!
Prosedur Tersimpan?
Prosedur Tersimpan jarang diperlukan saat ini, karena database terus menyusun rencana eksekusi untuk SQL dan menggunakannya kembali ketika permintaan yang sama datang lagi, hanya dengan parameter yang berbeda. Jadi argumen precompile untuk SPs tidak lagi valid. Satu dapat menyimpan atau menghasilkan secara otomatis kueri SQL dalam aplikasi atau ORM, yang akan menemukan rencana kueri yang telah dikompilasi sebagian besar waktu. SQL adalah bahasa ekspresi, selama Anda tidak secara eksplisit menggunakan elemen prosedural. Jadi, dalam kasus terbaik, Anda menggunakan ekspresi kode yang dapat diterjemahkan ke dalam SQL.
Sementara sisi aplikasi, termasuk ORM yang dihasilkan, SQL, tidak lagi ada di dalam database, tidak seperti Stored Procedures, saya masih menghitungnya sebagai kode basis data. Karena masih membutuhkan SQL dan pengetahuan basis data (kecuali CRUD yang paling sederhana), dan, jika diterapkan dengan benar, kerjanya sangat berbeda dari kode prosedural yang biasanya dibuat dengan bahasa pemrograman seperti C # atau Java.