Kapan tidak menggunakan ORM dan lebih suka prosedur tersimpan?

13

Saya menggunakan mikro-ORM PetaPoco. Memang sangat mudah dan aman untuk bekerja dengan database menggunakan alat ORM, tetapi satu-satunya hal yang saya benci adalah kode tambahan. Saya biasa meletakkan sebagian besar kode dalam database itu sendiri dan menggunakan semua fitur RDBMS seperti Stored Procedures, Triggers etc., yang dibuat untuk menangani dengan lebih baik.

Saya ingin tahu kapan tidak menggunakan ORM untuk Prosedur / Pemicu Tersimpan dan sebaliknya.

RPK
sumber
6
Secara pribadi masalah saya dengan pemicu (khususnya, tidak berlaku untuk prosedur yang tersimpan) adalah bahwa mereka mencoba untuk "menebak" apa "aksi bisnis" yang terjadi dari bagaimana data pada DB dimanipulasi. Jika Anda memodifikasi kolom PRICE di tabel "ARTICLES", maka Anda tidak benar-benar tahu mengapa itu terjadi. Apakah pengguna hanya mengoreksi nilai yang salah ketik? Apakah itu mark-down? Apakah ini penawaran khusus yang hanya bertahan selama sehari? Pemicu harus menebak semua itu.
Joachim Sauer

Jawaban:

16

ORM (Object-relational mapping) tidak saling eksklusif dengan Stored Procedures. Sebagian besar ORM dapat menggunakan prosedur tersimpan. Kebanyakan ORM menghasilkan Prosedur Tersimpan jika Anda memilihnya. Jadi masalahnya bukan atau.

ORM dapat menghasilkan SQL yang tidak dapat diterima (dalam hal kinerja) dan Anda mungkin kadang-kadang ingin mengesampingkan SQL itu dengan SQL buatan tangan. Salah satu cara untuk mencapai ini adalah dengan menggunakan SP (prosedur tersimpan).

Di DotNet, Jangan gunakan prosedur tersimpan jika:

  • Jika Anda tidak terbiasa dengan prosedur tersimpan (bukan kasus Anda, tetapi termasuk untuk kelengkapan).

  • Jika Anda tidak ingin memperkenalkan lapisan kompleksitas dan versifying ke proyek Anda.

  • Anda membuat aplikasi yang harus bekerja dengan basis data yang berbeda atau yang harus direplikasi di beberapa server basis data (pembatasan terakhir ini hanya berlaku untuk beberapa basis data).

Perhatikan bahwa pemicu tidak dapat dibandingkan dengan ORM. Pemicu melakukan fungsi yang lebih baik tidak ada dalam kode aplikasi Anda (seperti mencatat atau menyinkronkan data di seluruh basis data).

Beberapa orang lebih suka menggunakan Stored Procedures daripada SQL dalam kode untuk alasan yang berbeda seperti keamanan (misalnya untuk mencegah injeksi SQL) dan untuk kecepatan yang diklaim. Namun, ini agak bisa diperdebatkan dan perlu diskusi rinci.

Jika ORM Anda tidak dapat menghasilkan Prosedur Tersimpan, dan Anda harus menulis sistem yang besar, maka Anda perlu mempertimbangkan pengkodean tangan ekstra berdasarkan kasing Anda.

Tidak mungkin
sumber
2
Saya percaya bahwa argumen keamanan tidak terkait dengan injeksi SQL, tetapi lebih kepada izin (yaitu sebagian besar mudah untuk mengelola izin untuk prosedur tersimpan khusus untuk pengguna yang memiliki akses ke database, tetapi mengelola izin tersebut pada tabel, kolom dan baris lebih sulit atau tidak mungkin). Namun, argumen keamanan tetap bisa diperdebatkan.
Arseni Mourzenko
@MainMa, terima kasih atas komentar Anda. Pemahaman saya adalah bahwa dengan menggunakan SPs, seseorang dapat mengurangi risiko injeksi SQL dengan menggunakan prosedur tersimpan yang diparameterisasi dengan parameter yang disematkan seperti yang disarankan artikel ini: palpapers.plynt.com/issues/2006Jun/injection-stored-procedures
NoChance
2
Prosedur tersimpan hampir tidak berdampak pada kerentanan terhadap serangan injeksi sql. Mitos-mitos lama mati keras.
Rig
@Rig 1, terima kasih atas komentar Anda, saya ingin belajar lebih banyak tentang pendapat Anda tentang ini. Pemahaman saya berasal dari teks ini (setidaknya): "Anda dapat menggagalkan serangan injeksi SQL Server dengan menggunakan prosedur tersimpan dan perintah parameter, menghindari SQL dinamis, dan membatasi izin pada semua pengguna." yang muncul di msdn.microsoft.com/en-us/library/bb669057.aspx
NoChance
@EmmadKareem Parameter sql adalah langkah besar untuk membuatnya aman. Saya pikir orang ini membuat kasus yang wajar palpapers.plynt.com/issues/2006Jun/injection-stored-procedures . Pencarian di atasnya akan "Stored Procedure SQL Injection" akan menghasilkan banyak hits. Itu selalu baik untuk membersihkan input Anda dan banyak platform menyediakan cara yang dibangun untuk melakukannya dengan cukup baik.
Rig
13

ORMs sering menganggap bahwa database ada untuk melayani ORM. Tetapi biasanya basis data ada untuk melayani perusahaan, yang mungkin memiliki ratusan dan ratusan aplikasi yang ditulis dalam berbagai bahasa.

Tetapi ini hanya "ORM vs. Stored Procedures" jika Anda menggunakan ORM yang tidak dapat memanggil prosedur tersimpan. Kalau tidak, itu adalah kasus menentukan di mana kode logika bisnis.

Di mana pun Anda memberi kode logika bisnis, tugasnya adalah memastikan database berubah dari satu kondisi konsisten ke kondisi konsisten lainnya terlepas dari aplikasi mana yang membuat perubahan . Jadi, Anda benar-benar hanya memiliki dua pilihan praktis - kode sekali dalam database, atau kode itu sekali dalam lapisan akses data "tak tertembus".

Waspadalah terhadap antarmuka baris perintah dbms jika Anda menggunakan DAL "yang tidak dapat ditembus".

Mike Sherrill 'Cat Recall'
sumber
4
Saya telah mengalami lebih dari satu kasus di mana SP lama dan pemicu harus digunakan dengan aplikasi baru karena aplikasi lama yang ada. Keuntungannya adalah bahwa logika bisnis ini hanya harus dipertahankan di satu tempat.
jfrankcarr
Saya pasti tidak menyangkal bahwa "satu database untuk melayani mereka semua" telah digunakan, tetapi sebagian besar merupakan hal di masa lalu khususnya karena pemeliharaan menjadi murni, terutama ketika beberapa aplikasi perlu mempertahankan versi mereka sendiri dari procs yang disimpan. Memiliki database yang ada untuk melayani aplikasi yang memiliki itu adalah pendekatan yang jauh lebih modern karena menegakkan kopling lebih longgar antara aplikasi dan layanan.
Flater
-1

Permintaan sederhana -> ORM

Permintaan kompleks -> Prosedur Tersimpan

Malam gelap
sumber
3
Di mana Apakah pemisahan kompleks dari Query sederhana,
Independen
-2

Pemicu harus digunakan sebagai invarian catatan atau terdiri dari aturan bisnis vital, IMHO.

Masalah orms:

  1. Anda harus menetapkan izin per tabel, bukan per "Aksi" (maksud saya SP)
  2. Untuk mengubah logika solusi Anda, Anda perlu mengubah kode di dalam aplikasi Anda dan kemudian mendistribusikannya kembali melalui jaringan untuk klien
Yuriy Vikulov
sumber
-5

Tidak setuju. Permintaan ORM hanya lebih sederhana jika Anda tahu ORM lebih baik dari yang Anda tahu SQL. ORM menghasilkan kode yang jauh lebih banyak, jauh lebih sulit untuk mempertahankan IMO. Satu-satunya orang yang mendapat manfaat dari ORM adalah pemegang saham perusahaan yang menjual ORM (misalnya Microsoft).

hantu
sumber
1
Sayang sekali bahwa pendapat yang diungkapkan dalam jawaban ini tidak didukung baik oleh referensi maupun oleh pengalaman. Akibatnya, akan sia-sia bagi pembaca yang mungkin tersandung pada klaim "terbalik" seperti prosedur tersimpan hanya menguntungkan vendor DB . Membuat orang menyadari mengapa panduan dalam Pertanyaan Nyata Memiliki Jawaban menyatakan: "pertanyaan nyata memiliki jawaban , bukan barang atau ide atau pendapat ... "
gnat