Mengapa Anda harus menggunakan ORM? [Tutup]


113

Jika Anda akan memotivasi para "pro" mengapa Anda menggunakan ORM untuk manajemen / klien, apa alasannya?

Coba dan pertahankan satu alasan per jawaban sehingga kami dapat melihat apa yang dipilih sebagai alasan terbaik


3
Anda harus menjadikannya wiki jika Anda menginginkan sebuah jajak pendapat
frankodwyer

1 untuk menjadikannya wiki jika Anda ingin jajak pendapat
cletus

16
Bagaimana dengan kontra?
Brian Matthews

4
Dan tidak ada sendok juga. Tidak, sungguh, ada kontra: kinerja. Jauh lebih mudah untuk mengoptimalkan kueri DB saat Anda tidak harus melalui ORM. (Saya tidak mengeluh - baru-baru ini beralih ke ORM, saya sangat senang dengan itu; untuk tujuan umum, ORM adalah cara yang harus ditempuh; tetapi simpan beberapa cara untuk menjalankan kueri lebih dekat ke logam jika Anda membutuhkan kinerja)
Piskvor meninggalkan gedung

2
@ UğurGümüşhan, IMHO Manfaat utama menggunakan ORM adalah membuat pengembang lebih produktif, dengan membiarkan mereka memprogram dalam bahasa yang sama dan paradigma OO yang mereka gunakan di aplikasi lainnya. Prosedur tersimpan tidak dapat menyediakan itu, ketika mereka membuat kode pengembang dalam bahasa prosedur tersimpan RDBMS. Jadi mereka tidak bisa melakukan semua yang ORM bisa.
Bill Karwin

Jawaban:


53

Membuat akses data menjadi lebih abstrak dan portabel. Kelas implementasi ORM tahu cara menulis SQL khusus vendor, jadi Anda tidak perlu melakukannya.


61
Meskipun saya setuju bahwa ini adalah fitur ORM, saya mengusulkan bahwa kasus penggunaan cukup terbatas. Saya tidak pernah benar-benar menggunakan apa pun selain MySql dan sqlite selama sekitar satu dekade. Saya pikir itu mungkin persyaratan yang sangat langka bagi sebagian besar pengembang.
troelskn

40
@troelskn: Saya setuju, saya telah menggunakan banyak produk RDBMS, tetapi tidak pernah lebih dari satu atau dua per proyek. Jadi portabilitas bukanlah nilai paling praktis dari mengabstraksi SQL. Saya pikir banyak pengguna ORM hanya ingin menghindari pengkodean dalam SQL sama sekali.
Bill Karwin

2
vendor keluar dengan versi / fitur baru setiap saat ... hanya perlu beberapa orang keren untuk menulis dialek dan peningkatan yang mudah!
dotjoe

5
Jawaban tipikal yang tidak berguna Saya bertanya-tanya mengapa itu ditandai sebagai jawaban yang baik sepertinya orang yang mengajukan pertanyaan itu hanya mencoba untuk membenarkan kepada bosnya bahwa dia harus menggunakan ORM :) Pertanyaan saya lebih suka masalah apa yang akan Anda temui dengan Hibernate stackoverflow.com/questions/6477170/…
user310291

2
@ user310291: OP tidak menanyakan masalah atau jebakan, dia meminta keuntungan menggunakan ORM. Tentu ada pro dan kontra, tapi dia minta yang pro. Terus terang, saya terkejut bahwa jawaban ini diterima dan mendapat suara positif sebanyak itu, karena saya tidak akan menganggapnya sebagai manfaat utama dari ORM.
Bill Karwin

83

Alasan terpenting untuk menggunakan ORM adalah agar Anda dapat memiliki model bisnis berorientasi objek yang kaya dan masih dapat menyimpan serta menulis kueri yang efektif dengan cepat pada database relasional. Dari sudut pandang saya, saya tidak melihat keuntungan nyata yang diberikan ORM yang baik kepada Anda bila dibandingkan dengan DAL yang dihasilkan lain selain jenis kueri lanjutan yang dapat Anda tulis.

Salah satu jenis kueri yang saya pikirkan adalah kueri polimorfik. Kueri ORM sederhana mungkin memilih semua bentuk di database Anda. Anda mendapatkan kembali koleksi bentuk. Tetapi setiap contoh adalah persegi, lingkaran atau persegi panjang menurut pembeda.

Jenis kueri lainnya adalah kueri yang dengan penuh semangat mengambil objek dan satu atau beberapa objek atau koleksi terkait dalam satu panggilan database. mis. Setiap objek bentuk dikembalikan dengan koleksi puncak dan sampingnya diisi.

Saya minta maaf untuk tidak setuju dengan begitu banyak orang lain di sini, tetapi saya tidak berpikir bahwa pembuatan kode adalah alasan yang cukup baik dengan sendirinya untuk menggunakan ORM. Anda dapat menulis atau menemukan banyak template DAL yang bagus untuk generator kode yang tidak memiliki overhead konseptual atau kinerja seperti yang dilakukan ORM.

Atau, jika Anda berpikir bahwa Anda tidak perlu tahu cara menulis SQL yang baik untuk menggunakan ORM, sekali lagi, saya tidak setuju. Mungkin benar bahwa dari perspektif menulis kueri tunggal, mengandalkan ORM lebih mudah. Namun, dengan ORM, terlalu mudah untuk membuat rutinitas berkinerja buruk ketika pengembang tidak memahami bagaimana kueri mereka bekerja dengan ORM dan SQL yang mereka terjemahkan.

Memiliki lapisan data yang berfungsi pada beberapa database dapat bermanfaat. Itu bukan salah satu yang harus saya andalkan sesering itu.

Pada akhirnya, saya harus mengulangi bahwa menurut pengalaman saya, jika Anda tidak menggunakan fitur kueri yang lebih canggih dari ORM Anda, ada opsi lain yang menyelesaikan masalah yang tersisa dengan pembelajaran yang lebih sedikit dan siklus CPU yang lebih sedikit.

Oh ya, beberapa developer merasa bekerja dengan ORM itu menyenangkan, jadi ORM juga bagus dari perspektif keep-your-developer-happy. =)


1
Kata yang bagus. Sementara poster asli secara khusus mencari "pro" dan bukan "kontra", saya telah melihat beberapa SQL MENGERIKAN dibuat dengan tidak memahami dampak CARA Anda menggunakan ORM. Bagi saya, manfaat terbesar adalah untuk transaksi CRUD sederhana yang merupakan mayoritas kode DAL Anda untuk sistem transaksional. Saya pikir Anda membagi rambut antara ORM murni dan metode DAL yang dihasilkan lainnya. Saya pikir apa pun yang membantu Anda menerjemahkan antara objek dan DB dapat dianggap ORM, itu hanya model operasional yang berbeda.
Doug Lampe

1
@Doug - Saya pikir perbedaan yang saya cari adalah bahwa DAL sederhana terdiri dari sedikit lebih banyak daripada CRUD SQL yang dihasilkan sedangkan ORM berisi lebih banyak abstraksi seperti properti navigasi, persistensi koleksi, bahasa kueri khusus, cache, dll. - Cara yang lebih baik menyatakan maksud saya sehubungan dengan pengamatan Anda mungkin bahwa meskipun benar bahwa menggunakan lebih banyak fitur ORM memungkinkan Anda mengimplementasikan lebih cepat, sama sekali tidak dapat diterima untuk tetap mengabaikan cara kerja fitur tersebut. Mungkin karena abstraksi ORM bocor lebih banyak daripada kebanyakan. ( En.wikipedia.org/wiki/Leaky_abstraction )
Chuck

harap jelaskan lebih lanjut: "jika Anda tidak menggunakan fitur kueri yang lebih canggih dari ORM Anda, ada opsi lain yang menyelesaikan masalah yang tersisa". juga, sebagai pencipta hibernate gavin king berkata: "Memang, sistem seperti Hibernate sengaja dirancang sebagai" abstraksi bocor "sehingga memungkinkan untuk dengan mudah mencampur dalam SQL asli jika diperlukan. Kebocoran abstraksi ORM adalah fitur, bukan bug ! " - reddit.com/r/programming/comments/2cnw8x/…
jungle_mole

1) Ini sudah tua. Saat itu, ORM memiliki semua fitur (cache, query, batching, dll). IMHO, berbasis objek, kueri polimorfik adalah satu-satunya fitur ORM yang tidak dapat disediakan oleh gen kode (pemetaan ADO eksplisit). 2) Sementara beberapa lubang berguna sengaja ditinggalkan, ada juga kejahatan yang diperlukan & fitur-fitur canggih yang menciptakan kurva pembelajaran tinggi di ORM. Jadi, jawaban saya adalah menggunakan gen kode alih-alih ORM kecuali Anda membutuhkan pertanyaan lanjutan. *) Saat ini, ada cukup variasi dalam ORM sehingga set fitur yang tepat untuk tim Anda mungkin tersedia di luar sana. Tim saya menyukai Linq2DB sekarang.
Chuck

60

Mempercepat perkembangan. Misalnya, menghilangkan kode berulang seperti memetakan kolom hasil kueri ke anggota objek dan sebaliknya.


3
Kode berulang sangat buruk, tetapi tidak bisakah Anda membuat abstraksi yang akan menghapus ini? Misalnya, Anda dapat memiliki objek tabel / hasil kueri yang akan memberi Anda baris belakang yang kemudian dapat Anda lakukan. ORM tampaknya memecah baris ke dalam instance kelas individual, daripada masuk ke abstraksi yang dipilih DB, yang merupakan tabel / baris hasil kueri. Saya tidak mengatakan bahwa ini berarti ORM tidak baik, tetapi saya tidak yakin ini saja adalah alasan untuk menggunakannya.
Benjohn

@Benjohn, saya setuju bahwa solusi ORM memperlakukan baris individu sebagai objek, sedangkan RDBMS memperlakukan set baris sebagai entitas. Ada hal-hal yang dapat Anda lakukan dalam pola pikir RDBMS yang tidak dapat Anda lakukan dalam pola pikir OO.
Bill Karwin

Ini seperti membeli mobil utuh hanya untuk menggunakan bagasi, ada banyak cara untuk menghindari pekerjaan berulang
mohas

15

Mendukung enkapsulasi OO aturan bisnis di lapisan akses data Anda. Anda bisa menulis (dan men-debug) aturan bisnis dalam bahasa preferensi aplikasi Anda, alih-alih bahasa pemicu kikuk dan prosedur tersimpan.


Tidakkah Anda ingin memiliki aturan bisnis Anda di database? Itulah keuntungan dari database, benar: banyak klien dapat menggunakan antarmuka yang sama yang disediakan oleh DBMS. Jika banyak logika antarmuka Anda terkunci di kode ORM klien tertentu, itu tidak ada dalam database dan klien lain tidak menggunakannya. Isyarat istirahat kantor depan belakang kantor (satu model klien keluar dari baris dengan yang lain).
Benjohn

1
@Benjohn, Saya cenderung hanya memasukkan aturan bisnis ke dalam database, tetapi aturan yang lebih kompleks tidak mudah dibentuk dalam batasan deklaratif. Misalnya, "pelanggan mendapatkan diskon 10% untuk seluruh pesanan saat pertama kali mereka membeli lebih dari tiga pasang celana panjang dari merek yang sama". Bagaimana Anda memasukkan aturan bisnis itu ke dalam database (perlu diingat jawaban yang melibatkan prosedur tersimpan itu kikuk).
Bill Karwin

Ini tahun 2020, saya tidak melihat siapa pun yang menggunakan prosedur tersimpan lagi. Jadi, apakah maksud Anda masih berdiri?
ospider

Saya pikir maksud saya adalah bahwa orang tidak menggunakan prosedur tersimpan, mereka menggunakan kode aplikasi. Apakah Anda memahami sesuatu yang berbeda?
Bill Karwin


8

Anda dapat berpindah ke perangkat lunak database yang berbeda dengan mudah karena Anda sedang mengembangkan ke abstraksi.


41
Dalam 30 tahun lebih melakukan pekerjaan database, saya tidak pernah melakukan ini.
HLGEM

4
Bukan berarti itu tidak mungkin! :)
Matt Fenelon

2
@HLGEM itu berarti Anda menutup pilihan untuk klien. Itu benar-benar bisa terjadi, hanya dalam 3 tahun kerja webapp, kami telah membangun perangkat lunak portabel menggunakan
ORM

1
Anda mungkin merasa berguna jika Anda ingin menjalankan tes pada database memori
Carlos Parraga

Ada kemungkinan bahwa beberapa contoh perangkat lunak yang sama mungkin menggunakan database yang berbeda. Namun sebenarnya pemindahan data yang ada dari satu software DB ke software lainnya sangat jarang terjadi. Dan ketika itu terjadi, banyak ORM tidak benar-benar membantu Anda dengan itu.
jlh

4

Sehingga model objek dan model persistensi Anda cocok.


1
Mungkin agar ketekunan Anda transparan untuk model objek Anda
S. Lott

4

Kebahagiaan pengembangan, IMO. ORM mengabstraksi banyak hal yang tidak berhubungan dengan logam yang harus Anda lakukan di SQL. Itu membuat basis kode Anda tetap sederhana: lebih sedikit file sumber untuk dikelola dan perubahan skema tidak memerlukan waktu pemeliharaan berjam-jam.

Saat ini saya menggunakan ORM dan itu telah mempercepat perkembangan saya.



3

Alasan saya memeriksanya adalah untuk menghindari kode yang dihasilkan dari alat DAL VS2005 (pemetaan skema, TableAdapters).

DAL / BLL yang saya buat lebih dari setahun yang lalu berfungsi dengan baik (untuk tujuan saya membuatnya) sampai orang lain mulai menggunakannya untuk memanfaatkan beberapa fungsi yang dihasilkan (yang saya tidak tahu ada di sana)

Sepertinya ini akan memberikan solusi yang jauh lebih intuitif dan lebih bersih daripada solusi DAL / BLL dari http://wwww.asp.net

Saya berpikir untuk membuat pembuat kode SQL Command C # DAL saya sendiri, tetapi ORM terlihat seperti solusi yang lebih elegan


2

Kompilasi dan pengujian kueri.

Saat perkakas untuk ORM semakin baik, lebih mudah untuk menentukan kebenaran kueri Anda lebih cepat melalui kesalahan waktu kompilasi dan tes.

Mengompilasi kueri Anda membantu membantu pengembang menemukan kesalahan lebih cepat. Baik? Baik. Kompilasi ini dimungkinkan karena pengembang sekarang menulis kueri dalam kode menggunakan objek atau model bisnis mereka alih-alih hanya string pernyataan seperti SQL atau SQL.

Jika menggunakan pola akses data yang benar di .NET, mudah untuk menguji logika kueri Anda terhadap koleksi memori. Ini mempercepat eksekusi pengujian Anda karena Anda tidak perlu mengakses database, menyiapkan data dalam database, atau bahkan memutar konteks data lengkap. [EDIT] Ini tidak benar seperti yang saya kira sebagai unit pengujian dalam memori dapat menghadirkan tantangan yang sulit untuk diatasi. Tapi saya masih merasa tes integrasi ini lebih mudah untuk ditulis dibandingkan tahun-tahun sebelumnya. [/ EDIT]

Ini jelas lebih relevan hari ini daripada beberapa tahun yang lalu ketika pertanyaan itu diajukan, tetapi itu mungkin hanya kasus Visual Studio dan Entity Framework di mana pengalaman saya berada. Plugin lingkungan Anda sendiri jika memungkinkan.


1

Abstraksi sql dari 95% waktu sehingga tidak semua orang di tim perlu tahu cara menulis kueri khusus database yang sangat efisien.


1

Saya pikir ada banyak poin bagus di sini (portabilitas, kemudahan pengembangan / pemeliharaan, fokus pada pemodelan bisnis OO dll), tetapi ketika mencoba meyakinkan klien atau manajemen Anda, semuanya bermuara pada berapa banyak uang yang akan Anda hemat dengan menggunakan sebuah ORM .

Lakukan beberapa perkiraan untuk tugas-tugas tipikal (atau bahkan proyek yang lebih besar yang mungkin akan datang) dan Anda akan (mudah-mudahan!) Mendapatkan beberapa argumen untuk peralihan yang sulit untuk diabaikan.


0

Tingkat .net menggunakan template code smith

http://nettiers.com/default.aspx?AspxAutoDetectCookieSupport=1

Mengapa membuat kode sesuatu yang bisa dibuat dengan baik juga.


Ugh. Kami menggunakan Net Tiers pada proyek komersial besar, dan saya sangat menyarankan agar tidak menggunakannya. Masalahnya adalah itu tidak bisa disusun. Ingin menanyakan objek Foo dan Bar? Anda tidak dapat menulis gabungan, Anda harus mengeluarkan kueri terpisah untuk setiap jenis objek yang Anda inginkan. Ini menghasilkan banyak panggilan ke database, yang dapat merusak kinerja dan atomisitas. Buruk buruk buruk. Menjauh.
Judah Gabriel Himango

0

yakinkan mereka berapa banyak waktu / uang yang akan Anda hemat ketika ada perubahan dan Anda tidak perlu menulis ulang SQL karena alat ORM akan melakukannya untuk Anda


0

Saya pikir satu kekurangannya adalah ORM memerlukan beberapa pembaruan di POJO Anda. terutama terkait dengan skema, relasi, dan kueri. jadi skenario di mana Anda tidak seharusnya membuat perubahan pada objek model, mungkin karena itu dibagi di antara lebih banyak proyek atau klien dan server b / w. jadi dalam kasus seperti itu, Anda perlu membaginya menjadi dua tingkat, yang akan membutuhkan upaya tambahan.

Saya adalah pengembang Android dan seperti yang Anda ketahui, aplikasi seluler biasanya berukuran tidak besar, jadi upaya tambahan untuk memisahkan model murni dan model yang terpengaruh orm ini tampaknya tidak sepenuhnya bermanfaat.

Saya mengerti bahwa pertanyaan itu adalah pertanyaan umum. tetapi aplikasi seluler juga ada di dalam payung umum.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.