Ketekunan di Jawa
Selama beberapa tahun terakhir, saya telah mengumpulkan pengalaman di bidang abstraksi kegigihan di Jawa, menggunakan konsep seperti EJB 2.0, Hibernate, JPA, dan yang dikembangkan sendiri. Bagi saya, mereka memiliki kurva belajar yang curam dan banyak kerumitan. Selain itu, sebagai penggemar berat SQL, saya juga berpikir bahwa banyak model abstraksi memberikan terlalu banyak abstraksi atas SQL, menciptakan konsep seperti "kriteria", "predikat", "pembatasan" yang merupakan konsep yang sangat bagus, tetapi bukan SQL.
Gagasan umum abstraksi kegigihan di Jawa tampaknya didasarkan pada model Object-relational, di mana RDBMS entah bagaimana cocok dengan dunia OO. Perdebatan ORM selalu menjadi sesuatu yang emosional, karena tampaknya tidak ada solusi tunggal yang cocok untuk semua orang - jika solusi semacam itu bahkan bisa ada.
JOOQ
Preferensi pribadi saya tentang cara menghindari masalah terkait ORM adalah tetap berpegang pada dunia relasional. Sekarang pilihan paradigma model data tidak boleh menjadi topik diskusi karena merupakan preferensi pribadi, atau masalah model data apa yang paling cocok dengan masalah nyata. Diskusi yang ingin saya mulai adalah tentang alat kegigihan saya sendiri yang disebut jOOQ . Saya merancang jOOQ untuk memberikan sebagian besar kelebihan yang dimiliki alat-alat kegigihan modern:
- Bahasa Spesifik Domain berdasarkan SQL
- Pembuatan kode sumber memetakan skema database yang mendasarinya ke Jawa
- Dukungan untuk banyak RDBMS
Menambahkan beberapa fitur yang dimiliki beberapa alat kegigihan modern (koreksi saya jika saya salah):
- Dukungan untuk SQL kompleks - serikat pekerja, seleksi bersarang, self-joins, aliasing, klausa kasus, ekspresi aritmatika
- Dukungan untuk SQL non-standar - prosedur tersimpan, UDT, ENUMS, fungsi asli, fungsi analitik
Silakan pertimbangkan halaman dokumentasi untuk lebih jelasnya: http://www.jooq.org/learn.php . Anda akan melihat bahwa pendekatan yang sangat mirip diimplementasikan dalam Linq untuk C #, meskipun Linq tidak secara khusus dirancang untuk SQL.
Pertanyaan
Sekarang, setelah mengatakan bahwa saya penggemar berat SQL, saya bertanya-tanya apakah pengembang lain akan berbagi antusiasme saya untuk jOOQ (atau Linq). Apakah jenis pendekatan untuk abstraksi kegigihan ini layak dilakukan? Apa kelebihan / kekurangan yang mungkin Anda lihat? Bagaimana saya bisa meningkatkan jOOQ, dan apa yang hilang menurut Anda? Di mana saya salah, secara konsep atau praktis?
Jawaban kritis tetapi konstruktif dihargai
Saya mengerti bahwa debat ini bersifat emosional. Ada banyak alat hebat di luar sana yang sudah melakukan hal serupa. Yang saya minati adalah umpan balik yang penting tetapi konstruktif, berdasarkan pengalaman Anda sendiri atau artikel yang mungkin telah Anda baca.
Jawaban:
Saya pikir Anda berada di jalur yang benar dan harus melanjutkan solusi Anda. Beberapa kritik sebelumnya terlalu keras, tetapi beberapa poin valid dibuat.
Saya juga sudah lama mencari solusi ORM berfitur lengkap yang sesuai dengan kebutuhan saya, tetapi setiap solusi yang saya lihat kurang. Masing-masing memiliki pro dan kontra tetapi tidak ada yang benar-benar melakukan semua yang saya inginkan. Saya setuju dengan kritik Anda terhadap solusi ini - yaitu bahwa mereka umumnya kompleks dan memiliki kurva belajar yang curam.
Pesaing teratas harus menjadi standar de facto, Hibernate. Ini fitur lengkap, kuat dan teruji. Saya menghargainya dan menghargainya apa adanya. Sekarang, dengan risiko menyinggung setengah komunitas pemrograman, saya juga harus mengatakan bahwa itu adalah kode non-performant yang membengkak dan kompleks. Saya telah menghabiskan cukup banyak waktu mencari-cari di ususnya, mencoba men-debug dan memahaminya, dan saya tidak terkesan dengan apa yang saya lihat. Karena itu, saya masih akan merekomendasikannya sebagai titik awal bagi siapa pun yang mencari ORM yang baik. Itu unggul di CRUD sederhana, tapi saya tidak akan menggunakannya untuk permintaan massal pemain, seperti data mining atau angka-angka.
Sayangnya, aplikasi saya lebih banyak variasi angka (meskipun ada beberapa CRUD juga), jadi saya memutuskan untuk roll sendiri. Saya tahu sejak awal bahwa itu akan setara dengan solusi lain di luar sana, tetapi itu akan cukup baik dan memberi saya kinerja yang saya butuhkan. Sekarang inilah bagian yang sangat hebat: ini sangat mirip dengan solusi Anda!
Inilah yang menurut saya paling benar Anda lakukan: Anda menyatakan keyakinan mendasar Anda sebagai semacam pernyataan misi, dan keyakinan itu benar. Saya jelas telah menghabiskan cukup banyak waktu untuk memikirkan masalah ini juga, dan ini adalah masalah yang sulit untuk dipecahkan. Tetapi seiring berjalannya waktu, saya pikir komunitas pemrograman datang untuk memahaminya dengan lebih baik, dan kami akan menciptakan solusi yang lebih baik. Kudos untuk semua upaya sebelumnya (terutama Hibernate), tapi saya pikir kita bisa melakukan yang lebih baik.
Solusi Anda lebih baik memperbaiki masalah, tetapi hanya memecahkan sebagian saja. Saya pikir pendekatan berlapis dapat memberi kita semua yang kita inginkan. Apa yang Anda hasilkan / IMO, adalah layer fondasi. Seperti yang Anda sarankan, saya pikir lapisan ini paling baik dibuat secara otomatis berdasarkan skema database. Ini harus menjadi model objek relasional yang sangat sederhana yang memetakan langsung ke database dan tidak lebih. Anda benar bahwa data bertahan lebih lama daripada kode, jadi pada level ini, data harus mengarahkan kode dan bukan sebaliknya. Ini akan mendukung CRUD serta permintaan massal yang dilakukan. Saya mungkin akan menerapkan beberapa jenis L1 cache pada layer ini.
Namun, hal yang menjadi keunggulan solusi ORM lainnya adalah kemampuan untuk mendefinisikan objek Anda dengan cara yang tidak terlalu bergantung pada struktur aktual dari basis data yang mendasarinya. Untuk fungsi ini, saya akan membuat layer lain. Dengan kebutuhan lapisan ini menjadi lebih abstrak, semoga lebih sederhana (dengan mengorbankan fungsionalitas yang hilang), dan dibangun di atas lapisan sebelumnya. Mungkin menggunakan cache L2.
Saya terbuka untuk memiliki lebih banyak lapisan, tetapi poin utama bagi saya adalah dengan menyediakan beberapa titik masuk ke perpustakaan, Anda dapat memenuhi setiap kebutuhan. Bagi mereka yang menginginkan solusi CRUD sederhana yang memetakan langsung ke objek yang mereka pilih, mereka dapat membangun di atas lapisan. Bagi mereka yang mencari sesuatu yang lebih kuat dan berkinerja tetapi bersedia untuk menambah kerumitan, mereka bisa pasang ke lapisan bawah. Saya tidak akan membuat bahasa permintaan khusus, tetapi sebaliknya akan mengekspos objek pembuat kueri Anda untuk tujuan ini. Dan karena kode berlapis, fungsi itu secara alami ada tanpa pass-through khusus.
Saya pikir Anda memiliki pemahaman tentang ruang dan tidak menciptakan kembali roda tetapi telah mencapai ceruk yang sedikit berbeda. Dan sejujurnya, ini adalah roda yang bisa menggunakan peningkatan. Anda menghadapi perjuangan berat melawan kekuatan di masa lalu, tetapi jika solusi Anda baik, dan saya pikir itu menuju ke arah itu, maka itu akan mendapatkan popularitas berdasarkan kemampuannya sendiri.
sumber
"Ada banyak peluru ajaib di luar sana, dan tidak ada kekurangan pengembang yang naif."
Jangan tersinggung, tampaknya Anda tidak sepenuhnya memahami apa yang telah dilakukan di ruang ini dan karenanya menciptakan kembali beberapa roda - pengalaman akan memberi tahu kami semua bahwa roda yang Anda buat, walaupun rapi dan menyenangkan, kemungkinannya tidak akan sebesar bagus atau bermanfaat karena roda yang telah disempurnakan dengan baik sudah tersedia.
sumber
Salah satu skenario yang akan membuat API semacam ini sangat cocok adalah ketika Anda membutuhkan pembangun database agnostik-database yang sebagian besar ORM tidak mengizinkannya. Satu situasi besar di mana saya membutuhkannya adalah dalam menghasilkan Laporan. Saya perlu membangun SQL dengan cara yang berorientasi objek dan akan menjalankan sql ini pada berbagai database untuk pengujian. Hibernate dan ORM lainnya sangat tergantung pada konfigurasi, sehingga membatasi konstruksi sql saya sehingga saya tidak bisa menggabungkan tabel di mana asosiasi tidak ada di xmls. Karena asosiasi apa pun dimungkinkan dalam Modul Laporan yang saya kembangkan, saya telah mencari sesuatu yang berbeda. Kemudian saya menemukan JOOQ. Itu hanya memecahkan masalah saya. Saya hanya perlu akses baca saja, tidak pernah mengalami masalah debugging yang menyakitkan seperti di hibernasi.
Saya sebenarnya berencana untuk mengembangkan cara pemodelan data yang berbeda daripada cara POJO umum dan menggunakan JOOQ sebagai salah satu fondasi yang merupakan lapisan untuk membangun SQL. Jadi di atas JOOQ, saya berencana untuk membuat cara pemodelan data / entitas yang lebih fleksibel dengan menggunakan HashMaps. Desain saya akan memungkinkan untuk mengintegrasikan desain front end dan backend lebih mudah di satu titik masuk, meskipun saya akan menggunakan berbagai lapisan untuk menyelesaikan kerangka kerja, seperti yang dikatakan komentar di atas. JOOQ benar-benar akan memainkan peran yang sangat bagus seperti dalam proyek saya sendiri, itu berfungsi sebagai salah satu fondasi atau pilar.
Jadi, teruskan kerja bagus luka!
sumber
Jika saya memahami alat Anda dengan benar, itu memetakan Objek langsung ke kerangka kerja konseptual SQL daripada memetakan Objek yang menerapkan beberapa pemetaan ke fungsionalitas SQL (ORM), hampir seperti ORM - abstraksi untuk kontrol culun yang lebih besar sehingga Anda dapat menggunakan lebih banyak fitur SQL ORM biasanya tidak akan memberi Anda?
Tidak yakin masalah apa yang Anda coba selesaikan. Karena alat Anda membutuhkan pengetahuan mendalam tentang SQL, bukankah orang hanya akan menggunakan, yah, SQL? Apakah itu kode lem yang Anda coba singkirkan? Validasi yang lebih baik dari query SQL melalui pemodelan API daripada string sederhana?
Saya harus mengakui bahwa contoh JOOQ Anda terlihat seperti versi LISP dari SQL. Bukan berarti itu adalah hal yang buruk :) dan saya memang melihat beberapa hal maju menjadi menarik, tetapi keuntungan yang Anda daftarkan perlahan-lahan menghilang ketika Anda menjadi semakin maju (lebih konfigurasi, kurang abstrak, lebih mendarah daging di tempat suci dari SQL spesifik mesin, dll.)
Satu saran yang ingin saya lihat bahwa saya kehilangan sebagian besar ORM adalah kerangka kerja yang dapat menangani Objek dengan cara non-relasional, menerjemahkan interaksi Obyek ke dalam apa pun yang mungkin menjadi backend (SQL, NoSQL, Peta Topik, RDF, dll. .) yang membutuhkan caching Model yang digunakan daripada spesifik interaksi SQL, dialek, dan pemikiran relasional.
IMHO, tentu saja. :)
sumber