Cara menangani bidang terhitung kompleks dalam ORM


8

Dalam API kami, kami memiliki beberapa tipe data pusat yang perlu "didekorasi" (dapat dikatakan) setelah pengambilan dari database dengan nilai yang dihitung. Basis data diakses melalui ORM yang mengikuti dinamika Table / Entity yang sangat terinspirasi oleh lapisan basis data CakePHP 3, di mana objek Table digunakan sebagai perantara antara database dan aplikasi yang mengambil dan membagikan baris sebagai instance objek model. Jadi alih-alih hanya mengambil data dari database dan mengembalikan baris-baris itu, kita perlu memproses ulang data yang dikembalikan sebelum benar-benar dapat digunakan. Berikut adalah beberapa kasus penggunaan yang muncul untuk lebih menjelaskan apa yang saya maksud:

  • Objek memiliki nilai numerik yang diterjemahkan ke label yang mudah digunakan (biasanya ini adalah logika yang saya akan tetap murni pada klien, tetapi untuk alasan keamanan bisnis beberapa data ini perlu disimpan di server saja, diakui sedikit dari kasus tepi)
  • Objek harus memiliki nilai peringkat terkait yang ditarik dari peringkat yang baru ditambahkan
  • Berdasarkan kombinasi nilai yang dihitung seperti ini dan nilai yang disimpan, objek jadwal kompleks dibangun

Sendiri, semua ini secara individual sebenarnya cukup mudah dilakukan dengan map()operasi sederhana atas hasil yang dikembalikan. Hal yang sama berlaku untuk ketika Anda ingin beberapa nilai yang dihitung, Anda bisa melakukan lebih banyak operasi peta untuk menghitung dan menambahkan bidang-bidang tersebut jika diperlukan.

Yang mengatakan, pendekatan ini memiliki dua kelemahan utama:

  1. Ini berarti bahwa Anda perlu melakukan langkah tambahan pasca-pemrosesan di mana pun Anda ingin bekerja dengan nilai-nilai yang dihitung ini, yang tidak terlalu KERING
  2. Beberapa transformasi ini bergantung pada transformasi lain yang dilakukan terlebih dahulu, jika tidak mereka tidak memiliki data yang tersedia untuk dikerjakan

Untuk menangani keduanya, saya telah berpikir bahwa pendekatan terbaik adalah dengan memindahkan kode ini ke dalam ORM, kemudian memodifikasi ORM sehingga antarmuka akan (secara eksternal) memungkinkan akses ke bidang virtual yang dihitung dengan cara yang sama seperti yang berhubungan dengan kolom basis data . Secara internal ia kemudian dapat memetakan bidang-bidang virtual ini ke fungsi transformasi, dan secara internal menentukan potensi transformasi ketergantungan yang diperlukan untuk menyelesaikan masalah kedua.

(Sebagai tambahan, saya bertanya-tanya apakah ini juga menghilangkan perlunya baris yang dikembalikan menjadi objek aktual sebagai lawan hash sederhana. Saat ini setiap baris membuat objek baru dengan data bidang yang ditetapkan di atasnya, tetapi jika semua perhitungan atau modifikasi data dipindahkan dari model maka objek hanya menjadi sekumpulan properti - sebuah hashmap, pada dasarnya, tanpa logika internal sendiri. Yang mungkin sebenarnya bukan hal yang buruk menurut saya)


Bagaimana ini @moberemk?
Slamice

Jika terlalu sulit dengan ORM Anda dapat menggunakan query SQL asli. Biasanya ORM menyediakan cara melakukan query SQL aman karena mereka tahu betul bahwa mereka tidak dapat menangani setiap situasi daripada yang dapat dilakukan dalam SQL mentah.
Walfrat

Jawaban:


3

Anda dapat menggunakan lapisan seperti repositori untuk kasus-kasus yang disebutkan di atas.

[Repositori] Memediasi antara domain dan lapisan pemetaan data menggunakan antarmuka seperti koleksi untuk mengakses objek domain.

Satu repositori per kasus, yang menggunakan ORM untuk membaca data, memperkaya mereka dan kembali.

Jadi, Anda akan memiliki satu cara terpadu untuk mengakses instance tersebut dan menyembunyikan bagaimana instance tersebut dibuat dari luar. Juga ini akan memungkinkan Anda untuk beralih dari ORM ke query SQL mentah tanpa mengubah antarmuka yang terbuka.


Inilah yang akhirnya saya lakukan untuk proyek ini pada dasarnya, tetapi saya ingin mencatat bahwa ada masalah kinerja besar-besaran dengan ini pada dataset besar. Pada dasarnya: ini bekerja, hanya saja tidak pada skala. Menerima akurasi meskipun.
moberemk

0

Saya setuju dengan @potfur. Membagi antara "objek data", mewakili data dalam database, dan representasi "bisnis" mereka, merangkum logika tambahan, perhitungan, dll. Adalah IMHO arah yang benar. Bagaimana data diwakili untuk domain / bisnis tertentu dan apa yang kemudian disimpan secara teknis, bisa menjadi hal yang sangat berbeda. Menerapkan logika bisnis dengan objek yang mewakili domain membantu menambah nilai bagi pelanggan dan membuat komunikasi lebih mudah. Adapun ORM, Anda menyebutkan masalah skalabilitas. Saya pikir ORM adalah anti-pola. Meskipun sangat berguna dalam skala yang lebih kecil / menengah, dalam hal skalabilitas, ia mulai gagal. Yang bisa Anda lakukan adalah menambahkan lapisan caching untuk "entitas bisnis", jadi Anda tidak perlu menghitungnya setiap waktu.

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.