Apa yang harus dilakukan ketika Anda tidak dapat menentukan nilai boolean?

38

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?

Liberul
sumber
70
Bagi saya memungkinkan NULL akan menjadi solusi yang tepat. Apakah senior Anda lebih spesifik daripada "menyebabkan masalah dalam sistem kami di masa depan"? Jika tidak, tanyakan padanya untuk alasan yang lebih spesifik.
larsbe
48
Anda harus mengatur defaultnya FileNotFound, tentu saja.
Anda
7
Apakah mungkin untuk menambahkan bidang boolean, "isValidHasRadio" atau sesuatu, atau apakah itu akan merusak banyak hal?
hyde
9
Solusi yang benar adalah dengan mempertimbangkan input data sampah dan membatalkan seluruh transaksi, dan kemudian meminta definisi tugas untuk disesuaikan jika data itu tidak boleh dianggap sampah. Tidak ada jalan lain di sini.
Sarge Borsch
17
Omong-omong, saya bukan penggemar nilai-nilai nol. Saya lebih suka menggunakan enum dengan 'Tidak Dikenal', 'Memiliki Radio' dan 'Tidak Memiliki Radio'. Dengan cara ini Anda dapat memenuhi kebutuhan Anda dan memiliki ruang untuk tumbuh jika Anda harus menentukan jenis radio di masa depan, seperti 'Radio dengan TV Terpadu' atau sesuatu seperti itu.
Machado

Jawaban:

129

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 (seperti HasNoRadio=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.

Doc Brown
sumber
29
Anda juga harus mencatat bahwa jawaban yang sama berlaku untuk kolom lain tempat Anda dengan mudah menggunakan NULL. Anda harus memverifikasi apakah ini adalah nilai default yang benar. Jika, misalnya, beberapa kolom lain mengatakan "processingIsFinished" dan Anda mengimpor data lama dari riwayat pesanan pelanggan (memikirkan toko web), Anda mungkin perlu menetapkan nilai ke "true" daripada "NULL" untuk menghindari beberapa proses yang dipicu ketika mereka menemukan entri yang belum diproses (sesuai dengan interpretasi mereka terhadap kolom itu).
Frank Hopkins
1
Ini adalah masalah fungsional. Karena model (unggul dan yang baru) tidak cocok, proses migrasi harus ditinjau dengan mempertimbangkan kasus-kasus ini. Satu-satunya yang bisa mengatakan bagaimana untuk melanjutkan adalah / adalah para pemangku kepentingan (pelanggan atau siapa pun). Secara teknis Anda dapat menyelesaikan ini dengan banyak cara, tetapi secara fungsional hanya dalam satu cara. Hak.
Laiv
12
Saya suka gangguan ini. Ketidaksukaan saya untuk null dalam konteks ini sebagian besar karena kurangnya makna yang jelas. Tidak diketahui jelas. Tetapi apakah null berarti tidak dikenal atau tidak berlaku? Bagaimana orang tahu? Hanya karena masuk akal bagi Anda bukan berarti semua orang akan melihatnya dengan cara yang sama.
candied_orange
Opsi 4: Catatan yang hilang nilai kolom tertentu sebenarnya tidak berguna dan harus dikeluarkan dari impor. Opsi 5: Seseorang harus memperbaiki semua data yang masuk sebelum diimpor. Banyak sekali pilihan, hanya tergantung kebutuhan dan anggaran. Mengimpor data lama selalu berantakan.
jpmc26
@ jpmc26: well, saya tidak memasukkan opsi 4 karena saya ingin tetap menulis OP (kasus di mana data yang hilang pasti tidak termasuk dalam data impor, tanpa catatan). Opsi 5 memang layak disebutkan, karena ini merupakan cara lain untuk menghindari perlunya nilai NULL. Sunting jawaban saya sesuai dengan itu.
Doc Brown
39

Ini bukan pertanyaan teknis; ini pertanyaan aturan bisnis. Jadi, Anda perlu bertanya "bisnis."

Dekati pemilik produk dan / atau pemangku kepentingan dan katakan sesuatu seperti:

Kami memiliki data yang tidak lengkap untuk salah satu bidang yang Anda minta dalam aplikasi. Apakah Anda ingin kami menggunakan nilai default? Apakah Anda ingin kami menambahkan "tidak dikenal" sebagai nilai yang valid? Atau, apakah Anda ingin seseorang di tim Anda untuk memperbaiki data sebelum impor?

Beberapa diskusi mungkin akan terjadi. Tapi, pada dasarnya itu. Solusi teknis akan mengalir secara alami dari aturan bisnis yang lebih sempurna.

svidgen
sumber
9

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 memilikiReceivedDate dan InProgressbit dan model baru memiliki StartDatedan ProcessingEndTime, Anda akan perlu memutuskan apakah dan bagaimana untuk mengatur ProcessingEndTime. 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.

Derek Elkins
sumber
14
Singkatnya: jika menurut Anda berurusan dengan kode lawas tidak menyenangkan, cobalah berurusan dengan data lawas.
Peter Taylor
0

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?)

Pieter B
sumber
2
Dengan mengubah model data dan "normalisasi keluar hasRadio", saya anggap Anda berarti sesuatu seperti menambahkan tabel baru CarFeatures, dengan bidang Car_ID, Feature_ID, Has_Feature? Sepertinya itu ide yang bagus.
jpa
2
@ jpa ini agak sulit. Anda harus sangat jelas dalam apa yang Anda lakukan, karena tidak adanya catatan dalam situasi kami berarti tidak diketahui. Meskipun seringkali tidak adanya catatan berarti tidak memiliki fitur.
Pieter B
1
Anda salah melihatnya, Pieter. Tidak ada yang mengatakan a boolmemiliki lebih dari dua nilai, karena, seperti yang Anda katakan, itu tidak. A booladalah trueatau false. Namun, dalam kasus OP, OP tidak berurusan dengan yang boollangsung, melainkan Option<bool>/Maybe<bool>, yang dapat memiliki Some -> true/falseatau None.
Andy
@ Davidvider argumen saya adalah karena itu mungkin <bool> Anda harus berhenti memanggilnya sesuatu yang mirip atau Anda akan mendapatkan kebingungan. Dan jika Anda bersikeras menggunakan boolean maka temukan cara yang aman untuk melakukannya.
Pieter B
4
Menurut pendapat saya, nullable boolean baik-baik saja. Saya tidak pernah memiliki masalah dengan nilai nol, meskipun saya telah bertemu dengan pengembang yang melakukannya.
Andy
-1

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.

Lee Leon
sumber