Saya sedang membuat sebuah program yang akan memposting data ke database, dan saya telah menemukan suatu pola yang saya yakin sudah familiar: Tabel pendek dari nilai-nilai tetap yang kemungkinan besar (sangat mungkin) yang berfungsi sebagai enum. Jadi anggaplah tabel berikut bernama Status
:
Status Deskripsi Id -------------- 0 Tidak diproses 1 Tertunda 2 Diproses 3 Kesalahan
Dalam program saya, saya perlu menentukan ID status untuk tabel lain, atau mungkin memperbarui catatan dengan ID status baru.
Saya bisa membuat kode status Id dalam enum dan berharap tidak ada yang mengubah database. Atau aku bisa mengambil pra-nilai berdasarkan deskripsi (sehingga hardcoding yang bukan).
Apa yang akan menjadi pendekatan yang tepat untuk menjaga keduanya, enum dan tabel, disinkronkan?
Jawaban:
Saya akan membuat kode enum dalam program Anda, karena saya curiga status yang berbeda ini memengaruhi logika program Anda. Jika Anda memiliki status baru, bagaimana seharusnya program Anda bereaksi terhadap status baru ini?
Karena basis data adalah bagian dari aplikasi Anda, saya pikir tidak masuk akal untuk memengaruhi satu tanpa berkonsultasi dengan yang lain, seperti berbicara.
sumber
pending
itu nantinya. Tentu saja memilikiStatus
meja memberi Anda integritas referensial, tetapi itulah yang ingin saya sampaikan.Status
tabel tidak harus dianggap dinamis melalui runtime aplikasi, dan dengan demikian saya tidak berpikir Anda harus membacanya seperti itu.Saya biasanya memuat data ini ke cache statis (biasanya dalam HashMap atau sesuatu seperti itu) ketika aplikasi dijalankan. Ini menghindari keharusan mengkompilasi ulang hanya karena enum telah dimodifikasi dalam beberapa cara.
sumber
Karena itu adalah status, mereka harus dikodekan ke dalam aplikasi untuk memastikan tidak ada perubahan DB yang akan merusak program Anda (setidaknya tidak mudah). Ini penting karena setiap status yang harus ditambahkan harus dikodekan terlebih dahulu dan tidak hanya ditambahkan ke DB.
Anda masih harus memiliki nilai status yang ditulis ke DB dengan uraian yang benar jika Anda perlu menarik laporan misalnya.
Biasanya saya memiliki snipet kode kecil yang akan terhubung ke DB dan memverifikasi bahwa status yang tercantum dalam tabel tertentu semua memiliki nilai id / nama yang sama dengan yang saya simpan dalam memori. Jika tidak cocok saya akan membatalkan eksekusi perangkat lunak.
Tergantung pada kebutuhan Anda, Anda mungkin ingin menerapkan perilaku yang sedikit berbeda tetapi secara keseluruhan itu adalah ide yang baik untuk memiliki status tersebut dikodekan.
sumber
Kami memiliki masalah serupa pada proyek saya (kode lama, hore!) Masalah utama adalah bahwa "tabel enum tidak pernah berubah" sampai mereka melakukannya dan kode rusak. Saya memiliki dua strategi untuk memitigasi yang telah saya migrasi secara perlahan.
Pertama, dan terbaik, adalah menghilangkan referensi langsung ke nilai-nilai ini bila memungkinkan. Selalu bertanya, "mengapa saya harus langsung menggunakan nilai enum?" Dalam banyak kasus, ini adalah tanda bahwa kode memiliki terlalu banyak asumsi kode keras atau mencoba melakukan terlalu banyak manipulasi pada data. Lihat apakah Anda tidak dapat membuat hubungan yang lebih baik dalam database atau kode yang lebih fleksibel untuk menangani apa yang sedang dimanipulasi.
Ketika itu tidak berhasil, saya pergi ke rencana B: pembuatan kode. Karena tabel jarang berubah dan kami menerbitkan bangunan baru secara berkala, pembuat kode dapat membaca tabel enum dan menulis kode enum. Pustaka yang dihasilkan secara dinamis ini kemudian digunakan dalam proyek. Jika DB berubah, build berikutnya tidak akan dikompilasi, yang jauh lebih baik daripada mendapatkan kesalahan runtime misterius.
sumber