Banyak aplikasi menyertakan 'data statis': data yang tidak benar-benar berubah selama masa pakai aplikasi. Misalnya, Anda mungkin memiliki daftar Area Penjualan yang mungkin merupakan daftar tetap untuk masa mendatang.
Tidak jarang menemukan data statis ini dalam tabel database (sering kali karena Anda ingin merujuknya dalam kunci asing tabel lain). Tabel contoh sederhana akan memiliki Id untuk digunakan sebagai kunci utama dan Deskripsi. Misalnya, tabel SalesArea Anda akan memiliki (setidaknya) kolom SalesAreaId dan kolom SalesAreaDescription.
Sekarang, dalam kode Anda mungkin tidak ingin memperlakukan setiap baris tabel sama. Misalnya, Anda mungkin ingin menetapkan Area Penjualan default pada beberapa layar, memberikan angka berbeda untuk beberapa area, atau membatasi apa yang dapat dilakukan pengguna di area lain.
Apa cara terbaik untuk merujuk ke data statis ini dalam kode? Mengapa?
- Hard-code deskripsi dalam kode Anda. Gunakan ini untuk mencari SalesAreaId dari database saat Anda membutuhkannya.
- Hard-kode ID dalam kode Anda. Gunakan ini untuk mencari deskripsi SalesArea saat Anda membutuhkannya.
- Tambahkan kolom ke tabel untuk setiap tujuan, misalnya kolom "IsDefaultOnProductLaunchScreen" dan seterusnya (mungkin ada banyak di antaranya).
- Sesuatu yang lain
Apakah ada pertimbangan khusus lain yang harus saya buat ketika berhadapan dengan data database statis? Misalnya, memberi tabel ini nama khusus?
sumber
Jawaban:
Bagaimana dengan memuatnya ke dalam cache (biasanya diimplementasikan sebagai tabel hash) ketika aplikasi dijalankan? Jika Anda melakukannya, Anda bahkan tidak perlu melakukan query database (well, tidak lebih dari sekali).
Saya juga menyarankan menghindari apa pun pengkodean keras. Tambahkan indikator default (awalnya dalam tabel DB dan juga dalam struktur cache) untuk layar yang membutuhkan default. Untuk melakukan pencarian pada non-defauilts, cobalah untuk menyimpan kunci yang akan dicari dalam file konfigurasi atau properti jika Anda bisa.
sumber
Alternatif untuk DB atau hard coding adalah dengan menggunakan file konfigurasi yang dibaca pada saat start-up. Anda kemudian dapat menyimpan data ini dalam struktur hanya baca dalam kode Anda.
DALAM kasus yang jarang (tetapi bukan tidak mungkin) di mana Anda mengedit data ini, Anda harus me-restart aplikasi. Jika ini tidak memungkinkan, Anda dapat menulis manajer konfigurasi yang lebih kompleks yang memeriksa perubahan dalam file konfigurasi setiap kali data diakses, ini sebenarnya cukup efisien karena Anda hanya perlu memeriksa cap waktu pada file dan kemudian membatalkan semua data. jika file diperbarui.
sumber
Jika data terkait dengan data yang ada di DB Anda, mungkin efisien untuk menambahkannya ke DB seperti menambahkannya ke kode. Jika tidak maka saya biasanya tergoda untuk "mengambil peluru itu sekali," dan memasukkannya ke dalam kode sampai pertama kali itu berubah.
Seringkali apa yang kita pikir statis ternyata tidak menjadi, dan ketika itu terjadi, Anda tidak ingin harus menunggu rilis kode untuk perubahan yang harus dilakukan. Segera setelah itu terjadi sekali, masukkan ke dalam database dan tulis halaman administrator untuk melakukan pembaruan lebih lanjut.
Untuk mengambil contoh Anda, jika Anda sudah memiliki Area Penjualan di DB, tambahkan deskripsi di sana, jangan membangun tabel hash untuk menghubungkan data database ke daftar hard-coded. Tetapi jika Anda tidak membangun tabel hash dari Area Penjualan dengan segala cara, tetapi bersiaplah, pertama kali seseorang mengubah deskripsi atau menambahkan Area Penjualan baru, pindahkan ke DB.
sumber
Kenapa tidak hanya kode keras segalanya? Masalah utama yang selalu saya alami adalah merujuk nilai statis dari DB dalam kode aplikasi. Itu satu hal jika Anda hanya secara langsung membangun daftar drop-down atau sesuatu dari nilai-nilai statis, tetapi bagaimana jika beberapa logika aplikasi tergantung pada nilai-nilai dari DB?
Dalam aplikasi sederhana, saya saat ini memiliki daftar status sunting untuk konten: Draf, Diterbitkan, Diarsipkan.
Item konten perlu diperlakukan berbeda tergantung pada negara mana mereka berada. Jika saya menyimpan data status ini dalam DB, masing-masing dengan nilai 1, 2, 3, bagaimana saya mengecek apakah ada sesuatu dalam Draf negara?
if (content.State == 1)
atau
if (content.State == "Draft")
?Saya baru saja mengkodekan nilai!
Hal yang sama jika Anda menggunakan tabel cache / hash: Anda masih harus menggunakan beberapa nilai yang ditulis dalam kode Anda sebagai kunci untuk mencari data Anda.
Apa kerugian dari pendekatan hard-coding?
sumber
Mirip dengan apa yang dikatakan FrustratedWithFormsDesigner, ini biasanya dilakukan dengan cache, karena itu berarti Anda hanya perlu memuat data statis satu kali, tetapi mengikuti pola OAOO, artinya kita tidak mendefinisikan data di dua tempat (database dan di kode Anda).
Saya tahu NHibernate ORM menawarkan fungsionalitas ini melalui cache level 2 . Anda bisa mengatakannya untuk menyimpan data dari tabel tertentu, dan mengatakan itu hanya baca. Itu akan dimuat pertama kali diperlukan, dan tidak akan mengenai database lagi setelah itu, bahkan jika Anda mengakses data dari beberapa sesi.
sumber
IsDefaultOn...
) di properti pada entitas. Apakah itu mengembalikan true untuk satu entitas. Itu akan memungkinkan Anda untuk menemukan entitas itu, mengingat seluruh koleksi. Atau Anda bisa menggunakan kelas pengontrol yang akan memberi Anda entitas yang sesuai dengan pemanggilan metode.Ini adalah optimasi prematur yang lebih buruk.
Pertama, setiap DBMS modern akan mengambil data dari tabel kecil dengan kecepatan kilat dan mereka semua memiliki algoritma caching mulai dari bagus hingga hebat (semakin banyak Anda membayar untuk DBMS, semakin baik cacheing!). Jadi, Anda mengoptimalkan sesuatu yang menghabiskan sumber daya minimal.
Kedua, Anda memiliki sedikit pengalaman tentang aplikasi bisnis dunia nyata jika Anda membayangkan sesuatu seperti "area penjualan" adalah data statis. Ini bertanggung jawab untuk berubah dengan setiap perubahan Direktur Pemasaran atau CEO. Jadi, Anda menuju dunia kesakitan dua tahun ke depan.
Hanya ada dua cara untuk pergi ke sini: -
Simpan dalam database dan akses data dengan sql "normal".
Menyimpannya dalam file konfigurasi XML mewah (mungkin diakses melalui REST atau SOAP) yang dapat dengan mudah diedit setiap kali ada "perubahan kebijakan strategis".
sumber
Itu tergantung pada apa yang Anda lakukan dengan data. Jika itu adalah daftar sesuatu, saya biasanya akan menariknya ke dalam array. Jika daftar perlu tumbuh di versi lain, mudah saja menambahkan ke database dan mengubah kode untuk menangani data tambahan dalam array (yang bahkan mungkin tidak diperlukan tergantung pada kode, misalnya daftar data dengan untuk loop menggunakan batas atas array). Jika ini adalah daftar pengaturan, saya biasanya akan mengkodekannya karena biasanya tidak banyak dan lebih mudah dan lebih cepat daripada menggunakan pernyataan SQL. Jika ini adalah pengaturan yang dapat diubah oleh pengguna dan saya ingin menyimpan pilihan untuk peluncuran berikutnya, saya akan membuat tabel untuk digunakan sebagai registri dan hanya menarik entri individual ke variabel yang diperlukan.
sumber
Saya tahu jawaban ini diterima tetapi saya ingin berbagi bagaimana kami melakukan ini di toko pengembangan web terakhir saya di mana kami mencoba mengurangi basis data I / O sebanyak mungkin.
Kami menggunakan sisi server memasukkan file untuk sebanyak mungkin mencari tipe struktur data yang kami bisa. Terutama ini untuk navigasi situs (untuk memasukkan subnavigation) tetapi kami juga menggunakannya untuk drop-down dan checkbox sebanyak mungkin (Negara, Negara, Kategori).
Awalnya, kami menarik semua data ini dari database. Karena kami memberi pelanggan widget admin, mereka dapat mengubah data ini sesuka hati dan kami tidak pernah terhenti dengan sedikit perubahan receh. Sebagian besar waktu data ini hampir tidak pernah berubah tetapi kadang-kadang itu akan berubah.
Kami selalu mencari waktu muat yang lebih cepat. Jadi kami memutuskan untuk mengimplementasikan sebanyak mungkin file teks sisi server statis. Kami melakukan ini di samping widget admin. Setiap kali tabel database diperbarui, kami akan membuat kembali file teks statis yang sesuai. Ini memberi kami lingkungan yang sangat fleksibel dan cepat.
sumber
Solusi saya untuk ini, yang mungkin tidak berfungsi di semua situasi, adalah untuk mengikat data database statis ke hard-coded
enum
. Karena masalah berasal dari memiliki data dinamis (database) yang terikat dengan logika statis (kode), buat ikatan ini eksplisit (dan longgar) dengan memiliki tabel database yang terkait denganenum
. Ex:Kemudian tulis UI yang memungkinkan Anda untuk dengan mudah melihat daftar
LooseDBCodeBinding
catatan, dan memetakannya keLooseDBCodeBinding
enum
nilai - nilai (termasuk mendukung binding "broken"). Anda kemudian dapat memprogram sekitarenum
, dan mendesain database di sekitar kunci tabel, dan hanya tabel ini yang memiliki pengetahuan tentang kedua konteks.sumber