Bir boole değeri belirleyemediğinizde ne yapmalı?


38

Şimdiye kadar yalnızca Excel sayfalarında yönetime sahip olan şirket için bir web uygulaması oluşturuyoruz. Neredeyse şimdiye kadar bitti, ancak son zamanlarda tüm verilerini bu sayfalardan yeni sistemimize alma görevi verildi. Sistem Java'da yerleşiktir, ancak bu içe aktarma işlemi yalnızca bir defalık bir şey olduğundan, komut dosyalarını Python'da yazmaya ve doğrudan SQL sorguları ile içe aktarmaya karar verdim. İşte sorun geliyor. Yeni veri modelleri, mevcut verilerinde bulunmayan bazı yeni özellikler içeriyor. Çoğu durumda, bu sorun değil, sadece bilgiyi bulamadığım bir boş veriyorum. Fakat daha sonra, boolean olan ve varsayılan olarak NULL olamayan birkaç özellikle karşılaştım. İlk önce veri tabanımızdaki bu alanlar için null değerine izin vermeye çalıştım, fakat kıdemli arkadaşım yapmamamı söyledi Gelecekte sistemimizde sorunlara yol açacaktır. Ve şimdi ne yapacağımdan emin değilim. Açık bir çözüm, bilinmeyen her boolean değeri varsayılan olarak yanlış yapmaktır, ancak bunun da yanlış olduğunu düşünüyorum, çünkü bunun yanlış olup olmadığını gerçekten bilmiyorum.

Örnek: Bir hasRadio parametresi olan bir Car varlığınız olduğunu varsayalım. Şimdi bu veri modeline veri aktarmanız gerekiyor, ancak verilerde yalnızca "Model" ve "Renk" sütunları var, bununla ilgili hiçbir şey radyo içeriyor veya bulunmuyor. Tasarım gereği boş olamazsa, bir "hasRadio" sütununa ne koyarsınız?

Bu durumda en iyi yaklaşım nedir? Sadece şirkete eksik verileri elle doldurmasını söylemeli miyiz? Ya da varsayılan olarak yanlış?


70
Benim için NULL'a izin vermek doğru çözüm olacaktır. Üst düzeyiniz “gelecekte sistemimizde bir soruna neden olmaktan” daha mı spesifikti? Olmazsa, daha spesifik nedenlerden isteyin.
larsbe,

48
FileNotFoundBelli ki varsayılan olarak ayarlamalısın .
Sen

7
Bir "boolean" alanı, "isValidHasRadio" ya da başka bir şey eklemek mümkün mü, yoksa bu da işleri bozar mı?
Hyde

9
Doğru çözüm, girdi verisi çöpünü göz önünde bulundurmak ve tüm işlemi iptal etmek ve bu verinin çöp sayılmaması gerekiyorsa , görev tanımının ayarlanmasını talep etmektir . Burada başka yol yok.
Sarge Borsch

17
Bu arada, boş değerlerin büyük hayranı değilim. 'Bilinmeyen', 'Hasarlı Radyo' ve 'Radyo Yok' gibi bir numara kullanmayı tercih ederim. Bu şekilde gereksinimlerinizi karşılarsınız ve gelecekte 'Entegre TV'li Radyo' veya benzeri bir radyo türü belirtmeniz gerekirse, büyümek için yeriniz olur.
Machado

Yanıtlar:


129

Bu temelde bir gereksinim analizi sorunudur ve söz konusu verilerin "boole" olduğu gerçeğiyle hiçbir ilgisi yoktur. Tabloları bir veritabanında veya başka herhangi bir veri deposunda başlatmanız gerekiyorsa ve bazı sütunlar için eksik girdi varsa, önce sistem kullanıcılarının veya müşterilerinizin doğru varsayılan değer olacağını düşündüğünüzü bulmanız gerekir. Bu sütunlar için ve bunu her bir özellik için bulmanız gerekir , genellikle doğru bir cevap yoktur .

Bu genellikle aşağıdaki durumlardan birine yol açacaktır:

  • belirli sütun için iyi bir varsayılan değer vardır, kullanıcılar başlangıçta değerin tüm kayıtlar için aynı olup olmadığını umursamazlar, gerektiğinde kolayca doğru değerleri ayarlayabilirler

  • İdeal varsayılan değerin diğer bilgilerden nasıl belirleneceği ile ilgili bir kural vardır, bu kuralı koda koyabilirsiniz

  • kullanıcılar veya müşteriniz giriş verilerini genişletecek ve eksik değerleri veri tabanına almadan önce (belki elle) sağlayacaktır

  • Belirli sütununda ve / veya herhangi bir kayıt için iyi bir varsayılan değer yok, veri ya ithal edilmelidir, ancak kullanıcıların bilmek istiyorum özellikle değer zaten başlatılır kayıtların hangi ve hangi değil. Böylece değeri daha sonra girebilirler ve değerin hangi kayıtlar için önceden doğru bir şekilde ayarlanmış olduğunu ve hangileri için olmadığını izleyebilirler.

Son dava, kıdemli bir kişinin beğenip beğenmemesi halinde, bir boolean değer için bile, başlatılmamış veya bilinmeyen durumu temsil etmesi için NULL gibi bir şey gerektirir. Belirli bir sütun için NULL değerinin kullanılmasını yasaklayan bazı gizli teknik bir neden varsa, "bilinmeyen" durumu farklı bir şekilde, ek bir boole sütunu (benzeri hasRadioIsUnknown) ekleyerek veya 3 kullanarak taklit etmeniz gerekir. yerine boolean -valued sayımı (gibi HasNoRadio=0, HasRadio=1, Unknown=2). Ancak, tam bir gereksinim analizi yaptıktan sonra, böyle bir geçici çözümün gerçekten gerekli olduğundan emin olmak için üst düzeyinizle tekrar konuşun.


29
Aynı cevabın NULL'u uygun bir şekilde kullandığınız diğer sütunlar için de geçerli olduğunu unutmayın. Bunun doğru varsayılan değer olup olmadığını doğrulamalısınız. Örneğin, başka bir sütunda "processingIsFinished" yazıyorsa ve eski verileri müşterilerin sipariş geçmişinden (bir web mağazasını düşünerek) alıyorsanız, bazı işlemlerin tetiklenmesini önlemek için değeri "true" olarak ayarlamanız gerekebilir. Henüz işlenmemiş girişlerle karşılaştıklarında (bu sütunun yorumlanmasına göre).
Frank Hopkins,

1
Bu işlevsel bir konudur. Modeller (üstünlükler ve yenisi) uyuşmadığından, bu durumlar dikkate alınarak göç süreci gözden geçirilmelidir. Nasıl devam edebileceğini söyleyebilecek tek kişi paydaşlardır (müşteri veya kimse). Teknik olarak bunu birçok yolla çözebilirsiniz, ancak işlevsel olarak sadece bir tanesinde. Doğru.
Laiv

12
Bu dağılımı seviyorum. Bu bağlamda null değerime karşı duyduğum isteksizlik, net bir anlam ifade etmemesinden kaynaklanıyor. Bilinmeyen açık. Fakat null, bilinmeyen veya geçerli olmayan anlamına mı geliyor? Birileri nasıl bilebilir? Sadece sana mantıklı gelmesi, başkalarının aynı şekilde göreceği anlamına gelmez.
candied_orange

Seçenek 4: Belirli bir sütun değerini eksik olan kayıtlar aslında işe yaramaz ve içe aktarma işleminin dışında tutulmalıdır. Seçenek 5: Birinin içe aktarılmadan önce gelen tüm verileri düzeltmesi gerekir. Birçok seçenek, sadece ihtiyaçlara ve bütçelere bağlıdır. Eski verileri almak her zaman büyük bir karmaşadır.
jpmc26

@ jpmc26: OP 4 kelimesini dahil etmedim, çünkü OP'nin kelimenin tam anlamıyla yazdıklarını yapıştırmak istedim (eksik verilerin kesinlikle kayıt verileri için alma verilerine dahil olmadığı bir durum). NULL değerlerin gerekliliğinden kaçınmanın başka bir yolu olduğundan, Seçenek 5 gerçekten bahsetmeye değer. Cevabımı buna göre düzenledi.
Doktor Brown,

39

Bu teknik bir soru değil; bu bir iş kuralları sorusu. Yani, "iş" sormak gerekir.

Ürün sahibine ve / veya paydaşlarına yaklaşın ve şöyle bir şey söyleyin:

Başvuruda talep ettiğiniz alanlardan birine ilişkin eksik verilerimiz var. Varsayılan bir değer kullanmamızı ister misiniz? "Bilinmeyen" i geçerli bir değer olarak eklememizi ister misiniz? Veya, ekibinizden birinin içe aktarmadan önce verileri düzeltmesini ister misiniz?

Bazı tartışmalar muhtemelen başlayacaktır. Ancak, temelde bu. Teknik çözüm, doğal olarak daha fazla iş kurallarından akacak.


9

Genel sorun, veri entegrasyonu adı verilen daha büyük bir alt alanın parçası olan, veri temizleme adı verilen bütün bir programlama alanıdır . Bu tür sorunlardan kaçınmak, büyük olasılıkla Excel sayfalarından geçişin nedeninin ve kıdemli devin neden bir alanın boşuna alınmasına izin vermek istemediğinin büyük bir bölümünü oluşturuyor. Bunun veri göçlerinde en büyük karmaşıklık kaynaklarından biri olduğunu söylemenin mantıksız olduğunu sanmıyorum.

Yapmanız gereken çok yanlış bir şey olduğunda NULL kullanmayı seçmeniz , veri modelini daha fazla alanı null yapılabilmesi için değiştirmenin tek başına. Excel, bu sorunların çoğunun nedeni olarak muhtemelen zayıf veya bütünlük denetimi yapmıyor. Yapılması gereken yanlış şey, yeni veritabanındaki bütünlük kontrolünü kaldırmak ve içine çöp atmaktır. Bu sadece sorunu devam ettirir ve saçma sapan verilerle bir şekilde başa çıkması gereken gelecekteki entegrasyonlara önemli bir karmaşıklık ekler.

Aradaki farkın bir kısmı veri modeli uyumsuzluğundan kaynaklanıyor olabilir. Bununla başa çıkmak büyük ölçüde hem veri modellerine aşina olmak hem de eskisini yenisiyle nasıl eşleştireceğinizi bilmek. Sürece yenisi olarak ise eskisini yakalama yeteneğine. (Değilse, ekibinizin muhtemelen çok büyük bir problemi vardır.) Bu sadece sütun kopyalamaktan daha fazla iş yapmayı gerektirebilir. Darkwing buna mükemmel bir örnek verir (NULL'ları neden körlemenin yanlış yapılması neden yanlış bir şeydir). Eski model bir olsaydı, bunun üzerine tertipleyerek ReceivedDateve InProgressbit ve yeni model bir sahiptir StartDateve ProcessingEndTimesiz ve nasıl ayarlanacağı karar gerekecektir ProcessingEndTime. Nasıl kullanıldığına bağlı olarak, makul (ancak keyfi) bir seçim, aynıStartDate (veya eğer sorun çıkarırsa kısa bir süre sonra).

Bununla birlikte, farkın bir kısmı, eksik veya bozuk olan "olması gereken" verilerden kaynaklanıyor olabilir. (Büyük olasılıkla veri girişi hatalarından ya da veri işleme sistemindeki geçmiş göçlerden veya hatalardan kötü şekilde ele alındığında). Eğer ekibinizde hiç kimse bunu öngörmezse, o zaman (toplu olarak) proje süresinin% 20'sini harcamak için kendinize karar verdiniz " neredeyse bitti. (Bu bir uydurma numaraydı, ama çok uzak olabilir).Bundan daha kötüsü ya da daha iyisi. Ne kadar verinin yanlış olduğuna, ne kadar önemli olduğuna, ne kadar karmaşık olduğuna, verilerden sorumlu olanlardan ve diğer faktörlerden ne kadar kolay katılacağına bağlıdır.) Verilerin "olması gerektiğini" belirledikten sonra Olmak "orada ama eksik. Genellikle eski veri kaynaklarını sorgulayarak sorunun boyutunu belirlemeye çalışırsınız. Düzinelerce veya yüzlerce giriş ise, muhtemelen veri girişi hatalarıdır ve verilerden sorumlu olan müşteriler bu bilgileri el ile çözmelidir (yani, değerlerin ne olması gerektiğini söyleyin.) Milyonlarca giriş ise (veya verilerin önemli bir bölümü) öyleyse, "orada" olması gerektiğini doğru bir şekilde belirleyip belirlemediğinizi yeniden düşünmeniz gerekebilir. Bu, yeni sistemde bir modelleme hatası olduğunu gösteriyor olabilir.

Örneğin, miktarların bir kısmının açıklanamayan bir şekilde eksik olması haricinde, miktarları ve kalem başına toplamları (birim fiyatı değil) içeren bir fatura düşünün. Bu tür faturaları işleyen kişiyle konuşmak, aşağıdaki senaryolardan birini (veya daha fazlasını) üretebilir: 1) "ah, boş bir miktar 1", 2) "bir miktar anlamına gelir. Ah, bu öğelerin 1000 $ civarında gittiğini biliyorum. Açıkçası bu 2 ", 3)" için bir emirdir, bu olduğu zaman, bu diğer sistemdeki fiyatı araştırıyorum ve bölüyorum ve yuvarlıyordum ", 4)" Ben başka bir sisteme bakıyorum ", 5)" bu gerçek veri değil ", 6)" bunu daha önce hiç görmedim ".

Önerildiği gibi, bu durumu otomatik olarak çözmenin bazı yollarını gösterebilir, ancak çözümün tüm durumlar için geçerli olmasına dikkat etmeniz gerekir. Verileri çapraz kontrol edebilecek diğer sistemlerin dahil olması yaygındır ve bu iyi bir şeydir. Ancak, çapraz kontrolü gerçekleştirmek için bu sistemlere erişim sağlamak ve bu sistemlerle entegrasyon yapmak zor olabileceği için genellikle kötü bir şeydir ve çoğu zaman sistemlerin sadece bazı verilerle değil birbirleriyle çatışmasıyla ortaya çıkar. Bazı manuel müdahale genellikle gereklidir ve ölçeğe bağlı olarak, özellikle veri temizleme görevi için oluşturulacak takım ve arayüzler gerektirebilir. Çoğunlukla yapılan, veriler kısmen ithal edilir ancak eksik verileri olan satırlar incelenebilecekleri ayrı bir tabloya gönderilir.


14
Özetle: Eski kodlarla uğraşmanın hoş olmadığını düşünüyorsanız, eski verilerle uğraşmayı deneyin.
Peter Taylor,

0

Veri modelini değiştirin.

Hasradio'yu normalleştirebilirsin ve daha sonra boşuna sahip olamazsın.

Bir boolean değeri belirleyemiyorsanız, bir boolean kullanmayın.

Bir boolean değerinin boş olmasına izin vererek, bir boolean olmayı bırakır. Bir booleanın 2 durumu olabilir: Yanlış, Doğru.

İhtiyacınız olan 3 durum: Yanlış, Doğru, Bilinmeyen.

Veri modelini değiştirme seçeneğiniz var mı?

(Ve düşündüğüm başka bir şey ise, python veya java'da veriyi veritabanınızdan alırsanız. Kaydı alırsınız, hasradio alanını kontrol edin, doğru veya yanlış olup olmadığını kontrol ederseniz ne olur?


2
Veri modelini ve "hasRadio dışarı normalize" değiştirerek, ben yeni bir tablo eklemek gibi ortalama bir şey farz CarFeaturesalanlarla, Car_ID, Feature_ID, Has_Feature? İyi bir fikir gibi görünüyor.
jpa

2
@jpa biraz zor bir durum. Ne yaptığınız konusunda çok açık olmalısınız, çünkü durumumuzda bir kaydın yokluğu bilinmemektedir. Genellikle bir kaydın olmaması, bu özelliğe sahip olmadığı anlamına gelir.
Pieter B

1
Yanlış bakıyorsun Pieter. Kimse bir boolikiden fazla değere sahip değildir, çünkü sizin dediğiniz gibi, öyle değildir. A boolya trueda false. Bununla birlikte, OP'lerin durumunda, OP booldoğrudan ya da değil Option<bool>/Maybe<bool>, sahip olabilecek Some -> true/falseya da olan bir şeyle ilgilenmektedir None.
Andy,

@DavidPacker iddiam, bu yüzden bunun bir Belki <bool> olması durumunda, uzaktan benzer bir şey demeyi bırakmalısınız ya da karışıklık yaşarsınız. Bir boolean kullanmakta ısrar ederseniz, bunu yapmanın güvenli bir yolunu bulun.
Pieter B,

4
Benim düşünceme göre, null boole tamamen iyidir. Yapan geliştiricilerle tanışmış olmama rağmen, hiçbir zaman boş değerlerle ilgili sorun yaşamadım.
Andy,

-1

Diğerlerinin de belirttiği gibi, burada sahip olduğunuz şey, gerçekten boolean olmayan bir boolean değerdir ve asıl mesele, onu boole olmaya zorlamak veya başka türlü ele almaktır.

Tek bir boole sonucu almak yerine, iki boole sonucu elde etmek. Bunlar hem katılabilir hem de aynı fikirde olmayabilir. Kabul ederlerse, basit bir doğru / yanlış sonuç elde edersiniz.

Bununla birlikte, eğer aynı fikirde değillerse, belirsiz bir sonuç elde edersiniz ve ortaya çıkan koşullara bağlı olarak, bunun nasıl ele alınacağına karar verme şansınız olur. Bazı durumlarda, belirsiz bir sonuç en iyi olarak yorumlanabilir, diğerlerinde, aynı belirsiz sonuç en güvenli seçeneğe göre en iyi yanlış olarak yorumlanabilir.

Bu yine de sonucun belirsiz olarak bildirilmesine izin vermesine rağmen, değerin bu ilave nüansı, değerin kesin olarak çözülebileceği ve sıfırlanabileceği noktaya kadar tamamen kaybedilmeyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.