ブール値を決定できない場合の対処方法


38

企業向けのWebアプリケーションを構築していますが、これまでは管理がExcelシートにのみ存在していました。ほぼ完了しましたが、最近、これらのシートからすべてのデータを新しいシステムにインポートするタスクを割り当てられました。システムはJavaで構築されていますが、このインポートは一度だけなので、代わりにPythonでスクリプトを記述し、SQLクエリで直接インポートすることにしました。ここに問題があります。新しいデータモデルには、既存のデータに含まれていないいくつかの新しい属性が含まれています。ほとんどの場合、これは問題ではなく、情報が見つからない場所にnullを置くだけです。しかし、その後、いくつかの属性に遭遇しました。これらの属性はブール値であり、デフォルトではNULLにはできません。最初に、データベース内のこれらのフィールドにnullを許可しようとしましたが、シニア開発者から許可しないように指示されました。将来的にシステムで問題が発生する可能性があるためです。そして今、私は何をすべきかよく分からない。明らかな解決策は、すべての不明なブール値をfalseにデフォルト設定することですが、それも間違っていると思います。

例:hasRadioパラメーターを持つエンティティCarがあるとします。ここで、このデータモデルにデータをインポートする必要がありますが、データには「Model」列と「Color」列のみがあり、無線の有無は関係ありません。設計上nullにできない場合、「hasRadio」列に何を入れますか?

この状況での最善のアプローチは何ですか?不足しているデータを手動で入力するように会社に伝える必要がありますか?または、デフォルトでfalseになっていますか?


70
私にとってNULLを許可するのが正しい解決策です。あなたの先輩は「将来私たちのシステムに問題を引き起こす」よりも具体的でしたか?そうでない場合は、より具体的な理由を尋ねてください。
larsbe

48
FileNotFound明らかにデフォルトに設定する必要があります。
あなたは

7
ブール値フィールド「isValidHasRadio」または何かを追加することは可能でしょうか、それとも物事を壊しますか?
ハイド

9
正しい解決策は、入力データのガベージを考慮してトランザクション全体を中止し、そのデータをガベージと見なしてはならない場合にタスク定義の調整を要求することです。ここには他の方法はありません。
セージボルシュ

17
ところで、私はヌル値の大ファンではありません。むしろ、「Unknown」、「Has Radio」、「Does n't Have Radio」で列挙型を使用します。このようにして、要件に対応し、将来的に「統合テレビ付きラジオ」などのラジオの種類を指定する必要がある場合に、成長する余地があります。
マチャド

回答:


129

これは主に要件分析の問題であり、重要なデータが「ブール」であるという事実とは何の関係もありません。データベースまたは他の種類のデータストレージのテーブルを初期化する必要があり、一部の列の入力が不完全な場合、最初にシステムのユーザーまたは顧客が正しいデフォルト値だと思うものを見つける必要がありますこれらの列については、すべての属性についてこれを見つける必要がありますが、一般的に正しい答えはありません

これは通常、次のいずれかの場合につながります。

  • 特定の列には適切なデフォルト値があります。ユーザーが値が最初にすべてのレコードで同じであるかどうかは気にしません。必要に応じて後で正しい値を簡単に設定できます

  • 他の情報から理想的なデフォルト値を決定するルールがあるので、このルールをコードに入れることができます

  • ユーザーまたは顧客は、データベースにインポートされる前に、入力データを拡張し、欠損値を(おそらく手動で)提供します

  • 特定の列やレコードに適切なデフォルト値がない場合、データもインポートする必要がありますが、ユーザーは特定の値がすでに初期化されているレコードとそうでないレコードを知りたいです。そのため、後で値を入力し、値がすでに正しく設定されているレコードと設定されていないレコードを追跡できます。

最後のケースでは、初期化されていない状態または不明な状態を表すためにNULLのようなものが必要です。ブール値であっても、シニアがそれを好むか好まない場合です。特定の列にNULL値を使用することを禁じる不明瞭な技術的理由がある場合は、追加のブール列(などhasRadioIsUnknown)を導入するか、3代わりに、ブールの-valued列挙(のようなHasNoRadio=0HasRadio=1Unknown=2)。しかし、徹底的な要件分析を行った後、そのような回避策が本当に必要であることを確認するために、あなたの先輩にもう一度話してください。


29
NULLを便利に使用した他の列にも同じ答えが適用されることに注意してください。これが正しいデフォルト値であるかどうかを確認する必要があります。たとえば、他の列に「processingIsFinished」と表示され、顧客の注文履歴から古いデータをインポートする場合(Webショップの考え)、値を「NULL」ではなく「true」に設定して、一部のプロセスがトリガーされないようにする必要がある場合がありますまだ処理されていないエントリに遭遇したとき(その列の解釈による)。
フランクホプキンス

1
これは機能上の問題です。モデル(Excelと新しいモデル)が一致しないため、これらのケースを考慮して移行プロセスを確認する必要があります。進め方を言うことができるのは、利害関係者(顧客または誰でも)だけです。技術的には多くの方法でこれを解決できますが、機能的には1つだけで解決できます。権利。
ライヴ

12
この故障が好きです。この文脈でのnullに対する嫌悪は、主に明確な意味の欠如によるものです。不明は明らかです。しかし、nullは不明または適用外を意味しますか?誰がどのように知っていますか?あなたにとって理にかなっているからといって、他の誰もが同じように見るとは限りません。
candied_orange

オプション4:特定の列の値がないレコードは実際には役に立たないため、インポートから除外する必要があります。オプション5:インポートする前に、誰かがすべての受信データを修正する必要があります。多くのオプションは、ニーズと予算に依存します。古いデータのインポートは常に大きな混乱です。
jpmc26

@ jpmc26:まあ、オプション4は含めませんでした。OPが文字通り書いたものを保持したかったからです(レコードがないため、欠落データがインポートデータに絶対に含まれない場合)。オプション5は、NULL値の必要性を回避する別の方法であるため、言及する価値があります。それに応じて私の答えを編集しました。
Doc Brown

39

これは技術的な質問ではありません。それはビジネスルールの質問です。だから、あなたは「ビジネス」を尋ねる必要があります。

製品所有者および/または利害関係者にアプローチし、次のように言います。

アプリケーションでリクエストしたフィールドの1つについて不完全なデータがあります。デフォルト値を使用しますか?有効な値として「不明」を追加しますか?または、インポート前にチームの誰かにデータを修正してもらいたいですか?

おそらく議論が続くでしょう。しかし、それは基本的にそれです。技術的なソリューションは、より具体的なビジネスルールから自然に流れます。


9

一般的な問題は、データ統合と呼ばれるより大きなサブエリアの一部であるデータクレンジングと呼ばれるプログラミングのサブエリア全体です。こうした種類の問題を回避することが、Excelシートからの移行の理由の大部分である可能性が高く、上級開発者がフィールドをNULL可能にしたくない理由です。これがデータ移行の複雑さの大きな原因の1つであると言っても不合理ではないと思います。

ちょうどあなたができた非常に多くの可能性があるときは常にNULLを使用することを選択間違っおろか、まだ多くのNULL可能フィールドにするために、データモデルを変更し、実行すること。Excelには、これらの問題の多くの原因である可能性がある整合性チェックが弱いか、まったくありません。間違った方法は、新しいデータベースの整合性チェックを削除し、ガベージをダンプすることです。これは問題を永続させるだけであり、無意味なデータを何らかの形で処理しなければならない将来の統合を大幅に複雑にします。

違いの一部は、データモデルの不一致が原因である可能性があります。これに対処するには、主に両方のデータモデルに(親密に)精通し、古いモデルを新しいモデルにマッピングする方法を知っている必要があります。新しいもの古いものをキャプチャできる限り。(そうでない場合、チームにはおそらく非常に大きな問題があります。)これは、単に列をコピーするよりも多くの作業を行う必要がある場合があります。Darkwingは、これの優れた例を示しています(同様に、盲目的にNULLを挿入するのが間違っている理由と同様に)。古いモデルが持っていた場合、それにエラボReceivedDateInProgressビットと新しいモデルがありStartDateProcessingEndTime、あなたがして設定する方法かどうかを判断する必要がありますProcessingEndTime。使用方法に応じて、合理的な(ただし任意の)選択肢は、StartDate (または、それが問題を引き起こす場合、その後すぐに)。

ただし、違いの一部は、存在するはずのデータが欠落または破損しているためと考えられます。(データ入力エラーまたはデータ処理システムの過去の移行やバグの処理が不十分である可能性が高い。)チームの誰もこれを予想していなかった場合、(集合的に)プロジェクトの時間の20%を費やすように設定しているほとんど」完了。(それは構成された数でしたが、それは遠くなる可能性がありますそれより悪い、または良い。それは、データがどれだけ間違っているか、それがどれだけ重要か、どれだけ複雑か、データの責任者から関与するのがどれだけ簡単か、そしてその他の要因に依存します。)ありますが、欠落しています。通常は、古いデータソースにクエリを実行して、問題の範囲を特定しようとします。数十または数百のエントリの場合、おそらくデータ入力エラーであり、データの責任者は手動で解決する必要があります(つまり、値がどうあるべきかを教えてください)。数百万のエントリ(またはデータのかなりの部分) 、「あるべき」と正しく認識したかどうかを再検討する必要があるかもしれません。これは、新しいシステムのモデリングエラーを示している可能性があります。

たとえば、数量とアイテムごとの合計(ただし、単価ではない)を含む請求書を想像してください。ただし、数量の一部は不可解に欠落していました。そのような請求書を処理する人と話すと、次のシナリオの1つ(またはそれ以上)が生成される可能性があります。1)「ああ、空の量は1の量を意味する」、2)「ああ、明らかに、これは2の注文です。3)「それが起こったとき、この他のシステムで価格を調べて割って丸めます」、4)「別のシステムで調べます」、5)「実際のデータではありません"、6)"これまで見たことがない "。

提案されているように、これは状況を自動的に解決するいくつかの方法を示すことができますが、すべての場合に解決策が適用されることに注意する必要があります。データをクロスチェックできる他のシステムが関与することは一般的であり、これは良いことです。しかし、クロスチェックを実行するためにこれらのシステムにアクセスして統合するのが困難な場合、それはしばしば悪いことであり、データが欠落しているだけでなく、システムが互いに競合していることがしばしば明らかになります。多くの場合、手動による介入が必要であり、規模によっては、データクレンジングタスク専用のツールとインターフェイスを作成する必要があります。多くの場合、データは部分的にインポートされますが、データが欠落している行は別のテーブルに送信され、そこで確認できます。


14
要約すると、レガシーコードの処理が不快だと思われる場合は、レガシーデータの処理を試してください。
ピーターテイラー

0

データモデルを変更します。

hasradioを正規化すると、nullがなくなります。

ブール値を決定できない場合は、ブール値を使用しないでください。

ブール値をnullにできるようにすることで、ブール値になるのを止めます。ブール値には、False、Trueの2つの状態があります。

必要なのは、False、True、Unknownの3つの状態です。

データモデルを変更するオプションはありますか?

(そして、私が考えたもう一つのことは、pythonまたはjavaでデータベースからデータを取得する場合です。レコードを取得し、hasradioフィールドをチェックします。trueまたはfalseであり、nullである場合はどうなりますか?)


2
データモデルと「hasRadioアウト正規化」を変更することにより、私はあなたに新しいテーブルを追加するような平均何かを前提とCarFeaturesフィールドとを、Car_IDFeature_IDHas_Feature?良いアイデアのようです。
jpa

2
@jpaそれは少し厄介な状況です。私たちの状況に記録がないことは未知を意味するので、あなたは何をするかを非常に明確にしなければなりません。多くの場合、レコードが存在しないということは、その機能がないことを意味します。
ピーターB

1
あなたは間違っているのを見ています、ピーター。a boolが3つ以上の値を持っていると言う人はいません。なぜなら、あなたが言ったように、そうではないからです。Aは、boolどちらかですtruefalse。ただし、OPの場合、OPはをbool直接処理するのではなく、またはOption<bool>/Maybe<bool>を持つことができるを処理します。Some -> true/falseNone
アンディ

@DavidPacker私の主張は、それがMaybe <bool>であるため、リモートで類似したものを呼び出すのをやめなければ混乱することです。そして、ブール値の使用を主張する場合は、それを行う安全な方法を見つけてください。
ピーターB

4
私の意見では、ヌル可能ブール値は完全に問題ありません。null値に関する問題は一度もありませんでしたが、開発者に会ったことがあります。
アンディ

-1

他の人が指摘したように、ここにあるのは真のブール値ではないブール値であり、問​​題はそれを強制的にブール値にするか、そうでなければそれを処理することです。

あなたができることは、単一のブール結果を持つ代わりに、2つのブール結果を持つことです。これらは同意することも同意しないこともあります。彼らが同意すれば、あなたは簡単な真/偽の結果になります。

ただし、両者が同意しない場合、結果は不確定になり、発生する状況に応じて、その処理方法を決定する機会があります。最も安全なオプションに従って、不確定な結果が真であると最もよく解釈される場合もあれば、同じ不確定な結果が偽であると最もよく解釈される場合もあります。

ただし、これにより、結果が不定として報告される可能性があるため、値の最終的な解決とリセットが可能になるまで、値のこの追加のニュアンスは完全には失われません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.