Kami sedang membangun aplikasi web untuk perusahaan, yang administrasi hanya ada di lembar Excel sejauh ini. Kami hampir selesai sekarang, tetapi baru-baru ini saya diberi tugas untuk mengimpor semua data mereka dari lembaran-lembaran itu ke sistem baru kami. Sistem ini dibangun di Jawa, tetapi karena impor ini hanya satu kali, saya memutuskan untuk menulis skrip dengan Python dan mengimpornya langsung dengan query SQL. Inilah masalahnya. Model data baru berisi beberapa atribut baru, yang tidak termasuk dalam data yang ada. Dalam kebanyakan kasus, ini bukan masalah, saya hanya meletakkan nol di mana saya tidak dapat menemukan informasinya. Tapi kemudian saya menemukan beberapa atribut, yaitu boolean dan tidak bisa NULL secara default. Pertama-tama saya mencoba untuk mengizinkan nol untuk bidang-bidang dalam database kami, tetapi senior dev saya mengatakan kepada saya untuk tidak melakukannya, karena akan menyebabkan masalah dalam sistem kami di masa depan. Dan sekarang saya tidak yakin apa yang harus saya lakukan. Solusi yang jelas adalah default setiap nilai boolean yang tidak diketahui menjadi false, tetapi saya pikir itu salah juga, karena saya sebenarnya tidak tahu, apakah itu salah.
Contoh: Misalkan Anda memiliki entitas entitas yang memiliki parameter hasRadio. Sekarang Anda perlu mengimpor data ke model data ini, tetapi dalam data hanya ada kolom "Model" dan "Warna", tidak ada yang memiliki atau tidak memiliki radio. Apa yang Anda masukkan dalam kolom "hasRadio", jika tidak bisa dibatalkan oleh desain?
Apa pendekatan terbaik dalam situasi ini? Haruskah kita memberi tahu perusahaan untuk secara manual mengisi data yang hilang? Atau default ke false?
FileNotFound
, tentu saja.Jawaban:
Ini terutama masalah analisis persyaratan, dan tidak ada hubungannya dengan fakta bahwa data yang dipertaruhkan adalah "boolean". Jika Anda harus menginisialisasi tabel dalam database, atau dalam jenis penyimpanan data apa pun lainnya, dan Anda memiliki input yang tidak lengkap untuk beberapa kolom, pertama-tama Anda perlu mencari tahu apa yang menurut pengguna sistem atau pelanggan Anda akan menjadi nilai default yang tepat untuk kolom-kolom itu, dan Anda perlu mencari tahu ini untuk setiap atribut , tidak ada jawaban yang umumnya benar.
Ini biasanya akan mengarah ke salah satu dari kasus berikut:
ada nilai default yang baik untuk kolom tertentu, pengguna tidak keberatan jika nilai awalnya sama untuk semua catatan, mereka dapat mengatur nilai yang benar dengan mudah setelahnya saat dibutuhkan
ada aturan bagaimana menentukan nilai default ideal dari informasi lain, sehingga Anda bisa memasukkan aturan ini ke dalam kode
pengguna atau pelanggan Anda akan memperluas data input dan memberikan nilai yang hilang (mungkin secara manual), sebelum diimpor ke dalam basis data
tidak ada nilai default yang baik untuk kolom tertentu dan / atau catatan apa pun, data harus diimpor juga, tetapi pengguna ingin tahu untuk catatan mana dari nilai tertentu yang sudah diinisialisasi dan yang tidak. Jadi mereka dapat memasukkan nilai setelahnya , dan melacak yang mencatat nilai sudah diatur dengan benar dan yang tidak.
Kasing terakhir membutuhkan sesuatu seperti NULL untuk mewakili keadaan tidak diinisialisasi atau tidak dikenal, bahkan untuk nilai boolean, jika senior Anda suka atau tidak. Jika ada beberapa alasan teknis yang tidak jelas yang melarang penggunaan nilai NULL untuk kolom tertentu, Anda perlu mensimulasikan keadaan "tidak dikenal" dengan cara yang berbeda, baik dengan memperkenalkan kolom boolean tambahan (seperti
hasRadioIsUnknown
), atau dengan menggunakan 3 pencacahan -valued bukan boolean (sepertiHasNoRadio=0
,HasRadio=1
,Unknown=2
). Tetapi bicaralah dengan senior Anda lagi, setelah Anda melakukan analisis persyaratan yang menyeluruh, untuk memastikan solusi semacam itu benar-benar diperlukan.sumber
Ini bukan pertanyaan teknis; ini pertanyaan aturan bisnis. Jadi, Anda perlu bertanya "bisnis."
Dekati pemilik produk dan / atau pemangku kepentingan dan katakan sesuatu seperti:
Beberapa diskusi mungkin akan terjadi. Tapi, pada dasarnya itu. Solusi teknis akan mengalir secara alami dari aturan bisnis yang lebih sempurna.
sumber
Masalah umum adalah seluruh subarea pemrograman yang disebut pembersihan data yang merupakan bagian dari subarea yang lebih besar yang disebut integrasi data . Menghindari masalah-masalah semacam ini kemungkinan besar menjadi alasan migrasi dari lembar-lembar Excel dan mengapa pengembang senior tidak ingin membiarkan bidang menjadi nol. Saya tidak berpikir itu tidak masuk akal untuk mengatakan bahwa ini adalah salah satu sumber kompleksitas yang lebih besar dalam migrasi data.
Hanya memilih untuk menggunakan NULL kapan pun Anda bisa, kemungkinan besar adalah hal yang salah untuk dilakukan, apalagi mengubah model data untuk membuat lebih banyak bidang dapat dibatalkan. Excel memiliki pemeriksaan integritas yang lemah atau tidak ada yang kemungkinan menjadi penyebab banyak masalah ini. Hal yang salah untuk dilakukan adalah menghapus pemeriksaan integritas di database baru dan membuang sampah ke dalamnya. Ini hanya akan melanggengkan masalah dan menambah kompleksitas yang signifikan pada integrasi di masa depan yang harus berurusan dengan data yang tidak masuk akal.
Beberapa perbedaan kemungkinan disebabkan oleh ketidaksesuaian model data. Berurusan dengan ini sebagian besar masalah menjadi (akrab) akrab dengan kedua model data dan mengetahui bagaimana memetakan yang lama ke yang baru. Selama yang baru adalah mampu menangkap yang lama. (Jika tidak, tim Anda kemungkinan memiliki masalah yang sangat besar.) Ini dapat dengan mudah memerlukan lebih banyak pekerjaan daripada hanya menyalin kolom. Darkwing memberikan contoh yang bagus tentang hal ini (dan juga mengapa memasukkan NULL secara membabi buta adalah hal yang salah untuk dilakukan). Menguraikannya, jika model lama memiliki
ReceivedDate
danInProgress
bit dan model baru memilikiStartDate
danProcessingEndTime
, Anda akan perlu memutuskan apakah dan bagaimana untuk mengaturProcessingEndTime
. Bergantung pada bagaimana penggunaannya, pilihan yang masuk akal (tapi sewenang-wenang) mungkin untuk membuatnya sama denganStartDate
(atau tidak lama kemudian jika itu akan menyebabkan masalah).Namun, beberapa perbedaan kemungkinan karena data yang "harus" ada di sana yang hilang atau rusak. (Kemungkinan besar dari kesalahan entri data atau migrasi masa lalu atau bug yang tidak ditangani dengan baik dalam sistem pemrosesan data.) Jika tidak ada seorang pun di tim Anda yang mengantisipasi hal ini, maka Anda (secara kolektif) telah menyiapkan diri Anda untuk menghabiskan 20% dari waktu proyek sedang " hampir selesai. (Itu nomor yang dibuat-buat, tetapi bisa jadi jauhlebih buruk dari itu, atau lebih baik. Itu tergantung pada seberapa banyak data yang salah, seberapa penting itu, seberapa rumit itu, seberapa mudah untuk mendapatkan keterlibatan dari mereka yang bertanggung jawab atas data, dan faktor-faktor lain.) Setelah Anda menentukan bahwa data itu "seharusnya ada "di sana tetapi hilang. Biasanya Anda akan berusaha menentukan tingkat masalah dengan menanyakan sumber data lama. Jika lusinan atau ratusan entri, maka itu mungkin kesalahan entri data dan pelanggan yang bertanggung jawab atas data harus mengatasinya secara manual (yaitu memberi tahu Anda apa nilai yang seharusnya.) Jika jutaan entri (atau sebagian kecil dari data) , maka Anda mungkin perlu mempertimbangkan kembali apakah Anda benar mengidentifikasi bahwa itu "harus" ada. Ini mungkin menunjukkan kesalahan pemodelan di sistem baru.
Sebagai contoh, bayangkan faktur yang memiliki jumlah dan total per item (tetapi bukan harga satuan), kecuali bahwa beberapa jumlah itu hilang secara misterius. Berbicara kepada orang yang memproses faktur semacam itu dapat menghasilkan satu (atau lebih) dari skenario berikut: 1) "oh, jumlah kosong berarti jumlah 1", 2) "oh, saya tahu barang-barang itu berharga sekitar $ 1.000 jadi, jelas ini adalah pesanan untuk 2 ", 3)" ketika itu terjadi, saya mencari harga di sistem lain ini dan membaginya ", 4)" Saya mencarinya di sistem lain ", 5)" itu bukan data nyata ", 6)" tidak pernah melihat itu sebelumnya ".
Seperti yang disarankan, ini dapat menunjukkan beberapa cara untuk secara otomatis menyelesaikan situasi, tetapi Anda harus berhati-hati bahwa solusi berlaku untuk semua kasus. Sudah biasa bagi sistem lain untuk terlibat yang dapat memeriksa silang data, dan ini adalah hal yang baik. Namun, seringkali merupakan hal yang buruk sejauh mungkin sulit untuk mendapatkan akses ke dan berintegrasi dengan sistem-sistem ini untuk melakukan pemeriksaan silang, dan seringkali terungkap bahwa sistem saling bertentangan bukan hanya dengan satu data hilang. Beberapa intervensi manual sering diperlukan, dan tergantung pada skala, mungkin memerlukan tooling dan interface yang akan dibuat khusus untuk tugas pembersihan data. Seringkali yang dilakukan adalah data yang diimpor sebagian tetapi baris dengan data yang hilang dikirim ke tabel terpisah di mana mereka dapat ditinjau.
sumber
Ubah datamodel.
Anda dapat menormalkan hasradio dan kemudian Anda tidak akan memiliki null lagi.
Jika Anda tidak dapat menentukan nilai boolean, maka jangan gunakan boolean.
Dengan membiarkan nilai boolean menjadi nol, berhenti menjadi boolean. Boolean dapat memiliki 2 status: Salah, Benar.
Yang Anda butuhkan adalah 3 status: False, True, Unknown.
Apakah Anda memiliki opsi untuk mengubah model data?
(Dan hal lain yang saya pikirkan, jika dalam python atau java Anda mengambil data dari database Anda. Anda mengambil catatan, periksa bidang radio, apa yang akan terjadi jika Anda memeriksa apakah itu benar atau salah dan itu terjadi menjadi nol?)
sumber
CarFeatures
, dengan bidangCar_ID
,Feature_ID
,Has_Feature
? Sepertinya itu ide yang bagus.bool
memiliki lebih dari dua nilai, karena, seperti yang Anda katakan, itu tidak. Abool
adalahtrue
ataufalse
. Namun, dalam kasus OP, OP tidak berurusan dengan yangbool
langsung, melainkanOption<bool>/Maybe<bool>
, yang dapat memilikiSome -> true/false
atauNone
.Seperti yang telah ditunjukkan orang lain, apa yang Anda miliki di sini adalah nilai boolean yang tidak benar-benar boolean dan masalahnya adalah memaksanya menjadi boolean atau menanganinya sebaliknya.
Apa yang dapat Anda lakukan adalah, alih-alih memiliki hasil boolean tunggal, memiliki dua hasil boolean. Ini bisa setuju atau tidak setuju. Jika mereka setuju, maka Anda memiliki hasil benar / salah yang jelas.
Namun, jika mereka tidak setuju maka Anda memiliki hasil yang tidak pasti dan Anda memiliki kesempatan, tergantung pada keadaan di mana ia muncul, untuk memutuskan bagaimana menanganinya. Dalam beberapa kasus, hasil tak tentu mungkin paling baik ditafsirkan sebagai benar, sedangkan dalam kasus lain, hasil tak tentu sama mungkin paling baik ditafsirkan sebagai salah, sesuai dengan opsi paling aman.
Meskipun ini masih akan memungkinkan hasil dilaporkan sebagai tidak pasti, sehingga nuansa tambahan dari nilai ini tidak akan hilang sepenuhnya, sampai pada titik di mana nilai tersebut dapat diselesaikan dan direset secara definitif.
sumber