Außerhalb des Arguments, ob NULLs jemals verwendet werden sollten oder nicht: Ich bin für eine vorhandene Datenbank verantwortlich, die NULL verwendet, um "fehlende oder nie eingegebene" Daten zu bedeuten. Es unterscheidet sich von einer leeren Zeichenfolge, was bedeutet, dass "ein Benutzer diesen Wert festgelegt und" leer "ausgewählt hat."
Ein anderer Auftragnehmer des Projekts ist fest davon überzeugt, dass NULLs für mich nicht existieren; ich verwende niemals NULL und niemand anderes sollte es auch nicht. Was mich jedoch verwirrt, ist, dass das Team des Auftragnehmers, da es den Unterschied zwischen "fehlend / nie eingegeben" und "absichtlich leer oder vom Benutzer als unbekannt angegeben" anerkennt, ein einziges Zeichen "Z" in seinem Code und in gespeicherten Prozeduren verwendet stellen "fehlend / nie eingegeben" mit der gleichen Bedeutung wie NULL im Rest der Datenbank dar.
Obwohl unser gemeinsamer Kunde eine Änderung beantragt hat und ich diese Anfrage unterstützt habe, nennt das Team dies als "Standardpraxis" unter DBAs, die weit fortgeschrittener sind als ich. Sie zögern, NULLs nur aufgrund meiner unwissenden Anfrage zu verwenden. Kann mir jemand helfen, meine Unwissenheit zu überwinden? Gibt es einen Standard oder eine kleine Gruppe von Personen oder sogar eine einzige laute Stimme unter SQL-Experten, die die Verwendung von 'Z' anstelle von NULL befürwortet?
Aktualisieren
Ich habe eine Antwort vom Auftragnehmer hinzuzufügen. Folgendes sagte er, als der Kunde darum bat, die speziellen Werte zu entfernen, um NULL in Spalten ohne Daten zuzulassen:
Grundsätzlich habe ich die Datenbank so konzipiert, dass NULL-Werte nach Möglichkeit vermieden werden. Hier ist die Begründung:
• Ein NULL-Wert in einem String-Feld [VARCHAR] ist niemals erforderlich, da ein leerer String (Länge Null) genau dieselben Informationen liefert.
• Ein NULL-Wert in einem ganzzahligen Feld (z. B. ein ID-Wert) kann mithilfe eines Werts behandelt werden, der in den Daten niemals vorkommen würde (z. B. -1 für ein ganzzahliges IDENTITY-Feld).
• Ein NULL in einem Datumsfeld kann leicht zu Komplikationen bei der Datumsberechnung führen. In einer Logik, die Datumsunterschiede berechnet, z. B. die Differenz in Tagen zwischen einem [Wiederherstellungsdatum] und einem [OnsetDate], wird die Logik beispielsweise gesprengt, wenn eines oder beide Daten NULL sind - es sei denn, beide Daten werden explizit berücksichtigt NULL sein. Das ist zusätzliche Arbeit und zusätzliche Handhabung. Wenn für [RecoveryDate] und [OnsetDate] "Standard-" oder "Platzhalter" -Daten verwendet werden (z. B. "01.01.1900"), zeigen mathematische Berechnungen möglicherweise "ungewöhnliche" Werte an - die Datumslogik wird jedoch nicht angezeigt.
NULL-Handling ist traditionell ein Bereich, in dem Entwickler Fehler in gespeicherten Prozeduren machen.
In meinen 15 Jahren als DBA habe ich es am besten gefunden, NULL-Werte nach Möglichkeit zu vermeiden.
Dies scheint die meist negative Reaktion auf diese Frage zu bestätigen. Anstatt einen akzeptierten 6NF-Ansatz zum Entwerfen von NULL-Werten anzuwenden, werden spezielle Werte verwendet, um "NULL-Werte nach Möglichkeit zu vermeiden". Ich habe diese Frage offen gestellt und bin froh, dass ich mehr über die Debatte "NULLs sind nützlich / NULLs sind böse" erfahren habe, aber ich bin jetzt ziemlich zufrieden damit, den Ansatz der "besonderen Werte" als völligen Unsinn zu bezeichnen.
Eine leere Zeichenfolge (Länge Null) liefert genau die gleichen Informationen.
Nein, das tut es nicht. In der vorhandenen Datenbank, die wir ändern, bedeutet NULL "nie eingegeben" und leere Zeichenfolge "als leer eingegeben".
NULL-Handling ist traditionell ein Bereich, in dem Entwickler Fehler in gespeicherten Prozeduren machen.
Ja, aber diese Fehler wurden tausende Male von Tausenden von Entwicklern gemacht, und die Lehren und Vorbehalte zur Vermeidung dieser Fehler sind bekannt und dokumentiert. Wie hier erwähnt: Unabhängig davon, ob Sie NULL-Werte akzeptieren oder ablehnen, ist die Darstellung fehlender Werte ein gelöstes Problem . Es ist nicht erforderlich, eine neue Lösung zu erfinden, nur weil Entwickler weiterhin leicht zu überwindende (und leicht zu identifizierende) Fehler machen.
Als Fußnote: Ich bin seit mehr als 20 Jahren DBE und Entwickler (was sicherlich genug Zeit ist, um den Unterschied zwischen einem Datenbankingenieur und einem Datenbankadministrator zu erkennen). Während meiner Karriere war ich immer im Camp "NULLs sind nützlich", obwohl mir bewusst war, dass einige sehr kluge Leute anderer Meinung waren. Ich war äußerst skeptisch gegenüber dem Ansatz der "besonderen Werte", aber nicht gut genug mit den Wissenschaftlern von "Wie man NULL auf die richtige Weise vermeidet" vertraut, um einen festen Standpunkt zu vertreten. Ich liebe es immer, neue Dinge zu lernen - und ich habe nach 20 Jahren noch viel zu lernen. Vielen Dank an alle, die dazu beigetragen haben, dass dies eine nützliche Diskussion wurde.