Apakah ORM masih merupakan anti-pattern?
(github.com/getlago)- ORM sering dikritik sebagai “mainan untuk startup”, tetapi pokok persoalan sebenarnya lebih dekat pada cara penggunaan yang keliru daripada ORM itu sendiri
- Grafik objek dan tabel relasional adalah dua model yang berbeda sehingga muncul ketidakselarasan paradigma, tetapi ini saja tidak cukup untuk menyebut ORM sebagai anti-pattern
- Perdebatan tentang pelanggaran SRP dan SOC tetap valid, namun ORM sejak awal adalah abstraksi yang menghubungkan dua model data, sehingga sulit menilainya hanya dari ada tidaknya pelanggaran prinsip
- Masalah performa lebih sering muncul dari pola merangkai data di logika bahasa host daripada dari ORM, dan bisa dikurangi dengan fitur mirip SQL milik ORM
- Alasan utama Lago mengganti kueri Active Record ke SQL mentah bukanlah kecepatan melainkan visibilitas dan debugging, dan untuk kueri besar, beralih ke SQL mentah bisa lebih menguntungkan secara praktis
Sikap dasar dalam melihat kritik terhadap ORM
- ORM sering diserang sebagai “anti-pattern”, tetapi kesimpulan bahwa ORM itu sendiri buruk cenderung berlebihan
- Seperti abstraksi lain, ORM juga tidak sempurna, dan dapat menimbulkan sebagian hilangnya visibilitas serta biaya performa
- Lago mengalami masalah saat bergantung pada Active Record, ORM milik Ruby on Rails, dan dari situ meninjau kembali cara mereka bergantung pada ORM
- Kesimpulannya bukan bahwa ORM harus dibuang, melainkan bahwa ORM perlu diperlakukan sebagai abstraksi dengan kelebihan dan kekurangan yang jelas
Perbedaan antara model objek dan database relasional
- Objek yang ditangani ORM lebih dekat ke graf berarah yang menunjuk ke node lain
- Tabel database relasional lebih dekat ke graf tak berarah di mana data terhubung dua arah melalui kunci bersama
- ORM bisa meniru graf tak berarah, tetapi konfigurasi dan perilakunya tidak selalu sederhana
- Objek
Userbisa saja tidak memiliki arrayPosts - Entitas dalam array
Postsbisa saja tidak memiliki referensi balik ke objekUseryang sama - Sekalipun ada referensi balik, objeknya bisa saja bukan objek yang sama melainkan salinannya
- Objek
- Misalnya, ORM dapat mengembalikan posting milik pengguna sebagai array, tetapi setiap posting mungkin tidak menyertakan referensi balik pengguna sebagai penulisnya
- Ketidakselarasan ini adalah kritik akademis yang baik terhadap ORM, tetapi dalam operasi nyata masalah yang lebih besar biasanya muncul dari cara pemakaian yang spesifik
Perdebatan SRP dan SOC
-
Single Responsibility Principle (SRP)
- ORM dikritik karena melanggar Single Responsibility Principle (SRP)
- Karena satu kelas atau lapisan bisa dibuat menangani beberapa peran sekaligus
- menjalankan database dan transaksi
- merepresentasikan record
- mendefinisikan relasi
- membuat dan menjalankan migrasi
- Namun tujuan ORM sendiri memang untuk menghubungkan dua paradigma data yang berbeda, sehingga sulit menolak ORM hanya berdasarkan sebagian pelanggaran prinsip
-
Separation of Concerns (SOC)
- ORM juga dapat mengaburkan prinsip Separation of Concerns (SOC)
- SOC adalah prinsip bahwa komponen infrastruktur seharusnya hanya memiliki satu concern
- Karena ORM memindahkan pengelolaan database ke sisi backend, ada ruang untuk melihatnya sebagai pelanggaran SOC
- Namun saat ini komponen infrastruktur dan pola pengkodean sering menggabungkan beberapa peran demi performa, latensi, dan kerapian kode
- agregator CPU di dalam database OLAP
- backend-frontend edge
- monorepo
Masalah performa lebih sering muncul dari cara penggunaan daripada dari ORM itu sendiri
- Kritik bahwa ORM selalu tidak efisien pada umumnya keliru
- Banyak ORM dapat bekerja jauh lebih efisien daripada yang dibayangkan pengembang
- Masalahnya adalah ORM memudahkan perangkai data dilakukan di logika bahasa host seperti JavaScript atau Ruby
- Dalam contoh TypeORM, pola buruknya adalah mengambil penulis dari perusahaan tertentu terlebih dahulu, lalu mengambil ulang posting untuk setiap penulis, dan menyimpan setiap posting secara terpisah
- Cara yang lebih baik adalah menyusun satu kueri update dengan
createQueryBuilder()milik TypeORM - Dalam refaktorisasi SQL billing Lago juga tidak ada perbedaan performa antara versi Active Record dan versi SQL mentah
- Karena fitur penggabungan data milik Active Record sudah digunakan cukup banyak, kueri lama sebenarnya sudah dalam keadaan optimal
- Penulisan ulang ke SQL mentah lebih dekat pada upaya mendapatkan visibilitas daripada peningkatan performa
Kapan ORM benar-benar bisa menjadi lambat
- ORM tidak selalu seefisien SQL mentah, dan dalam beberapa situasi bisa sangat tidak efisien
- Masalah pertama adalah ORM dapat menimbulkan overhead komputasi yang besar saat mengubah hasil kueri menjadi objek
- TypeORM disebut sebagai contoh masalah ini
- Masalah kedua adalah ketika relasi satu-ke-banyak atau banyak-ke-banyak ditelusuri sambil mengirim banyak permintaan bolak-balik ke database
- Pola ini disebut masalah N+1
- kueri awal 1 buah diikuti N subkueri tambahan
- Dalam contoh Prisma, saat pengguna, posting, dan komentar diambil secara bertingkat, setiap komentar bisa memicu permintaan database baru
- N+1 sering muncul di ORM, tetapi dengan data loader, N+1 kueri dapat dipadatkan menjadi 2 kueri
- Cukup banyak masalah umum ORM bisa dihindari jika fitur ORM dimanfaatkan dengan baik
Masalah yang lebih besar adalah visibilitas dan debugging
- Kelemahan terbesar ORM adalah visibilitas
- Pada dasarnya ORM adalah pembuat kueri, sehingga selain kasus seperti kesalahan tipe mentah yang sangat jelas, ORM bukan penyampai akhir dari error
- Saat error SQL dikembalikan, ORM harus menafsirkannya lalu menyampaikannya kembali ke pengguna
- Active Record mengalami kesulitan di titik ini, dan inilah juga alasan Lago merefaktorisasi kueri langganan billing mereka
- Ketika hasil yang keluar berbeda dari yang diharapkan, proses berikut harus diulang
- memeriksa kueri SQL yang dirender
- menjalankan ulang SQL tersebut
- memetakan kembali error SQL ke perubahan di Active Record
- Proses bolak-balik seperti ini melemahkan tujuan awal penggunaan Active Record, yaitu agar tidak perlu berinteraksi langsung dengan database SQL
Penilaian praktis
- Jika digunakan dengan benar, ORM dapat memberikan efisiensi yang mendekati SQL mentah
- Banyak masalah muncul ketika fitur ORM yang mirip SQL tidak digunakan dan struktur logika bahasa host terlalu diandalkan
- Jika kueri besar menyulitkan pengembang dan menghambat debugging, memindahkannya ke kueri SQL mentah bisa menjadi investasi yang baik
- Sebagian besar ORM menyediakan kemampuan untuk menjalankan kueri SQL dari dalam ORM
1 komentar
Komentar Hacker News
Saya sudah memakai ORM sejak Hibernate baru muncul di Java, tapi rasanya selalu kurang bagus
Keunggulan katanya bisa “ganti ke database lain” kalau dilihat sekarang hampir seperti omong kosong, dan pada praktiknya tidak ada yang benar-benar memakainya seperti itu
Pernyataan bahwa “tidak perlu tahu SQL” juga salah, dan aplikasi non-trivial yang berumur panjang pada akhirnya tetap perlu mengutak-atik query individual di level string
Menurut saya, lapisan data memang paling tepat dibuat dengan menyusun dan menginterpolasi query satu per satu sebagai SQL string, dan makin dekat ke raw JDBC makin baik
Klaim bahwa ORM mendukung “model domain” juga alasan yang buruk, karena model domain itu pada akhirnya selalu menjadi anemic domain model yang kosong dari logika
Kalau memikirkan waktu yang terbuang untuk ORM, XML, anotasi, debugging SQL hasil generate, dan sebagainya, rasanya ingin menangis
Bagian yang mudah itu memang sudah mudah, jadi saya tidak terlalu peduli; justru di saat terburuk ketika query runtuh saat bertemu skala, saya sering harus melawan ORM itu sendiri sehingga pekerjaan jadi sejuta kali lebih sulit
Query builder memang tidak sepenuhnya sama dengan ORM, tapi saya suka tulisan https://gajus.medium.com/stop-using-knex-js-and-earn-30-bf41... dan menjadi penggemar teknologi seperti Slonik
Ia memberi 90% fungsi yang saya inginkan, seperti auto-binding hasil ke objek dan pemeriksaan tipe yang kuat, sambil tetap membiarkan kita menulis SQL biasa
Saya juga tidak paham anggapan bahwa SQL itu bahasa yang secara misterius sulit. Memang tua dan punya kekurangan, tapi tetap lebih baik belajar SQL daripada mempelajari bahasa query buatan alat ORM
Waktu itu kalau mengutarakan kritik seperti ini, pengembang lain sering memandang rendah
Sampai sekarang pun banyak alat dan teknik yang terpaksa harus dipakai sebagai developer itu anti-pattern, dan kenyataan menyedihkan di industri adalah cukup banyak alat yang dipakai luas itu kurang bagus serta mendorong anti-pattern
Di industri teknologi ada segelintir developer dan mantan developer yang punya koneksi bagus serta memegang kendali keputusan, dan mereka terasa kurang bagus
Ada juga ORM yang rasio kelebihan dan kekurangannya cukup baik, terutama di ekosistem Python
Django ORM itu kaku dan performanya juga kurang bagus, tapi terintegrasi dengan baik, praktis, produktif, dan enak dipakai
Peewee menyediakan ORM dalam paket kecil, jadi kalau tidak butuh fitur luar biasa dan sedang malas, ia membuat menulis program kecil terasa menyenangkan
SQLAlchemy butuh investasi lebih besar, tapi sangat fleksibel, menghasilkan SQL yang rapi, dan bekerja dengan benar
Ia juga membuka query builder tingkat lebih rendah untuk saat Anda tidak menginginkan paradigma berorientasi objek dan ingin mengekspresikan abstraksi perilaku SQL yang idiomatis lewat Python
Pada akhirnya ini menjadi keputusan engineering biasa yang menimbang return on investment
Saya sudah melakukannya lebih dari 10 tahun, tapi belum pernah ada query yang tidak bisa ditangani lebih baik oleh Hibernate jika Anda membaca dokumentasi Hibernate selama 5 menit dan mengikuti yang disarankan untuk situasi itu
Kelihatannya para fanboy SQL yang percaya semua developer harus menghafal tabel logika tiga nilai dan nama fungsi ala COBOL justru tidak mau repot membaca dokumentasi Hibernate
ORM itu untuk beban kerja OLTP, bukan untuk OLAP, dan salah satu pendiri Hibernate juga pernah mengatakan demikian
Manfaat utamanya hanyalah menghindarkan kita dari harus menulis sendiri query INSERT/UPDATE yang panjang dan rawan salah, serta melakukan pemetaan otomatis baris SQL ke objek
Kalau memilih pendekatan raw, banyak bagian itu pada akhirnya harus diimplementasikan ulang, jadi ini juga bukan permainan zero-sum
Dalam aplikasi yang cukup kompleks, pada akhirnya akan muncul sesuatu seperti query builder yang memungkinkan berbagai bagian aplikasi menyusun query secara tertunda bersama-sama
Strukturnya menjadi seperti menyusun lewat query alih-alih menggabungkan, memfilter, dan mengurutkan data di memori
ORM adalah alat yang memudahkan hal ini, tetapi juga bisa membuat kita tanpa sadar menembak kaki sendiri karena mudah menghasilkan query N+1
Seperti semua alat, trade-off harus dipertimbangkan bersama use case nyata, dan memanipulasi string pernyataan SQL secara langsung tidak direkomendasikan dalam keadaan apa pun
Meski begitu, selalu ada orang yang mengabaikan perbedaan itu lalu menyatakan secara mutlak bahwa ORM itu baik atau buruk
Lebih baik anggap itu sebagai sikap provokatif untuk menarik perhatian dan lanjut saja, lalu fokus pada diskusi yang berangkat dari, “ORM punya kelebihan, tetapi kita harus tahu di mana itu berlaku, dan memastikan masalah penggunaannya tidak melampaui manfaatnya”
Kalau butuh data, pergilah ke lapisan akses data, dan jika yang dibutuhkan belum tersedia, buat repositori baru atau provider lain yang sesuai dengan pola yang dipakai
Baik ORM maupun penyusun query buatan sendiri, kalau aplikasi sudah sampai membuat orang keliru merasa “ini perlu karena aplikasinya cukup kompleks”, berarti kondisinya sudah terlalu rumit untuk dipakai secara stabil
Pada akhirnya kita jadi menilai builder di lapisan yang salah, atau luput menyadari bahwa saat menelusuri hasil kita sedang membuat query N+1
ORM tidak diperlukan
LINQ bukan ORM secara persis; jika kita membuat pernyataan LINQ yang bertipe kuat, itu akan diubah menjadi expression tree, lalu provider query mengubahnya kembali menjadi query
Saat pengembangan, saya lebih menyukai keterbacaan ORM di dalam model, tetapi ketika diperlukan saya memantau dengan saksama N+1 dan inefisiensi lain lalu mengoptimalkannya
Batas “ketika diperlukan” memang tidak jelas, tetapi saya berusaha untuk tidak mengoptimalkan terlalu dini
Untuk proyek baru, saya cenderung memulai dari database, lalu sebelum menulis kode saya membangun intuisi model data lewat factory, seeder, dan query raw SQL
ORM seperti Eloquent di Laravel punya metode yang baik untuk mengatasi N+1 dan melakukan lazy loading, tetapi selalu ada trade-off
Alih-alih library yang mengizinkan penyusunan query tertunda, kita menulis query secara langsung lalu library tersebut menghasilkan kode untuk query itu saat waktu kompilasi
Misalnya, jika kita menulis query seperti
getUser: SELECT * FROM users WHERE id = ?, ia akan membuat kelasGetUserQuerydan metode sepertigetUser(id: String): GetUserQueryResult, dan menurut saya model ini jauh lebih baikAlasan utama saya tidak menyukai ORM adalah kecenderungannya memperlakukan mesin SQL modern seperti penyimpanan bit bodoh yang dibesar-besarkan
CTE, join LATERAL, dan klausa RETURNING bisa sangat menyederhanakan pemrosesan atau menghilangkan kemungkinan inkonsistensi data, tetapi ORM umumnya berhenti pada pemetaan sederhana tabel dasar dan view ke objek yang sudah ditentukan sebelumnya
Kalau ORM sampai membuat tabelnya juga, itu lebih buruk lagi
SQL pada dasarnya adalah alat ekstraksi data sekaligus bahasa transformasi, tetapi ORM hampir sepenuhnya mengabaikan sisi ini sehingga banyak developer tidak tahu bahwa SQL punya lebih dari sekadar INSERT/SELECT/UPDATE/DELETE
Ada pivot table, time query, CUBE/ROLLUP, window function, set-returning function, materialized view, external table, pemrosesan JSON, pemrosesan tanggal, exclusion constraint, tipe seperti range·interval·domain, row-level security, MERGE, dan lain-lain
Ini seperti punya seluruh gudang alat, tetapi seseorang hanya menyerahkan palu, obeng, dan gergaji besi satu per satu sambil meyakinkan bahwa itu sudah cukup, dan sepanjang karier kita bahkan tidak sadar bahwa beberapa meter di sebelah ada table saw, router, sander, dan set baji
ORM memang cenderung membuat orang berpikir terutama dalam kalimat CRUD sederhana, tetapi mungkin itu justru lebih baik dan fitur tingkat lanjut seharusnya digunakan dengan hemat
Meski begitu, kalau harus memakai DB, saya sengaja berusaha menggunakan hanya subset yang sangat kecil dari fitur DB
Karena “kode” saya anggap sebagai wilayah yang bisa dikendalikan, sedangkan “database” adalah wilayah yang berbahaya dan sulit dijangkau, tempat error baru muncul belakangan dalam hal-hal seperti integration test yang lambat
Logika yang terjadi di dalam DB berada di luar cakupan pengujian tingkat rendah sehingga terasa menakutkan, dan sepertinya saya bahkan tidak akan memakai query
select-from-selectSebagian besar isi gudang alat itu akan dengan senang hati saya tinggalkan
Sebagian besar waktu akhirnya habis untuk membuat jalan memutar yang rumit demi menemukan kembali pengaman dasar untuk integritas data
Membuat database versi sendiri mungkin menyenangkan untuk belajar, tetapi bukan untuk aplikasi produksi
ActiveRecord selalu terasa bagus bagi saya
Ada beberapa situasi pengecualian, tetapi ia pas di titik 80/20, memungkinkan kita keluar ke SQL bila perlu, dan lifecycle hook-nya juga sangat bagus untuk merapikan logika domain serta mudah dipahami
ORM yang praktis itu bagus, selama tidak menyembunyikan semuanya di balik “bundle” atau memperkenalkan bahasa query sendiri
ORM yang mencoba “menyelesaikan” masalah ORM sepenuhnya justru sulit ditangani
ORM seharusnya dibuat seperti ini
Namun, untuk memakainya dengan benar dibutuhkan pengetahuan awal yang baik tentang SQL
Masalah muncul ketika orang tidak belajar SQL dan tidak memahami query yang dihasilkan AR maupun keterbatasannya
Premisnya salah. ORM tidak pernah menjadi “ide yang berbahaya”.
Memang ada ORM yang mengerikan untuk diajak bekerja, tetapi itu tidak berarti seluruh genrenya adalah gagasan buruk.
Saya sudah bertahun-tahun senang memakai SQLAlchemy karena ia tidak berusaha menciptakan ulang konsep SQL itu sendiri.
Sebaliknya, ia menyediakan lapisan yang nyaman untuk membangun dan meneruskan query, serta menangani detail-detail kecil dengan benar sehingga kita tidak perlu mengutak-atiknya sendiri.
Belakangan ini saya belajar Rust, dan menulis sendiri kode boilerplate untuk menangani CRUD sederhana terasa menyakitkan dan seperti buang-buang waktu.
ORM SQLAlchemy memang bisa sedikit menghalangi untuk query yang lebih kompleks atau yang ingin dioptimalkan, tetapi dalam kasus seperti itu kita selalu bisa turun langsung ke SQL.
Seperti halnya apa pun, ada situasi yang cocok dan yang tidak, dan teknologi mudah disalahgunakan atau dipakai dengan keliru.
Misalnya, ORM seperti Entity Framework di .NET bisa menjadi aset besar, terutama saat bekerja dengan pendekatan database-first.
Jika Anda punya DB dengan ratusan tabel dan relasi foreign key yang benar, ORM membantu menavigasi skema yang rumit dan memberi pemeriksaan saat kompilasi ketika ada perubahan.
SQL tertanam adalah pedang bermata dua yang tampak seperti keuntungan performa, tetapi sangat sulit dipelihara, terutama untuk SQL panjang yang di-hardcode dengan banyak join.
Maksud saya ketika tabelnya ratusan, bukan 5~10 tabel.
Saya tidak berniat meyakinkan siapa pun, tetapi jangan menelan mentah-mentah apa yang Anda baca di internet tentang praktik terbaik.
Bisa jadi orang-orang sedang membicarakan hal yang sama sekali berbeda, dan akan selalu ada developer buruk apa pun teknologinya.
Jika Anda tidak memakai ORM atau antarmuka DB lain, pada akhirnya Anda akan menulis dan memelihara sendiri sesuatu untuk hal-hal seperti CRUD.
Dan besar kemungkinan di dalamnya akan muncul bug aneh, edge case, dan celah keamanan.
Ada masalah juga ketika prinsip seperti SOLID diajarkan di kelas universitas sebagai prinsip desain perangkat lunak.
Di akademia itu masuk akal karena batasan seperti waktu, maintainability, uang, dan usaha kurang penting, tetapi ketika lulusan baru masuk ke dunia kerja, benturannya bisa sangat buruk.
Soalnya mereka terbiasa menghabiskan sepanjang hari untuk mencukur yak dan menemukan kembali roda demi mencari solusi yang “sempurna”.
Kalau tidak ada cukup senior/lead developer yang kompeten untuk mengendalikan ini, hasilnya bisa berupa produk yang sangat “menarik”, anggaran membengkak, kebakaran besar, atau kombinasi semuanya.
Yang lebih buruk adalah ketika sesuatu dibuat di akademia dan dirancang untuk akademia lalu dilepas ke publik.
Contoh baik/buruk yang representatif adalah OpenStack, yang punya begitu banyak tuas dan titik penyesuaian serta komponen yang dimodularisasi secara gila-gilaan agar bisa mendukung lingkungan khusus CERN dan ratusan universitas, tetapi begitu Byzantium sampai-sampai hampir mustahil untuk mulai memakainya.
ORM tidak akan membuat Anda bisa mengganti database tanpa usaha, tidak menghilangkan kebutuhan untuk mempelajari dan memahami SQL yang dihasilkannya, dan tidak akan membuat skema menjadi mulus.
Namun orang tetap memakainya karena ini adalah abstraksi standar yang pada akhirnya memang harus diduplikasi.
ORM memungkinkan caching akses DB, yang dengan SQL manual menjadi sangat sulit secara mengejutkan seiring skala membesar.
Ia juga menghadirkan alat dan praktik terbaik yang terstandardisasi, sehingga masalah seperti N+1 bisa menjadi tidak relevan.
Masalah utama ORM adalah ekspektasi yang salah dan ORM yang buruk.
Kalau ingin tahu nilai ORM, buka proyek yang ditulis tanpa ORM lalu coba ubah apa saja.
Lihat https://news.ycombinator.com/item?id=36498583.
Pekerjaan yang berguna jadi tidak berjalan, atau memakan waktu 20~100 kali lebih lama dibanding pendekatan yang cepat dan kotor.
Yang paling buruk adalah ketika sebuah tim desainer HTML berpengalaman dipaksa belajar functional programming.
Penyihir konfigurasi backend itu adalah keajaiban rekayasa modern dan desain elegan, tetapi pembuatannya memakan 10 orang selama 1 tahun.
Uang VC memang bisa membuat orang jadi aneh.
Bahasa SQL sangat kompleks, dan membuat query builder yang benar-benar lengkap dengan semua fitur yang semestinya jelas bukan hal sepele.
Itu pun belum menyentuh bagian pemetaan relasional yang sebenarnya.
Saya rasa SQL adalah salah satu kasus di mana “program saja sendiri omong kosong itu secara langsung” memang benar
Tidak banyak gunanya belajar SQL atau library ORM; lebih baik belajar dan menulis SQL langsung
Akses database kemungkinan adalah pekerjaan fundamental yang akan terus dilakukan sepanjang karier, jadi yang terbaik adalah mempelajari keterampilan nyatanya secara langsung
CSS juga mirip; alih-alih belajar library CSS, lebih baik belajar dan memakai CSS
Sebenarnya hampir semua aspek pengembangan frontend juga begitu; alih-alih “library form”, kita bisa langsung menangani API form milik browser
Secara pribadi, SQL jauh lebih mudah dipelajari daripada ORM mana pun
Jangan buang biaya untuk mempelajari hal yang keliru
CSS juga sama; kalau paham CSS, kita jadi jauh lebih fleksibel dan lebih mengerti saat memilih library demi kemudahan
Lewat berbagai platform pengembangan seperti mainframe, desktop, client/server, web, dan beragam bahasa di atasnya, SQL selalu menjadi benang merah yang sama
Saya sepenuhnya setuju bahwa pengembang yang benar-benar memahami lapisan data dan apa yang terjadi di bawahnya adalah pengembang yang lebih kuat
Jika mau menghabiskan waktu untuk mempelajari keanehan ORM, pertanyaan klasiknya adalah: kenapa waktu itu tidak diinvestasikan untuk belajar SQL?
Bunga majemuk dari pengalaman SQL kemungkinan akan lebih bernilai 10~15 tahun kemudian dibanding ORM dari platform atau bahasa tertentu
Ada alasan untuk mempelajari dan memakai ORM, tetapi jangan condong ke ORM hanya karena tidak mau belajar SQL
Dengan begitu kita tahu apa yang harus dibayar untuk abstraksi itu. Tentu, kalau itu “abstraksi tanpa biaya”, ceritanya lain
Tetapi sekarang saya memakai
cruddariazer, yang bisa dikategorikan sebagai ORM, karena marshaling/unmarshaling dengan tipe Gosqldi pustaka standar Go terlalu mendasar, jadi kita praktis harus menulis sendiri marshaling/unmarshaling objek, dan itu benar-benar membosankanKalau sekarang memakai ORM, sepertinya saya akan memakainya hanya untuk tujuan itu
Saya suka micro ORM “titik tengah” seperti Dapper atau Diesel
Query tetap ditulis dalam SQL, tetapi kita mendapat strong typing dan pemetaan otomatis hasil set ke objek
Jadinya kita memperoleh produktivitas sekaligus bahasa query “sungguhan” yang lengkap fiturnya
Saya juga jadi suka pendekatan di mana object mapper hanya dipakai untuk query read-only
Update dilakukan dengan command pattern, yaitu stored procedure, lalu dipetakan agar terlihat seperti metode native
Pengembang harus berhenti berpura-pura bahwa SQL itu tidak ada dan menerimanya saja
Eloquent mengabstraksikan pekerjaan remeh semacam itu dengan cukup baik sehingga saya bisa fokus ke logika
Saya sedang menulis ulang aplikasi PHP “lama” yang hanya berisi array dan query menjadi struktur yang memakai model dan Eloquent, dan rasanya benar-benar mengubah permainan
Dulu saat memakai SQLite di .NET, saya juga membuat library pembungkus ke arah seperti itu: https://github.com/zmj/sqlite-fast
Thread ini menunjukkan dengan jelas dominasi mindshare ORM
Di hampir semua komentar, alternatif implisit terhadap ORM adalah raw SQL dalam bentuk string literal di dalam kode aplikasi
Padahal sejak 6 tahun lalu sudah ada alat-alat yang memakai SQL sebagai sebuah bahasa dan menghasilkan wrapper yang mengekspos query ke aplikasi sebagai metode
Misalnya queryfirst, pgtyped, pugsql, sqlc
Ini adalah perubahan paradigma, atau setidaknya bisa menjadi itu, dan tampak jelas sebagai cara kerja yang lebih unggul; tetapi ORM dan perdebatan yang tak berubah ini menyedot semua oksigen sehingga pendekatan itu tetap berada di pinggiran
SQL adalah sebuah bahasa, dan itu pun bahasa tingkat tinggi
Mencoba menyambung-nyambungkan SQL dengan bahasa yang lebih rendah tingkatnya adalah contoh klasik dari “kalau pegang palu, semua masalah terlihat seperti paku”
Misalnya Anda sedang menulis dengan assembly yang tingkatnya rendah sambil berinteraksi dengan sistem besar, lalu dokumentasi sistem itu berkata bahwa input hanya bisa diekspresikan dalam JavaScript; ada pilihan
Anda bisa membawa library aneh yang memungkinkan merangkai sesuatu dalam assembly murni sehingga tidak perlu meng-commit file
xxx.jske repositori, atau Anda bisa menuliskannya saja sebagai file.jsdan memanfaatkan kekuatan bahasa tingkat tinggi ituMuncul satu sumber kebenaran tunggal untuk query SQL yang dipakai, dan karena yang benar-benar ditulis serta dipelihara adalah query itu sendiri, optimisasi seperti membuat indeks baru juga jadi mudah
Menaruh abstraksi di atas string raw SQL sangat berguna, tetapi berpura-pura bahwa relasi adalah objek itu pendekatan yang rumit dan berbelit
TopLink mungkin juga begitu
Begitulah cara framework itu menangani pemetaan antara stored procedure dan entitas lokal