Ini adalah diskusi saya sendiri dan beberapa rekan kerja saya sedang dan berpikir saya akan datang ke sini dan melihat bagaimana jika ada konsensus umum tentang itu.
Ini pada dasarnya bermuara pada 2 pendapat berikut tentang panggilan basis data: 1. Buat satu panggilan besar untuk mendapatkan semua yang mungkin diperlukan untuk mengurangi basis data jumlah panggilan DB 2. Buat panggilan terpisah yang lebih kecil berdasarkan apa yang diminta untuk mengurangi ukuran Panggilan DB
Di mana ini terutama ikut bermain adalah dalam kode umum. Kami akan menggunakan contoh kelas Karyawan karena itu cukup mudah.
Katakanlah kelas Karyawan Anda memiliki 10 atribut nilai (nama depan, nama belakang, karyawan, dll.) Dan kemudian 2 atribut kelas ... 1 menunjuk ke kelas Departemen dan kemudian 1 penyelia yang menunjuk kembali ke objek Karyawan lain.
Dalam pola pikir # 1, Anda akan membuat satu panggilan yang mengembalikan data Karyawan serta bidang yang diperlukan untuk mengisi atribut Departemen dan Pengawas ... atau setidaknya bidang yang paling sering digunakan dari sub objek tersebut.
Dalam pola pikir # 2, Anda hanya akan mengisi objek Karyawan pada awalnya dan kemudian hanya mengisi objek Departemen dan Pengawas jika dan ketika mereka benar-benar diminta.
Pendirian 2 cukup mudah ... meminimalkan ukuran permintaan dan berapa banyak objek database yang perlu dipukul setiap kali salah satu permintaan dibuat. Sikap # 1 adalah bahwa bahkan jika itu dapat diimplementasikan dengan benar, fakta bahwa kode harus membuat beberapa koneksi akan menyebabkan lebih banyak ketegangan pada koneksi antara server web dan database sebagai lawan mengurangi itu.
Kekuatan pendorong di balik meneliti ini adalah bahwa jumlah lalu lintas antara server web dan server basis data kami semakin tak terkendali.
sumber
Jawaban:
Jika kekuatan pendorong di belakang pertanyaan ini terlalu banyak lalu lintas, apakah Anda sudah melihat caching objek yang sering digunakan? Misalnya: Setelah Anda mendapatkan objek Karyawan dan Departemen dan Pengawas, mungkin ide yang baik untuk menambahkan mereka cache sehingga jika mereka diminta lagi dalam waktu dekat, mereka sudah ada dalam cache dan tidak perlu diambil lagi. Tentu saja, cache harus membiarkan objek yang jarang digunakan berakhir, dan juga harus dapat menghapus objek yang telah dimodifikasi oleh aplikasi dan disimpan kembali ke database.
Bergantung pada bahasa dan kerangka kerja apa yang Anda gunakan, mungkin sudah ada kerangka kerja cache yang dapat melakukan sebagian (atau sebagian besar) dari apa yang Anda butuhkan. Jika Anda menggunakan Java, Anda bisa melihat ke dalam Apache Commons-Cache (saya belum pernah menggunakannya untuk sementara waktu, dan sementara itu tampak tidak aktif, itu masih tersedia untuk digunakan dan itu cukup baik terakhir kali saya menggunakannya).
sumber
Selalu gunakan keterbacaan dan kejelasan saat pertama kali Anda menulis sesuatu. Anda kemudian dapat refactor jika dan ketika Anda perlu. Lakukan uji beban untuk menemukan kemacetan, dalam banyak kasus ini bukan jumlah panggilan yang menyebabkan masalah tetapi yang ditulis dengan buruk.
Adapun apa yang mengklasifikasikan terlalu banyak, itu tergantung pada aplikasi. Untuk sebagian besar aplikasi web, apa pun di bawah 30 detik hanya bisa diterima. Saya akan berbicara dengan pengguna Anda tentang harapan mereka.
sumber
Pertanyaan Anda tampaknya didasarkan pada asumsi bahwa Anda harus menebak data apa yang akan dibutuhkan untuk halaman tertentu. Bukan itu masalahnya. Ini tidak semudah pendekatan naif, tetapi Anda dapat merancang kode Anda sehingga Anda akan tahu apakah Anda akan memerlukan atribut departemen atau penyelia sebelum membuat panggilan basis data apa pun.
sumber
Ini adalah aturan yang saya gunakan, mungkin itu akan berguna bagi Anda.
sumber
Kedua strategi di sini benar-benar valid. Ada kelebihan dan kekurangan untuk masing-masing:
Satu panggilan untuk ketiga objek:
Satu panggilan per objek (total 3 panggilan)
sumber
Bagi saya, Terlalu banyak permintaan DB membuat lebih banyak permintaan daripada yang Anda butuhkan untuk memuat data yang Anda butuhkan pada waktu tertentu.
Jadi saya tidak perlu data, jangan buang memori untuk menghindari perjalanan kedua nanti. Tetapi jika Anda membutuhkan jumlah data, Anda harus meminimalkan panggilan ke db.
Jadi memiliki kedua opsi, dan gunakan masing-masing di mana situasi membutuhkannya.
EDIT: Perlu diingat bahwa ofcourse ini tergantung pada situasi Anda juga. Jika itu WebApp misalnya, Anda harus memiliki pertimbangan yang berbeda daripada jika itu adalah aplikasi desktop yang mengakses DB dalam jaringan Anda, yang bertentangan dengan di seluruh web untuk WepApp.
sumber
Terhubung ke DB, kirim permintaan dan parsing biasanya membutuhkan waktu yang signifikan dibandingkan dengan mengambil hasil, sehingga tren keseluruhan adalah untuk menggabungkan pertanyaan sebanyak mungkin dalam satu permintaan.
Namun, melakukan ini semua dalam satu kesempatan akan membuat kode tidak dapat dipelihara. Sebaliknya, biasanya diperoleh dengan lapisan abstraksi tambahan: kode menjadwalkan beberapa permintaan sesuai kebutuhan, kemudian mesin mem-parsing ini sebagai satu permintaan besar (mungkin menggunakan cache di jalan) dan kemudian balasan dikirim sesuai kebutuhan.
Tentu saja tidak selalu semua dapat diambil dalam satu kueri - Anda akan sering memiliki kueri yang menyediakan data yang diperlukan untuk membangun kueri berikutnya, jadi Anda harus mengulanginya. Masih mengejutkan bundel pertanyaan dan melakukan sebanyak mungkin sekaligus lebih baik daripada ratusan tembakan kecil ke database.
Jadi, rencanakan apa yang Anda butuhkan, minta dan ambil kembali, jika lebih banyak diperlukan, minta dan ambil lagi, lalu gunakan data dalam menghasilkan konten. Pasti menghindari menggunakan permintaan basis data seperti inisialisasi variabel lokal yang tersebar di seluruh kode.
sumber
Kami tidak tahu cukup banyak tentang aplikasi Anda untuk mengetahui pilihan mana yang Anda bersalah karena terlalu cepat mengoptimalkannya. Seberapa sering data Supervisor digunakan? Sepertinya itu bisa sia-sia, tapi kita tidak tahu. Jika Anda memisahkannya, Anda mungkin dapat memonitor sistem Anda untuk melihat seberapa sering mereka digunakan bersama. Daripada Anda dapat membuat keputusan untuk hanya menggabungkan mereka dalam satu panggilan. Jika tidak, jika Anda mulai membuat leher botol dengan satu panggilan besar ini, di mana Anda mulai melakukan pemecahan masalah? Sulit untuk mengidentifikasi apa yang masuk akal untuk dihilangkan. Lebih banyak bidang data dapat ditambahkan ke proses ini.
Akan menarik untuk mengetahui berapa banyak ini berasal dari memori db vs disk. Tidak ada yang membuat saya merasa bahwa departemen lebih atau kurang cenderung berubah dibandingkan dengan alamat.
sumber