Saya tahu pertanyaan ini mungkin ditutup berdasarkan opini, tetapi yang saya butuhkan saat ini adalah beberapa pendapat yang didukung oleh argumen.
Saya membangun aplikasi dengan Postgres dan Ecto (Elixir) sebagai layer persistence. Ada entitas yang mereferensikan dirinya sendiri sehingga Anda dapat membangun struktur seperti pohon dengannya. Semakin saya mencoba melakukan ini dengan Ecto, semakin frustrasi saya.
Apakah ORM hanyalah alat yang buruk untuk membuat struktur DB yang kompleks dengan banyak asosiasi? Cara berorientasi objek yang mencoba diterapkan oleh ORM pada data relasional tampaknya merupakan pendekatan yang buruk di sini. Objek terisolasi. Jika mereka berinteraksi dengan objek lain, mereka (seharusnya) mengirim pesan. Detail batin mereka harus tetap disembunyikan. Data relasional membentuk grafik yang terbuka dan transparan. Kedua dunia ini sepertinya sama sekali tidak cocok untukku.
Namun, ORM sangat umum dan populer. Apakah sebagian besar aplikasi web bekerja dengan entitas yang agak terisolasi yang cocok dengan ORM, atau mengapa begitu? Tampak bagi saya bahwa jika Anda ingin menerapkan model ERD rumit rata-rata menggunakan kerangka kerja ORM, Anda harus mengorbankan kode ringkas atau kinerja.
sumber
Jawaban:
Pada akhirnya ORM hanyalah abstraksi yang menghasilkan sql untuk Anda dan memetakan data ke objek Anda. Menyimpan (tm) Anda beberapa kode 'boiler plate'.
Jadi tidak ada yang ORM secara keseluruhan buruk pada definisi. Masalahnya adalah bahwa Anda tidak menggunakan ORM secara keseluruhan, Anda harus memilih yang spesifik dan menggunakannya!
ORM individu mungkin tidak melakukan hal tertentu dengan sangat baik. Procs Tersimpan, sql dinamis, bidang terhitung, gabungan rumit dll.
Masalah yang lebih halus adalah bahwa ketika ORM mencoba menangani semua skenario ini dengan cara yang generik, ia menjadi lebih besar dan lebih rumit untuk digunakan.
Jika Anda memiliki aplikasi besar atau rumit, kemungkinan bahwa pada titik tertentu Anda akan mengalami masalah dengan ORM yang Anda pilih. Jadi masuk akal untuk merencanakan ini sebelumnya dan memastikan bahwa Anda menyembunyikan ORM di belakang repositori. Dengan begitu Anda bebas untuk menukarnya dengan alternatif, atau kembali ke kode SQL tangan jika diperlukan.
sumber
SELECT * FROM some_table WHERE x = whatever
yang sangat umum. Struktur hierarkis ditangani dengan baik di beberapa ORM, dan sangat di yang lain, jadi jenis pertimbangan ini harus diteliti sebelum memutuskan untuk sepenuhnya melupakan ORM.Tidak. Sebagai contoh, Ruby on Rails menggunakan ActiveRecord, yang menangani asosiasi. Dalam contoh di sini: /programming/5109893/rails-how-do-self-referential-has-many-models-work , struktur mirip pohon diselesaikan dengan 2 baris kode.
Jadi saya berpendapat bahwa itu waaaaay lebih mudah daripada mencoba untuk menggulung query sql Anda sendiri.
Mungkin tidak, tapi itu hanya dugaan saja. ORM ada dalam ekosistem di mana mereka berkembang, menunjukkan bahwa mereka sedang digunakan. Saya telah menggunakan ORM untuk sistem dengan lebih dari 20 model terkait dan ternyata baik-baik saja. Saya tidak pernah memaksa benda untuk diisolasi dengan hanya pesan yang lewat.
Sebagai pendapat ringkas, jika Anda membuat model ERD "kompleks", tidak ada alat yang membuatnya mudah. Hanya alat yang membuatnya bekerja.
sumber
.Any()
pernyataan LINQ)Sebagaimana dicatat dalam setidaknya satu jawaban lain di sini, semua ORM tidak sama. Beberapa ORM membuat asumsi yang sangat signifikan tentang bagaimana database harus disusun. Tooling harus memberikan beberapa dukungan untuk keluar dari model ini, tetapi semakin banyak Anda keluar dari model itu, semakin sedikit nilai ORM yang dimilikinya. Jika Anda bekerja dengan alat ORM yang lebih dominan, Anda akan memiliki pengalaman yang jauh lebih baik jika Anda mendesain database berdasarkan asumsi implisitnya.
Saya tidak pernah benar-benar mengerti mengapa ORM dilihat oleh banyak pengembang dan arsitek sebagai hal yang penting. Ini mungkin karena fakta bahwa saya hampir tidak pernah memiliki database lapangan hijau untuk bekerja dan waktu dan upaya yang diperlukan untuk menyelesaikan pemetaan ORM jauh lebih banyak pekerjaan daripada menulis SQL. Entah pemetaannya sederhana (dan juga SQL) atau rumit dan saya tetap membutuhkan SQL (atau yang serupa). 'Dukungan' transaksional yang termasuk dalam ORM lebih merupakan sumber bug dan masalah daripada bantuan, menurut pengalaman saya.
Jarak tempuh Anda mungkin berbeda-beda, tetapi saya percaya bahwa lebih baik memikirkan ketekunan basis data hanya sebagai kasus khusus serialisasi data. Dan sama seperti saya pikir tidak masuk akal untuk percaya Anda dapat 'mengirim' objek melalui kawat, saya tidak berpikir itu benar-benar masuk akal untuk berpikir menulis objek ke database. Saya bahkan berpikir itu benar-benar valid untuk memiliki beberapa representasi objek dari data yang sama untuk kebutuhan yang berbeda. Memetakan objek ke tabel dan sebaliknya telah menjadi akhir dari dirinya sendiri sebagai lawan dari solusi untuk masalah. Saya tidak yakin kebanyakan orang yang menggunakan alat-alat ini bahkan memiliki alasan yang jelas untuk ingin melakukannya. Itu menjadi default.
sumber