Bagaimana menyarankan menggunakan ORM daripada prosedur yang tersimpan?

31

Saya bekerja di perusahaan yang hanya menggunakan prosedur tersimpan untuk semua akses data, yang membuatnya sangat menjengkelkan untuk menjaga database lokal kami tetap sinkron karena setiap komit kami harus menjalankan procs baru. Saya telah menggunakan beberapa ORM dasar di masa lalu dan saya menemukan pengalamannya jauh lebih baik dan lebih bersih. Saya ingin menyarankan kepada manajer pengembangan dan seluruh tim bahwa kami ingin menggunakan ORM untuk pengembangan di masa mendatang (anggota tim lainnya hanya mengenal prosedur tersimpan dan tidak pernah menggunakan hal lain). Arsitektur saat ini adalah .NET 3.5 ditulis seperti .NET 1.1, dengan "kelas dewa" yang menggunakan implementasi ActiveRecord yang aneh dan mengembalikan set data yang tidak diketik yang di-loop dalam file kode-belakang - kelas bekerja seperti ini:

class Foo { 
    public bool LoadFoo() { 
        bool blnResult = false;
        if (this.FooID == 0) { 
            throw new Exception("FooID must be set before calling this method.");
        }

        DataSet ds = // ... call to Sproc
        if (ds.Tables[0].Rows.Count > 0) { 
            foo.FooName = ds.Tables[0].Rows[0]["FooName"].ToString();
            // other properties set
            blnResult = true;
        }
        return blnResult;
    }
}

// Consumer
Foo foo = new Foo();
foo.FooID = 1234;
foo.LoadFoo();
// do stuff with foo...

Hampir tidak ada aplikasi dari pola desain. Tidak ada tes apa pun (tidak ada orang lain yang tahu cara menulis unit test, dan pengujian dilakukan melalui memuat situs web secara manual dan melihat-lihat). Melihat melalui database kami, kami memiliki: 199 tabel, 13 tampilan, 926 prosedur tersimpan dan 93 fungsi. Sekitar 30 atau lebih tabel digunakan untuk pekerjaan batch atau hal-hal eksternal, sisanya digunakan dalam aplikasi inti kami.

Apakah layak melakukan pendekatan yang berbeda dalam skenario ini? Saya berbicara tentang bergerak maju hanya karena kami tidak diizinkan untuk memperbaiki kode yang ada sejak "itu berfungsi" sehingga kami tidak dapat mengubah kelas yang ada untuk menggunakan ORM, tetapi saya tidak tahu seberapa sering kami menambahkan modul baru sebagai gantinya menambahkan / memperbaiki modul saat ini jadi saya tidak yakin apakah ORM adalah pendekatan yang tepat (terlalu banyak diinvestasikan dalam prosedur dan DataSet yang tersimpan). Jika itu pilihan yang tepat, bagaimana saya harus menyajikan kasing untuk menggunakannya? Dari atas kepala saya satu-satunya manfaat yang dapat saya pikirkan adalah memiliki kode pembersih (walaupun mungkin tidak, karena arsitektur saat ini bukan T dibangun dengan ORM dalam pikiran sehingga kita pada dasarnya akan menjadi ORM juri-rigging ke modul masa depan tetapi yang lama masih akan menggunakan DataSet) dan lebih mudah untuk mengingat prosedur skrip apa yang telah dijalankan dan yang perlu dijalankan, dll. tapi itu saja, dan saya tidak tahu bagaimana menariknya argumen itu. Kemampu-rawatan adalah masalah lain tetapi yang tidak diperhatikan oleh siapa pun kecuali saya.

Wayne Molina
sumber
8
Sepertinya Anda memiliki lebih banyak masalah daripada sekadar meyakinkan tim untuk menggunakan ORM. Menurut saya, tim Anda tidak mengetahui beberapa praktik pengembangan yang baik (misalnya pola desain, pengujian unit). Ini adalah masalah yang lebih penting yang perlu Anda tangani.
Bernard
6
Ironisnya, saya pikir dalam sekitar 5 tahun pengembangan saya hanya bertemu mungkin beberapa orang / tim yang menyadari hal-hal seperti pola desain dan pengujian unit; biasanya saya satu-satunya pria di perusahaan yang tahu tentang hal-hal itu.
Wayne Molina
3
@Wayne M: Saya menemukan itu agak mengganggu, tapi saya juga tidak terkejut dengan ini.
Bernard
2
Saya merasa sangat ... mengecewakan. Ini aneh ketika Anda menyarankan sesuatu dan mendapatkan tampilan "rusa di lampu depan" yang menunjukkan bahwa orang lain tidak memiliki gagasan yang samar-samar tentang apa yang Anda bicarakan atau mengapa ada orang yang mempertimbangkan untuk melakukan itu. Saya pernah mengalami itu beberapa kali di masa lalu.
Wayne Molina
2
Saya penggemar berat Prosedur Tersimpan, jadi komentar saya bias, tapi saya sepenuhnya tidak setuju dengan seluruh premis. Anda menyukai ORM dan Anda ingin menggunakan ini, tidak apa-apa. Namun anggota tim lainnya baik-baik saja dengan pro Stored. Mengapa memaksa mereka untuk apa yang Anda suka?
Darknight

Jawaban:

47

Prosedur tersimpan buruk, seringkali lambat dan kira-kira seefisien kode sisi klien biasa.

[Speedup biasanya disebabkan oleh cara klien dan antarmuka prosedur tersimpan dirancang dan cara transaksi ditulis sebagai semburan SQL pendek dan terfokus.]

Prosedur tersimpan adalah salah satu tempat terburuk untuk meletakkan kode. Ini memecah aplikasi Anda menjadi dua bahasa dan platform sesuai dengan aturan yang seringkali acak.

[Pertanyaan ini akan diturunkan untuk memiliki skor sekitar -30 karena banyak, banyak orang merasa bahwa prosedur tersimpan memiliki kekuatan magis dan harus digunakan terlepas dari masalah yang mereka sebabkan.]

Memindahkan semua kode prosedur yang tersimpan ke klien akan membuat segalanya lebih mudah bagi semua orang.

Anda masih harus memperbarui skema dan model ORM dari waktu ke waktu. Namun, perubahan skema terisolasi dari perubahan ORM, memungkinkan beberapa independensi antara aplikasi dan skema database.

Anda akan dapat menguji, memperbaiki, memelihara, memahami dan mengadaptasi semua prosedur yang tersimpan saat Anda menulis ulang. Aplikasi Anda akan berjalan hampir sama dan menjadi jauh lebih rapuh karena Anda tidak lagi membobol dua teknologi yang berbeda.

ORM bukanlah sihir, dan keterampilan desain database yang baik sangat penting untuk membuatnya berfungsi.

Juga, program dengan banyak klien SQL dapat menjadi lambat karena pemikiran yang buruk tentang batasan transaksi. Salah satu alasan prosedur tersimpan tampaknya cepat adalah bahwa prosedur tersimpan memaksa desain transaksi yang sangat, sangat hati-hati.

ORM tidak secara ajaib memaksakan desain transaksi yang hati-hati. Desain transaksi masih harus dilakukan dengan hati-hati seperti ketika menulis prosedur tersimpan.

S.Lott
sumber
19
+1 karena prosedur tersimpan sangat menyebalkan untuk dikerjakan
Gary Rowe
3
: '(Saya tidak punya masalah dengan prosedur tersimpan. Ini hanya lapisan abstraksi bagi saya
Mike Weller
3
Jika kita membuat SP maka mesin database menyimpannya sebagai form yang dikompilasi dan itu menciptakan jalur eksekusi sehingga akan mengeksekusi secepat mungkin Tetapi ORM mengirim SQL setiap kali yang perlu dikompilasi dan dijalankan oleh mesin database. Saya pikir akan lebih lambat menggunakan ORM daripada Stored Procedure.
DeveloperArnab
4
Lucu. Kami beralih dari ORM ke prosedur tersimpan hanya karena .. SPEED. Bukan jumlah waktu yang kami butuhkan untuk pemrograman, tetapi waktu yang dibutuhkan ORM untuk hal-hal seperti mematerialisasi objek, mencari objek, memperbarui klien yang berbeda. SP mana jauh lebih cepat. Satu contoh: membaca 30.000 objek dari DB dengan kebutuhan ORM modern baru ... oh well. batas waktu setelah 2 Menit. Memanggil prosedur tersimpan dan mendapatkan hasilnya - 2 detik. Ya - ada banyak trik seperti paging untuk mengurangi callign menjadi banyak dari DB - tetapi perbedaan besar jika itu hanya ORM yang dapat digunakan atau untuk
Offler
2
@DeveloperArnab: Itu mungkin benar 20 tahun yang lalu, tetapi mesin DB modern cukup canggih dan dapat mengenali permintaan yang dieksekusi sebelumnya dan menggunakan kembali rencana eksekusi, perbedaan kecepatan saat ini sangat kecil sehingga sulit menjamin kerumitan tambahan SPs.
whatsisname
20

Prosedur tersimpan baik, cepat dan sangat efisien dan merupakan tempat yang ideal untuk meletakkan kode Anda yang berhubungan dengan data. Memindahkan semua kode itu ke klien akan membuat segalanya sedikit lebih mudah bagi Anda sebagai pengembang klien (sedikit, karena Anda masih harus memperbarui skema dan model ORM ketika komit mengubahnya) tetapi Anda akan kehilangan semua kode yang ada, dan membuat aplikasi Anda lebih lambat dan mungkin lebih rapuh mengingat hilangnya semua keterampilan sql tersebut.

Saya bertanya-tanya apakah DBA duduk di sana berkata "oh, setiap komit, saya harus menarik klien lagi, kita harus memindahkan semua kode ke dalam bentuk DB sebagai gantinya".

Dalam kasus Anda, Anda harus dapat mengganti ORM kustom yang ada (yaitu kelas lucu Anda) dengan orang lain tanpa kehilangan apa pun kecuali perubahan cara penulisan kode di belakang kode Anda. Anda dapat menyimpan SP juga karena kebanyakan (semua?) ORM akan dengan senang hati memanggil mereka. Jadi, saya akan merekomendasikan mengganti kelas "Foo" dengan ORM dan pergi dari sana. Saya tidak akan merekomendasikan mengganti SP Anda.

PS. Tampaknya Anda memiliki banyak kode umum di kelas kode-belakang, yang menjadikannya pola desain tersendiri. Menurut Anda apa pola desain di tempat pertama! (ok, itu mungkin bukan yang terbaik, atau bahkan yang bagus, tapi itu masih DP)

Sunting: dan sekarang dengan Dapper , alasan apa pun untuk menghindari sprocs pada ORM kelas berat hilang.

gbjbaanb
sumber
3
+1, langkah pertama yang jelas adalah pindah ke ORM dan menggunakannya untuk memetakan hasil prosedur tersimpan yang ada ke objek. Singkirkan semua ds.Tables[0].Rows[0]["FooName"].ToString()omong kosong itu. Manajer menyukai prosedur tersimpan? Dia harus menjaga mereka. Tetapi secara fisik tidak mungkin untuk berpendapat bahwa memindahkan semua kode boilerplate berulang menjadi sesuatu yang dihasilkan oleh, katakanlah, LINQ ke SQL, adalah hal yang buruk.
Carson63000
11
Yah aku tidak percaya betapa banyak "salah" yang ada di posmu. Perbandingan Anda dengan DBA yang mengeluh tentang harus menarik kode itu tidak pantas dan sama sekali tidak masuk akal. Pertama-tama, basis data adalah LAYANAN yang dimaksudkan untuk menyimpan dan mengambil data, di akhir cerita. LOGIC sesuai namanya masuk ke dalam Business Logic Layer, yang merupakan bagian dari kode API. Aplikasi lebih rapuh untuk menjauh dari sprocs? Apakah Anda serius atau hanya trolling? TDD aplikasi dengan logika sprocs dan beri tahu saya betapa menyenangkannya itu. ORM juga tidak dimaksudkan untuk diaktifkan. Database adalah, karena mereka hanyalah LAYANAN.
Matteo Mosca
5
Saya benar-benar tidak mengerti mengapa beberapa orang berpikir bahwa database adalah semacam tanah suci di mana semuanya suci. Pikirkan tentang ini. Ketika perusahaan pihak ketiga memberi Anda layanan, apakah mereka memberi Anda akses langsung ke db mereka, atau apakah mereka menyembunyikannya di balik API? Untuk menggunakan contoh populer, ambil layanan Google apa pun. Anda, pengembang, terhubung ke API publik mereka, Anda bahkan tidak tahu database apa yang ada di bawahnya, atau apakah ada database sama sekali. Begitulah cara Anda merancang perangkat lunak yang solid dan terpisah. Basis data tidak dimaksudkan untuk diakses langsung oleh aplikasi. Tingkat menengah ada untuk itu.
Matteo Mosca
5
@Matteo Mosca: tentu, tetapi bagaimana middleware mengakses DB ... itu adalah klien ke DB. "klien" tidak berarti "GUI" atau "aplikasi desktop". Ada banyak area abu-abu di tingkatan aplikasi - apakah Anda memasukkan validasi dalam GUI atau dalam logika server / bisnis? Seharusnya masuk ke server untuk menjadi desain yang bersih, tapi itu akan sangat buruk untuk kinerja dan responsif pengguna. Demikian pula, Anda sering menaruh beberapa logika di DB ketika membuat kinerja dan (dalam hal ini) kebenaran data lebih baik.
gbjbaanb
4
Maaf, tapi saya masih tidak setuju. Pada hari Anda harus menggunakan aplikasi Anda di lingkungan yang berbeda, di mana Anda tidak memiliki teknologi DB yang sama dengan yang Anda gunakan, Anda menemukan diri Anda dalam situasi di mana aplikasi Anda tidak dapat berjalan karena Anda tidak memiliki semua sprocs pada database baru .. dan bahkan jika Anda membuat ulang mereka (yang merupakan rasa sakit total) mereka bisa berbeda, karena perbedaan dialek SQL, dll. API terpusat dengan logika dan validasi, diekspos melalui standar (seperti SOAP atau REST) ​​menyelesaikan ini masalah, dan menambah testability, versi dan konsistensi.
Matteo Mosca
13

Anda tampaknya mencoba memimpin tim Anda dari satu ekstrem (prosedur dan set data tersimpan) ke yang lain (ORM lengkap). Saya pikir ada beberapa perubahan tambahan lainnya yang dapat Anda tetapkan tentang penerapan untuk meningkatkan kualitas kode lapisan akses data Anda, yang mungkin lebih bersedia diterima oleh tim Anda.

Kode implementasi active-record setengah matang yang Anda posting tidak terlalu bagus - saya akan merekomendasikan meneliti Pola Repositori yang mudah dimengerti dan diimplementasikan, dan sangat populer di kalangan pengembang .NET. Pola ini sering dikaitkan dengan ORM tetapi sangat mudah untuk membuat repositori menggunakan ADO.NET biasa.

Adapun DataSet - yuck! Pustaka kelas Anda akan lebih mudah digunakan jika Anda mengembalikan objek yang diketik secara statis (atau bahkan dinamis). Saya percaya ilustrasi ini menjelaskan pendapat saya tentang DataSet lebih baik daripada yang saya bisa.

Juga, Anda dapat membuang proc yang disimpan tanpa melompat ke ORM - tidak ada yang salah dengan menggunakan SQL parameterised. Bahkan saya pasti lebih suka menggunakan proc yang tersimpan kecuali jika Anda memiliki prosedur rumit yang menghemat beberapa perjalanan pulang-pergi ke server. Saya juga benci ketika saya membuka basis data warisan dan melihat daftar prosedur CRUD yang tak ada habisnya.

Saya tidak mengecilkan penggunaan ORM - saya biasanya menggunakannya pada sebagian besar proyek yang saya kerjakan. Namun saya dapat melihat mengapa mungkin ada banyak gesekan dalam mencoba memperkenalkan satu ke dalam proyek ini dan tim Anda yang dengan ramah, terdengar seperti mereka berhenti mempelajari hal-hal baru sekitar 8 tahun yang lalu. Setelah mengatakan bahwa saya pasti akan melihat generasi baru "Micro ORM's" seperti Dapper (digunakan untuk memberi daya pada situs ini tidak kurang) dan Massive , keduanya sangat mudah digunakan dan membuat Anda lebih dekat ke SQL daripada ORM tipikal melakukannya, dan tim mana yang mungkin lebih bersedia untuk menerima.

richeym
sumber
2
Saya pikir masalahnya hanya ketika aplikasi ditulis tidak ada ORM nyata dari catatan untuk .NET sehingga dilakukan dengan cara lain (ASP.NET 1.1), dan tidak ada yang pernah berpikir untuk melakukannya (atau apa pun) berbeda sampai saya bergabung beberapa bulan yang lalu.
Wayne Molina
1
+1 untuk Dapper. Saya baru saja mulai menggunakannya pada suatu proyek dan sangat mudah diimplementasikan dan digunakan. Saya sudah penggemar.
SLoret
4

Saya berada dalam situasi yang sama, sebenarnya perangkat keras, kekuatan, dan politik kita condong ke sisi basis data, jadi semuanya berjalan melalui prosedur tersimpan. Sayangnya, mereka merepotkan seorang pembuat kode, terutama dalam hal metadata dan pembuatan kode, karena tidak ada data meta yang kaya dalam prosedur tersimpan seperti tabel.

Apapun, Anda masih dapat menulis kode yang elegan, dan membersihkan menggunakan procs yang disimpan. Saat ini saya sedang menerapkan pola Repositori sendiri dengan semua prosedur yang tersimpan. Saya sarankan melihat FluentAdo.net untuk ide cemerlang ketika memetakan dari datareader kembali ke objek bisnis Anda. Saya mengambil sebagian dari ide itu, dan menggunakan kembali untuk solusi yang saya buat sendiri.

Justin
sumber
3

JFTR - Saya adalah pengembang PHP rendahan, tapi ini kedengarannya seperti masalah politik yang dominan.

Mengingat skala "membusuk" menopang aplikasi, maka - selain praktik terbaik - akan ada overhead yang signifikan untuk root. Ini sepertinya berbatasan dengan wilayah penulisan ulang.

Bisakah Anda menjamin bahwa alternatif yang Anda sarankan akan menghasilkan manfaat untuk membenarkan biaya untuk bisnis? Saya menduga bahwa ROI dari usaha ini mungkin sulit dijual ke bisnis. Kecuali jika aplikasinya tidak stabil, atau Anda dapat membuktikan manfaat perbaikan secara finansial - ini mungkin terbukti sulit.

Apakah ORM satu - satunya alternatif untuk SPROCS? Ada beberapa pola desain antara ORM yang penuh sesak nafas dan vanilla SQL. Mungkin Anda bisa memulai proses dengan membawa SPROCS ini secara bertahap dari DB ke dalam DBAL. Ada bahaya tentu saja bahwa ini akan tumbuh menjadi ORM homebrew dari waktu ke waktu - tetapi Anda harus selangkah lebih dekat ke tujuan.

sunwukung
sumber
2

Kami beralih dari SP ke ORM beberapa tahun yang lalu.

Dalam satu kasus, kami harus memperbarui 80 tabel. Model estimasi lama akan memperkirakan 80 jam untuk ini dengan entlib dan SP. Kami melakukannya dalam 10 :)

Ini telah memberi kami pengurangan 80% dalam jumlah waktu yang kami gunakan untuk mengembangkan lapisan akses data.

Shiraz Bhaiji
sumber
1
Dan Anda tidak bisa membuat skrip pembaruan tabel mengapa?
Darknight
Ini mengambil objek kompleks dalam memori dan menyimpannya sebagai basis data relasional untuk pelaporan. Kami memang menulis program yang melakukan refleksi pada objek untuk membuat struktur tabel.
Shiraz Bhaiji
-1

Bagi saya, masalahnya adalah bahwa penyebaran Anda tidak berfungsi dengan benar dan otomatis.

Mungkin lebih mudah untuk membuat mesin build kontinu yang tahu bagaimana memanipulasi database sesuai kebutuhan setelah setiap komit.


sumber