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?
FileNotFound
natürlich standardmäßig tun.Antworten:
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 (wieHasNoRadio=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.quelle
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:
Eine Diskussion wird wahrscheinlich folgen. Aber das ist im Grunde es. Die technische Lösung ergibt sich natürlich aus den konkreteren Geschäftsregeln.
quelle
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
ReceivedDate
und einInProgress
bisschen und das neue Modell einStartDate
und hatProcessingEndTime
, müssen Sie entscheiden, ob und wie Sie das einstellen möchtenProcessingEndTime
. 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.
quelle
Ä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?)
quelle
CarFeatures
, mit FeldernCar_ID
,Feature_ID
,Has_Feature
? Scheint eine gute Idee zu sein.bool
mehr als zwei Werte hat, weil es, wie Sie gesagt haben, nicht so ist. Abool
ist entwedertrue
oderfalse
. Bei OPs handelt es sich jedoch nicht um einbool
direktes, sondern um einOption<bool>/Maybe<bool>
, dasSome -> true/false
oder haben kannNone
.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.
quelle