Was tun, wenn Sie keinen Booleschen Wert ermitteln können?

38

Wir erstellen eine Webanwendung für Unternehmen, die bisher nur in Excel-Tabellen verwaltet wurde. Wir sind fast fertig, aber vor kurzem wurde mir die Aufgabe übertragen, alle ihre Daten von diesen Blättern in unser neues System zu importieren. Das System ist in Java erstellt, aber da dieser Import nur einmalig ist, habe ich beschlossen, die Skripte stattdessen in Python zu schreiben und sie direkt mit SQL-Abfragen zu importieren. Hier kommt das Problem. Das neue Datenmodell enthält einige neue Attribute, die nicht in den vorhandenen Daten enthalten sind. In den meisten Fällen ist dies kein Problem. Ich setze einfach eine Null, wo ich die Informationen nicht finden kann. Aber dann bin ich auf ein paar Attribute gestoßen, die boolesche Werte sind und nicht standardmäßig NULL sein können. Zuerst habe ich versucht, nur null für diese Felder in unserer Datenbank zuzulassen, aber mein leitender Entwickler sagte mir, ich solle es nicht tun. wie es in Zukunft ein Problem in unserem System verursachen würde. Und jetzt bin ich mir nicht ganz sicher, was ich tun soll. Es liegt auf der Hand, jeden unbekannten booleschen Wert auf false zu setzen, aber ich denke, das ist auch falsch, weil ich eigentlich nicht weiß, ob es falsch ist.

Beispiel: Angenommen, Sie haben eine Entität Car mit einem hasRadio-Parameter. Jetzt müssen Sie Daten in dieses Datenmodell importieren, aber in den Daten gibt es nur die Spalten "Modell" und "Farbe", und nichts darüber, ob Radio vorhanden ist oder nicht. Was fügst du in eine "hasRadio" -Spalte ein, wenn sie nicht beabsichtigt null sein kann?

Was ist der beste Ansatz in dieser Situation? Sollen wir dem Unternehmen nur sagen, dass es die fehlenden Daten manuell ausfüllen soll? Oder voreingestellt auf false?

Liberul
quelle
70
Für mich wäre das Zulassen von NULL die richtige Lösung. War Ihr Vorgesetzter genauer als "in Zukunft ein Problem in unserem System verursachen"? Wenn nicht, fragen Sie ihn nach genaueren Gründen.
Larsbe
48
Sie sollten dies FileNotFoundnatürlich standardmäßig tun.
Sie
7
Wäre es möglich, ein boolesches Feld, "isValidHasRadio" oder etwas hinzuzufügen , oder würde dies ebenfalls zu Problemen führen?
Hyde
9
Die richtige Lösung besteht darin, den Eingabedatenmüll zu berücksichtigen und die gesamte Transaktion abzubrechen und dann eine Anpassung der Aufgabendefinition anzufordern, wenn diese Daten nicht als Müll betrachtet werden dürfen. Es gibt keinen anderen Weg hierher.
Sarge Borsch
17
Ich bin übrigens kein großer Fan von Nullwerten. Ich würde lieber eine Aufzählung mit "Unbekannt", "Hat Radio" und "Hat kein Radio" verwenden. Auf diese Weise werden Sie Ihren Anforderungen gerecht und haben Raum zum Wachsen, wenn Sie in Zukunft einen Radiotyp angeben müssen, z. B. "Radio mit integriertem TV" oder ähnliches.
Machado

Antworten:

129

Dies ist hauptsächlich ein Problem der Anforderungsanalyse und hat nichts mit der Tatsache zu tun, dass die in Frage kommenden Daten "boolesch" sind. Wenn Sie Tabellen in einer Datenbank oder in einer anderen Art von Datenspeicher initialisieren müssen und die Eingabe für einige Spalten unvollständig ist, müssen Sie zuerst herausfinden, was die Benutzer des Systems oder Ihr Kunde für den richtigen Standardwert halten Für diese Spalten gibt es keine allgemein richtige Antwort , und Sie müssen dies für jedes einzelne Attribut herausfinden .

Dies führt normalerweise zu einem der folgenden Fälle:

  • Es gibt einen guten Standardwert für die jeweilige Spalte. Es macht den Benutzern nichts aus, wenn der Wert anfangs für alle Datensätze gleich ist. Sie können anschließend bei Bedarf problemlos die richtigen Werte festlegen

  • Es gibt eine Regel zum Ermitteln des idealen Standardwerts aus anderen Informationen, sodass Sie diese Regel in Code einfügen können

  • Die Benutzer oder Ihr Kunde werden die Eingabedaten erweitern und die fehlenden Werte (möglicherweise manuell) bereitstellen, bevor sie in die Datenbank importiert werden

  • Es gibt keinen guten Standardwert für die jeweilige Spalte und / oder einen Datensatz. Die Daten sollten ebenfalls importiert werden. Die Benutzer möchten jedoch wissen, für welchen der Datensätze der jeweilige Wert bereits initialisiert ist und für welchen nicht. So können sie den Wert nachträglich eingeben und nachverfolgen, für welche Datensätze der Wert bereits richtig eingestellt ist und für welche nicht.

Der letzte Fall erfordert so etwas wie NULL, um den nicht initialisierten oder unbekannten Zustand darzustellen, selbst für einen Booleschen Wert, ob es Ihrem Senior gefällt oder nicht. Wenn es einen unklaren technischen Grund gibt, der die Verwendung eines NULL-Werts für eine bestimmte Spalte verbietet, müssen Sie den "unbekannten" Zustand auf andere Weise simulieren, indem Sie entweder eine zusätzliche boolesche Spalte (wie hasRadioIsUnknown) oder eine 3 einfügen -wertigen Aufzählung anstelle eines boolean (wie HasNoRadio=0, HasRadio=1, Unknown=2). Sprechen Sie jedoch nach einer gründlichen Anforderungsanalyse erneut mit Ihrem Senior, um sicherzustellen, dass eine solche Problemumgehung wirklich erforderlich ist.

Doc Brown
quelle
29
Sie sollten auch beachten, dass die gleiche Antwort für die anderen Spalten gilt, in denen Sie bequem NULL verwendet haben. Sie sollten überprüfen, ob dies der richtige Standardwert ist. Wenn beispielsweise in einer anderen Spalte "processingIsFinished" angegeben ist und Sie alte Daten aus der Bestellhistorie des Kunden importieren (denken Sie an einen Webshop), müssen Sie möglicherweise den Wert auf "true" anstatt auf "NULL" setzen, um zu verhindern, dass einige Prozesse ausgelöst werden wenn sie auf Einträge stoßen, die noch nicht verarbeitet wurden (entsprechend ihrer Interpretation dieser Spalte).
Frank Hopkins
1
Dies ist ein funktionales Problem. Da die Modelle (Excel und das neue) nicht übereinstimmen, sollte der Migrationsprozess unter Berücksichtigung dieser Fälle überprüft werden. Das einzige, was über das weitere Vorgehen aussagen kann, sind die Stakeholder (Kunde oder wer auch immer). Technisch kann man das auf viele Arten lösen, aber funktional nur in einer. Das Recht.
Laiv,
12
Ich mag diese Aufteilung. Meine Abneigung gegen Null in diesem Zusammenhang ist hauptsächlich auf den Mangel an klarer Bedeutung zurückzuführen. Unbekannt ist klar. Aber bedeutet null unbekannt oder nicht zutreffend? Wie würde jemand wissen? Nur weil es für Sie Sinn macht, heißt das nicht, dass alle anderen es genauso sehen werden.
candied_orange
Option 4: Datensätze, bei denen ein bestimmter Spaltenwert fehlt, sind eigentlich nutzlos und sollten vom Import ausgeschlossen werden. Option 5: Jemand muss alle eingehenden Daten korrigieren, bevor sie importiert werden. Viele Optionen, hängt nur von den Bedürfnissen und dem Budget ab. Das Importieren alter Daten ist immer ein großes Chaos.
jpmc26
@ jpmc26: nun, ich habe Option 4 nicht aufgenommen, da ich festhalten wollte, was das OP buchstäblich geschrieben hat (ein Fall, in dem die fehlenden Daten definitiv nicht in den Importdaten enthalten sind, für keine Aufzeichnung). Option 5 ist in der Tat erwähnenswert, da auf diese Weise die Notwendigkeit von NULL-Werten vermieden werden kann. Bearbeitet meine Antwort entsprechend.
Doc Brown
39

Dies ist keine technische Frage; Es ist eine Frage der Geschäftsregeln. Sie müssen also "das Geschäft" fragen.

Wenden Sie sich an den Product Owner und / oder die Stakeholder und sagen Sie Folgendes:

Wir haben unvollständige Daten für eines der Felder, die Sie in der Bewerbung angefordert haben. Möchten Sie, dass wir einen Standardwert verwenden? Möchten Sie, dass wir "unknown" als gültigen Wert hinzufügen? Oder möchten Sie, dass jemand in Ihrem Team die Daten vor dem Import korrigiert?

Eine Diskussion wird wahrscheinlich folgen. Aber das ist im Grunde es. Die technische Lösung ergibt sich natürlich aus den konkreteren Geschäftsregeln.

Svidgen
quelle
9

Das allgemeine Problem ist ein ganzer Teilbereich der Programmierung, der als Datenbereinigung bezeichnet wird und Teil eines größeren Teilbereichs ist, der als Datenintegration bezeichnet wird . Das Vermeiden dieser Art von Problemen ist wahrscheinlich ein großer Teil des Grundes für die Migration von Excel-Tabellen und warum der Senior-Entwickler nicht zulassen möchte, dass ein Feld nullwertfähig wird. Ich halte es nicht für unangemessen zu sagen, dass dies eine der Hauptursachen für Komplexität bei Datenmigrationen ist.

Es ist wahrscheinlich sehr falsch , NULL zu verwenden, wann immer dies möglich ist , geschweige denn, das Datenmodell zu ändern, um noch mehr Felder nullfähig zu machen. Excel verfügt über eine schwache oder keine Integritätsprüfung, die wahrscheinlich die Ursache für viele dieser Probleme ist. Das Falsche ist, die Integritätsprüfung in der neuen Datenbank zu entfernen und den Müll hinein zu werfen. Dies verewigt nur das Problem und erhöht die Komplexität zukünftiger Integrationen, die auf irgendeine Weise mit unsinnigen Daten umgehen müssen.

Ein Teil des Unterschieds ist wahrscheinlich auf die Nichtübereinstimmung des Datenmodells zurückzuführen. Der Umgang mit diesem Problem besteht hauptsächlich darin, beide Datenmodelle (genau) zu kennen und zu wissen, wie man das alte auf das neue abbildet. Solange der neue ist für den Fang von den alten fähig. (Wenn nicht, hat Ihr Team wahrscheinlich ein sehr großes Problem.) Dies kann leicht mehr Arbeit erfordern als nur das Kopieren von Spalten. Darkwing gibt ein hervorragendes Beispiel dafür (und warum das blinde Einfügen von NULL-Werten falsch ist). Wenn das alte Modell ein ReceivedDateund ein InProgressbisschen und das neue Modell ein StartDateund hat ProcessingEndTime, müssen Sie entscheiden, ob und wie Sie das einstellen möchten ProcessingEndTime. Abhängig davon, wie es verwendet wird, kann es eine sinnvolle (aber willkürliche) Wahl sein, es so einzustellen, dass es dasselbe wie das istStartDate (oder kurz danach, wenn dies zu Problemen führen würde).

Ein Teil des Unterschieds ist jedoch wahrscheinlich auf fehlende oder beschädigte Daten zurückzuführen, die vorhanden sein sollten. (Höchstwahrscheinlich aufgrund von Fehlern bei der Dateneingabe oder einer schlechten Behandlung früherer Migrationen oder Fehler in Datenverarbeitungssystemen.) Wenn dies niemand in Ihrem Team erwartet hat, haben Sie sich (gemeinsam) darauf eingestellt, 20% der Zeit des Projekts zu verbringen. " fast fertig. (Das war eine erfundene Nummer, aber es kann weit seinschlimmer als das oder besser. Es hängt davon ab, wie viele Daten falsch sind, wie wichtig sie sind, wie komplex sie sind, wie einfach es ist, die Verantwortlichen für die Daten einzubeziehen und andere Faktoren.) Sobald Sie festgestellt haben, dass die Daten "sollen" "da sein" fehlt aber. In der Regel versuchen Sie, das Ausmaß des Problems zu ermitteln, indem Sie die alten Datenquellen abfragen. Wenn es sich um Dutzende oder Hunderte von Einträgen handelt, handelt es sich wahrscheinlich um Dateneingabefehler, und die für die Daten verantwortlichen Kunden sollten diese manuell beheben (dh Ihnen mitteilen, wie hoch die Werte sein sollten). Dann müssen Sie möglicherweise überdenken, ob Sie richtig erkannt haben, dass es dort "sein sollte". Dies könnte auf einen Modellierungsfehler im neuen System hindeuten.

Stellen Sie sich zum Beispiel eine Rechnung vor, die Mengen und Stückzahlen (aber keinen Stückpreis) enthält, mit der Ausnahme, dass einige der Mengen unerklärlicherweise fehlten. Wenn Sie mit der Person sprechen, die solche Rechnungen verarbeitet, kann dies zu einem (oder mehreren) der folgenden Szenarien führen: 1) "Oh, eine leere Menge bedeutet eine Menge von 1", 2) "Oh, ich weiß, dass diese Artikel ungefähr 1.000 USD kosten. Dies ist eindeutig ein Befehl für 2 ", 3)", wenn das passiert, schaue ich nach dem Preis in diesem anderen System und teile und runde ", 4)" Ich schaue nach einem anderen System ", 5)" das sind keine echten Daten ", 6)" das habe ich noch nie gesehen ".

Wie vorgeschlagen, kann dies einige Möglichkeiten zur automatischen Behebung der Situation aufzeigen, Sie müssen jedoch darauf achten, dass die Lösung für alle Fälle gilt. Es ist üblich, dass andere Systeme beteiligt sind, die die Daten überprüfen können, und dies ist eine gute Sache. Es ist jedoch oft insofern eine schlechte Sache, als es schwierig sein kann, Zugang zu diesen Systemen zu erlangen und sich in sie zu integrieren, um die Gegenprüfung durchzuführen, und es stellt sich oft heraus, dass die Systeme miteinander in Konflikt stehen, nicht nur, weil einige Daten fehlen. Einige manuelle Eingriffe sind häufig erforderlich, und je nach Maßstab müssen möglicherweise Tools und Schnittstellen speziell für die Datenbereinigungsaufgabe erstellt werden. Oft werden die Daten teilweise importiert, aber Zeilen mit fehlenden Daten werden an eine separate Tabelle gesendet, in der sie überprüft werden können.

Derek Elkins
quelle
14
Fazit: Wenn Sie den Umgang mit altem Code für unangenehm halten, versuchen Sie, mit alten Daten umzugehen.
Peter Taylor
0

Ändern Sie das Datenmodell.

Sie können das Hasradio normalisieren und haben dann keine Nullen mehr.

Wenn Sie keinen Booleschen Wert ermitteln können, verwenden Sie keinen Booleschen Wert.

Indem ein boolescher Wert auf Null gesetzt wird, wird er nicht mehr boolescher Wert. Ein Boolescher Wert kann zwei Zustände haben: Falsch, Wahr.

Was Sie brauchen, sind 3 Zustände: Falsch, Wahr, Unbekannt.

Haben Sie die Möglichkeit, das Datenmodell zu ändern?

(Und eine andere Sache, an die ich gedacht habe, wenn Sie in Python oder Java die Daten aus Ihrer Datenbank abrufen. Wenn Sie den Datensatz abrufen, überprüfen Sie das Feld hasradio. Was passiert, wenn Sie prüfen, ob er wahr oder falsch ist und zufällig null ist?)

Pieter B
quelle
2
Durch die Änderung des Datenmodells und „Normalisierung aus hasRadio“, ich nehme an, Sie etwas bedeuten wie das Hinzufügen einer neuen Tabelle CarFeatures, mit Feldern Car_ID, Feature_ID, Has_Feature? Scheint eine gute Idee zu sein.
jpa
2
@jpa es ist ein bisschen eine schwierige Situation. Sie müssen sehr klar sein, was Sie tun, denn das Fehlen einer Aufzeichnung in unserer Situation bedeutet unbekannt. Während oft das Fehlen einer Aufzeichnung bedeutet, dass es die Funktion nicht hat.
Pieter B
1
Sie sehen es falsch, Pieter. Niemand sagt, dass a boolmehr als zwei Werte hat, weil es, wie Sie gesagt haben, nicht so ist. A boolist entweder trueoder false. Bei OPs handelt es sich jedoch nicht um ein booldirektes, sondern um ein Option<bool>/Maybe<bool>, das Some -> true/falseoder haben kann None.
Andy
@DavidPacker Mein Argument ist, dass es deswegen ein Vielleicht <bool> ist, dass Sie aufhören sollten, es irgendetwas entfernt Ähnliches zu nennen, oder Sie werden Verwirrung stiften. Und wenn Sie darauf bestehen, einen Booleschen Wert zu verwenden, finden Sie einen sicheren Weg, dies zu tun.
Pieter B
4
Meiner Meinung nach ist nullable boolean völlig in Ordnung. Ich hatte nie Probleme mit Nullwerten, obwohl ich Entwickler getroffen habe, die das taten.
Andy
-1

Wie andere darauf hingewiesen haben, haben Sie hier einen booleschen Wert, der nicht wirklich boolesch ist, und es geht darum, ihn entweder als booleschen Wert zu erzwingen oder ihn auf andere Weise zu behandeln.

Anstatt nur ein einziges boolesches Ergebnis zu haben, können Sie auch zwei boolesche Ergebnisse haben. Diese könnten entweder zustimmen oder nicht zustimmen. Wenn sie übereinstimmen, haben Sie ein direktes Wahr / Falsch-Ergebnis.

Stimmen sie jedoch nicht überein, haben Sie ein unbestimmtes Ergebnis und die Möglichkeit, abhängig von den Umständen, unter denen es auftritt, zu entscheiden, wie Sie damit umgehen sollen. In einigen Fällen kann ein unbestimmtes Ergebnis am besten als wahr interpretiert werden, während in anderen Fällen das gleiche unbestimmtes Ergebnis am besten als falsch interpretiert werden kann, je nach der sichersten Option.

Dies würde es jedoch weiterhin ermöglichen, das Ergebnis als unbestimmt zu melden, sodass diese zusätzliche Nuance des Werts nicht vollständig verloren geht, bis der Wert endgültig aufgelöst und zurückgesetzt werden kann.

Lee Leon
quelle