it-swarm.com.de

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

Wir erstellen eine Webanwendung für Unternehmen, deren Verwaltung bisher nur in Excel-Tabellen vorhanden war. Wir sind fast fertig, aber kürzlich wurde mir die Aufgabe übertragen, alle 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 in Python stattdessen zu schreiben und sie direkt mit SQL-Abfragen zu importieren. Hier kommt das Problem. Das neue Datenmodelle enthalten einige neue Attribute, die nicht in den vorhandenen Daten enthalten sind. In den meisten Fällen ist dies kein Problem. Ich habe nur eine Null gesetzt, bei der ich die Informationen nicht finden kann. Dann bin ich auf einige Attribute gestoßen Zuerst habe ich versucht, nur null für diese Felder in unserer Datenbank zuzulassen, aber mein leitender Entwickler hat mir gesagt, dass ich das nicht tun soll, da dies in Zukunft zu Problemen in unserem System führen würde Jetzt bin ich mir nicht ganz sicher, was ich tun soll. Die offensichtliche Lösung besteht darin, 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 Daten gibt es nur die Spalten "Modell" und "Farbe", nichts davon, ob Radio vorhanden ist oder nicht. Was setzen Sie in eine "hasRadio" -Spalte, wenn sie nicht von Natur aus null sein kann?

Was ist der beste Ansatz in dieser Situation? Sollten wir das Unternehmen nur anweisen, die fehlenden Daten manuell einzugeben? Oder standardmäßig false?

38
Liberul

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

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

  • es gibt einen guten Standardwert für die jeweilige Spalte. Benutzer haben nichts dagegen, wenn der Wert anfangs für alle Datensätze gleich ist. Sie können die richtigen Werte anschließend bei Bedarf einfach festlegen

  • es gibt eine Regel, wie der ideale Standardwert aus anderen Informationen ermittelt wird, sodass Sie diese Regel in Code einfügen können

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

  • es gibt keinen guten Standardwert für die bestimmte Spalte und/oder einen Datensatz. Die Daten sollten ebenfalls importiert werden, aber die Benutzer möchten wissen für welchen Datensatz der bestimmte Wert bereits initialisiert wurde und für welchen nicht. So können sie den Wert danach eingeben und verfolgen, für welche Datensätze der Wert bereits korrekt 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" Status auf andere Weise simulieren, indem Sie entweder eine zusätzliche boolesche Spalte einführen (wie hasRadioIsUnknown). oder durch Verwendung einer 3-wertigen Aufzählung anstelle eines Booleschen Werts (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.

129
Doc Brown

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 etwas wie:

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 "unbekannt" als gültigen Wert hinzufügen? Oder möchten Sie, dass jemand in Ihrem Team die Daten vor dem Import korrigiert?

Einige Diskussionen werden wahrscheinlich folgen. Aber das ist im Grunde es. Die technische Lösung ergibt sich natürlich aus den detaillierteren Geschäftsregeln.

39
svidgen

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

Nur NULL zu verwenden, wann immer Sie könnten, ist wahrscheinlich das Falsche , geschweige denn das Datenmodell zu ändern, um noch mehr Felder auf Null zu setzen. Excel hat eine schwache oder keine Integritätsprüfung, was wahrscheinlich die Ursache für viele dieser Probleme ist. Das Falsche ist, die Integritätsprüfung in der neuen Datenbank zu entfernen und Müll in die Datenbank zu werfen. Dies setzt das Problem nur fort und erhöht die Komplexität zukünftiger Integrationen, die irgendwie mit unsinnigen Daten umgehen müssen, erheblich.

Ein Teil des Unterschieds ist wahrscheinlich auf eine Nichtübereinstimmung des Datenmodells zurückzuführen. Der Umgang damit besteht hauptsächlich darin, beide Datenmodelle (genau) zu kennen und zu wissen, wie man das alte auf das neue abbildet. Solange der neue den alten erfassen kann. (Wenn nicht, hat Ihr Team wahrscheinlich ein sehr großes Problem.) Dies kann leicht mehr Arbeit erfordern als nur das Kopieren von Spalten. Darkwing ist ein hervorragendes Beispiel dafür (und warum das blinde Einfügen von NULL-Werten das Falsche ist). Wenn das alte Modell ein ReceivedDate und ein InProgress Bit hatte und das neue Modell ein StartDate und ProcessingEndTime hat, müssen Sie sich entscheiden ob und wie man das ProcessingEndTime setzt. Je nachdem, wie es verwendet wird, kann eine vernünftige (aber willkürliche) Wahl darin bestehen, es so einzustellen, dass es mit dem StartDate identisch ist (oder kurz danach, wenn dies Probleme verursachen würde).

Ein Teil des Unterschieds ist jedoch wahrscheinlich auf Daten zurückzuführen, die vorhanden sein sollten, die fehlen oder beschädigt sind. (Höchstwahrscheinlich aufgrund von Dateneingabefehlern oder schlecht behandelten früheren Migrationen oder Fehlern in Datenverarbeitungssystemen.) Wenn niemand in Ihrem Team dies erwartet hat, haben Sie sich (gemeinsam) darauf eingestellt, 20% der Projektzeit zu verbringen. " fast fertig. (Das war eine erfundene Zahl, aber sie kann weit schlimmer oder besser sein. Es hängt davon ab, wie viele Daten falsch sind, wie wichtig Es ist, wie komplex es ist, wie einfach es ist, sich von den Verantwortlichen für die Daten und anderen Faktoren zu beteiligen.) Sobald Sie festgestellt haben, dass die Daten dort "sein sollen", aber fehlen. Normalerweise 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 die Werte lauten sollten). Wenn es sich um Millionen von Einträgen handelt (oder um einen erheblichen Teil der Daten). Dann müssen Sie möglicherweise erneut prüfen, ob Sie richtig erkannt haben, dass es dort "sein sollte". Dies kann auf einen Modellierungsfehler im neuen System hinweisen. Wenn Sie die Personen, die die Daten verwenden, nach den fehlenden Daten fragen, sind sie sich dessen häufig bewusst und haben Ad-hoc-Möglichkeiten, damit umzugehen.

Stellen Sie sich zum Beispiel eine Rechnung vor, die Mengen und Summen pro Artikel (aber nicht Stückpreis) enthielt, außer dass einige der Mengen unerklärlicherweise fehlten. Wenn Sie mit der Person sprechen, die solche Rechnungen bearbeitet, 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 US-Dollar kosten. Dies ist eindeutig eine Bestellung für 2 ", 3)" Wenn dies passiert, schaue ich in diesem anderen System nach dem Preis und teile und runde ", 4)" Ich schaue in einem anderen System nach ", 5)" Das sind keine echten Daten ", 6)" noch nie gesehen ".

Wie vorgeschlagen, kann dies einige Möglichkeiten zur automatischen Lösung 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 eine schlechte Sache, da es schwierig sein kann, Zugang zu diesen Systemen zu erhalten und diese zu integrieren, um die Gegenprüfung durchzuführen, und es stellt sich häufig heraus, dass die Systeme nicht nur dadurch in Konflikt miteinander stehen, dass einige Daten fehlen. Einige manuelle Eingriffe sind häufig erforderlich und erfordern je nach Maßstab möglicherweise die Erstellung von Werkzeugen und Schnittstellen speziell für die Datenbereinigungsaufgabe. Oft werden die Daten teilweise importiert, aber Zeilen mit fehlenden Daten werden an eine separate Tabelle gesendet, wo sie überprüft werden können. Oft muss dies in einer angemessenen Granularität erfolgen, um die Konsistenz im neuen System zu gewährleisten (dh Rechnungen ablehnen, nicht einzelne Werbebuchungen, selbst wenn die meisten Werbebuchungen in einer bestimmten Rechnung in Ordnung sind), und dies kann zu Kaskaden führen (wenn ich kann). Wenn Sie keinen Kunden importieren, kann ich keine Rechnungen für diesen Kunden importieren.

Ä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.

Wenn ein boolescher Wert null wird, wird er nicht mehr boolesch. Ein Boolescher Wert kann zwei Zustände haben: False, True.

Was Sie brauchen, sind 3 Zustände: Falsch, Richtig, 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. Sie den Datensatz abrufen, überprüfen Sie das Hasradio-Feld, was) wird passieren, wenn Sie überprüfen, ob es wahr oder falsch ist und es zufällig null ist?)

0
Pieter B