it-swarm.com.de

SQL: Verwenden von NULL-Werten im Vergleich zu Standardwerten

Was sind die pros und cons der Verwendung vonNULL-Wertenin SQL im Gegensatz zuStandardwerten?

PS. Viele ähnliche Fragen wurden hier gestellt, aber keine Antwort auf meine Frage.

38
Registered User

Ein NULL-Wert in Datenbanken ist ein System Wert, der ein Byte von .__ belegt. Speicher und zeigt an, dass ein Wert .__ ist. nicht vorhanden im Gegensatz zu einem Leerzeichen oder Null oder ein anderer Standardwert. Das Feld in einer Datenbank, die das .__ enthält. NULL-Wert bedeutet, dass der Inhalt von Diese Zelle ist zum Zeitpunkt von .__ unbekannt. Es anschauen. Eine Spalte, die .__ erlaubt. Bei NULL-Werten können Zeilen auch .__ sein. mit keinerlei Werten darin eingefügt Säule. Es gibt mehrere Profis und Nachteile der Verwendung von NULL-Werten im Gegensatz zu zu den Standardwerten: 

Pros

Der NULL-Wert enthält keine Daten Typ, kann daher in eine beliebige .__ eingefügt werden. Datenstruktur und eine beliebige Datenbank Säule. Standardwerte auf der anderen Seite Hand, müssen ihren Datentyp haben angegeben und ein Standardwert in einem Die Spalte kann in einer anderen .__-Datei gleich aussehen. Spalte, aber es könnte eine andere .__ sein. Art. 

NULL wird häufig in Schemata verwendet, in denen ein Wert ist optional. Es ist eine bequeme Methode zum Auslassen der Dateneingabe für unbekannte Felder ohne zusätzliche Regeln implementieren, wie Negative Werte in einer Ganzzahl speichern Feld, um ausgelassene Daten darzustellen.

Da der NULL-Wert nur 1 .__ beansprucht. Etwas Speicherplatz können sie .__ sein. nützlich bei der optimierung der datenbank . Die Verwendung dieser Werte ist viel mehr effizienter als Standardwerte, z. B. . 8 Bits und Ganzzahlen des Zeichens 16 Bit.

Während Ihre Systemanforderungen können Ändern Sie im Laufe der Zeit und den Standardwert Typen mit ihnen, NULL-Wert ist immer NULL, sodass keine Aktualisierung von .__ erforderlich ist. Art der Daten.

Zuweisen von Tabellenschemas nicht NULL kann auch bei der Tabellenvalidierung helfen, in einem gewissen Sinn, dass die Spalte mit Not Null-Kriterien erfordern einen Wert für eingefügt werden. Standardwerte sind nicht haben diese Fähigkeiten.

Cons

NULL-Werte können leicht mit .__ verwechselt werden. leere Zeichenketten, die .__ zurückgeben. ein leerer Wert für den Benutzer, wenn ausgewählt. In diesem Sinne der Standardwert Werte sind weniger verwirrend und sind die sicherere Option, sofern nicht der Standardwert wird auf die leere Zeichenfolge gesetzt. 

Wenn NULL-Werte in der .__ zulässig sind. Datenbank können sie den Designer etwas mehr Zeit und Arbeit, wie sie können machen Sie die Datenbanklogik mehr kompliziert, vor allem wenn viele Vergleiche mit Nullwerten in Platz.

Quelle: Vor- und Nachteile

38
R van Rijn

Ich weiß nicht, warum Sie versuchen, diese Fälle mit Fällen zu vergleichen. null bedeutet, dass eine Spalte leer ist/keinen Wert hat, während der Standardwert einer Spalte einen Wert angibt, wenn wir sie nicht direkt in der Abfrage festlegen.

Vielleicht ist ein Beispiel eine bessere Erklärung. Nehmen wir an, wir haben eine member-Tabelle. Jedes Mitglied hat eine ID und einen Benutzernamen. Optional hat er möglicherweise eine E-Mail-Adresse (muss aber nicht). Außerdem hat jedes Mitglied eine postCount-Spalte (die jedes Mal erhöht wird, wenn der Benutzer einen Beitrag schreibt). Die E-Mail-Spalte kann also einen null-Wert haben (weil E-Mail optional ist), während die postCount-Spalte NOT NULL ist, jedoch den Standardwert 0 (da beim Erstellen eines neuen Mitglieds keine Beiträge vorhanden sind).

17
Crozin

Nullwerte sind keine ... Werte! 

Null bedeutet 'hat keinen Wert' ... Neben dem Datenbankaspekt besteht eine wichtige Dimension von nicht bewerteten Variablen oder Feldern darin, dass beim Vergleich von Variablen nicht '=' (oder '>', '<') verwendet werden kann. 

Etwas schreiben wie (VB):

if myFirstValue = mySecondValue

gibt weder True noch False zurück, wenn eine oder beide Variablen keinen Wert haben. Sie müssen einen "Turnaround" verwenden, wie:

if (isnull(myFirstValue) and isNull(mySecondValue)) or myFirstValue = mySecondValue

Der "übliche" Code, der unter solchen Umständen verwendet wird, lautet

if Nz(myFirstValue) = Nz(mySecondValue, defaultValue)

Ist nicht genau richtig, da nicht bewertete Variablen als gleichwertig mit dem Wert von "defaultValue" (normalerweise mit einer Länge von null) betrachtet werden. 

Trotz dieses unangenehmen Verhaltens schalten Sie niemals niemals / Ihre Standardwerte ohne einen wertvollen Grund in eine Zeichenfolge der Länge Null (oder '0') ein, und der Vergleich von Werten im Code ist kein wertvoller Grund.

10

NULL-Werte bedeuten, dass das Attribut entweder nicht anwendbar oder unbekannt ist. Es wird um Religionskriege gekämpft, ob es eine gute oder eine schlechte Sache ist, aber ich stürze in das "gute Ding" -Lager.

Sie sind oft notwendig, um bekannte Werte von unbekannten Werten in vielen Situationen zu unterscheiden, und sie machen einen Sentinel-Wert für die Attribute überflüssig, die keinen geeigneten Standardwert haben.

Während der Standardwert für ein Bankguthaben beispielsweise Null sein kann, wie lautet der Standardwert für eine Mobiltelefonnummer. Möglicherweise müssen Sie zwischen "Kunde hat kein Mobiltelefon" und "Mobiltelefonnummer des Kunden ist (noch) nicht bekannt" unterscheiden. In diesem Fall ist eine leere Spalte nicht geeignet (und es muss eine zusätzliche Spalte vorhanden sein, um zu entscheiden, ob diese Spalte eine oder die Spalte ist) andere ist keine gute Idee).

Standardwerte sind einfach das, was das DBMS in eine Spalte schreibt, wenn Sie es nicht explizit angeben.

5
paxdiablo

Für mich sind sie etwas orthogonal. 

Mithilfe von Standardwerten können Sie Ihr Datenbankschema auf elegante Weise weiterentwickeln (denken Sie beim Hinzufügen von Spalten), ohne den Clientcode ändern zu müssen. Außerdem sparen sie etwas Tipparbeit, aber die Verwendung von Standardwerten ist IMO schlecht.

Nullen sind genau das: nulls. Fehlender Wert und ein großer PITA beim Umgang mit Dreiwertlogik .

4
Anton Gogolev

Wie bei vielen Dingen gibt es gute und schlechte Punkte.

Gute Punkte zu Standardwerten: Sie geben Ihnen die Möglichkeit, eine Spalte auf einen bekannten Wert festzulegen, wenn kein anderer Wert angegeben wird. Wenn Sie beispielsweise BOOLEAN-Spalten erstellen, gebe ich der Spalte normalerweise einen Standardwert (TRUE oder FALSE, je nachdem, was angemessen ist) und mache die Spalte NICHT NULL. Auf diese Weise kann ich sicher sein, dass die Kolumne einen Wert hat und angemessen gesetzt wird.

Schlechte Punkte bei Standardwerten: Nicht alles hat einen Standardwert.

Das Gute an NULLs: Nicht alles hat zu jeder Zeit einen bekannten Wert. Wenn Sie beispielsweise eine neue Zeile erstellen, die eine Person darstellt, habe ich möglicherweise keine Werte für alle Spalten. Angenommen, ich kenne ihren Namen, aber nicht ihr Geburtsdatum. Es ist nicht angebracht, einen Standardwert für das Geburtsdatum einzugeben. Die Leute bekommen Geburtstagskarten am 1. Januar (wenn dies der Standard ist) nicht gern, wenn sie am 22. Juli tatsächlich Geburtstag haben.

Schlechte Dinge über NULLs: NULLs erfordern einen sorgfältigen Umgang. In den meisten Datenbanken, die auf dem relationalen Modell basieren, sind NULL-Werte normalerweise giftig - das Vorhandensein einer NULL in einer Berechnung führt dazu, dass das Ergebnis der Berechnung NULL ist. In Vergleichen verwendete NULL-Werte können auch zu unerwarteten Ergebnissen führen, da jeder Vergleich mit NULL UNKNOWN zurückgibt (was weder WAHR noch FALSCH ist). Betrachten Sie zum Beispiel das folgende PL/SQL-Skript:

declare 
  nValue NUMBER;
begin
  IF nValue > 0 THEN
    dbms_output.put_line('nValue > 0');
  ELSE
    dbms_output.put_line('nValue <= 0');
  END IF;

  IF nValue <= 0 THEN
    dbms_output.put_line('nValue <= 0');
  ELSE
    dbms_output.put_line('nValue > 0');
  END IF;
end;

Die Ausgabe des obigen ist:

nValue <= 0
nValue > 0

Dies kann ein wenig überraschend sein. Sie haben eine NUMMER (nValue), die mindestens gemäß diesem Code sowohl kleiner als auch gleich Null und größer als Null ist. Der Grund dafür ist, dass nValue tatsächlich NULL ist und alle Vergleiche mit NULL zu UNKNOWN anstelle von TRUE oder FALSE führen. Dies kann zu subtilen Fehlern führen, die schwer zu erkennen sind.

Teile und genieße.

4
Bob Jarvis

Das hängt von der Situation ab, ist aber letztendlich einfach. Welcher ist der Wahrheit näher?

Viele Leute behandeln Daten so, als wären es nur Daten, und die Wahrheit spielt keine Rolle. Wenn Sie jedoch mit den Stakeholdern der Daten sprechen, stellen Sie fest, dass die Wahrheit immer von Bedeutung ist. manchmal mehr, manchmal weniger, aber es ist immer wichtig.

Ein Standardwert ist nützlich, wenn Sie annehmen, dass der Wert der Standardwert gewesen wäre, wenn der Benutzer (oder eine andere Datenquelle) einen Wert angegeben hätte. Wenn diese Vermutung mehr schadet als nützt, ist NULL besser, auch wenn der Umgang mit NULL ein Schmerz in SQL ist.

Beachten Sie, dass es drei verschiedene Möglichkeiten gibt, Standardwerte zu implementieren. Zuerst in der Anwendung, bevor Sie neue Daten einfügen. Die Datenbank erkennt nie den Unterschied zwischen einem vom Benutzer bereitgestellten Standardwert oder einem von der App bereitgestellten Wert! 

Zweitens, indem Sie einen Standardwert für die Spalte angeben und die Daten in einer Einfügung fehlen lassen.

Drittens durch Ersetzen des Standardwerts zum Abrufzeitpunkt, wenn eine NULL erkannt wird. Nur wenige DBMS-Produkte erlauben die Deklaration dieses dritten Modus in der Datenbank.

In einer idealen Welt fehlen Daten niemals. Wenn Sie für die reale Welt entwickeln, werden die erforderlichen Daten eventuell fehlen. Ihre Anwendungen können entweder etwas Sinnvolles tun oder etwas, das in diesem Fall keinen Sinn ergibt.

4
Walter Mitty

Nulls und Standardwerte sind verschiedene Dinge, die für unterschiedliche Zwecke verwendet werden. Wenn Sie versuchen, die Verwendung von nulls zu vermeiden, indem Sie alles mit einem Standardwert versehen, ist dies eine schlechte Praxis, wie ich es erklären werde. 

Null bedeutet, dass wir nicht wissen, was der Wert ist oder sein wird. Angenommen, Sie haben ein enddate-Feld. Sie wissen nicht, wann der Prozess endet, und null ist der einzig geeignete Wert. Die Verwendung eines voreingestellten Wertes eines falschen Datums in der Zukunft verursacht ebenso viele Programmierprobleme wie der Umgang mit der Variablen nulls, und meiner Erfahrung nach ist es wahrscheinlicher, dass ein Problem mit falschen Ergebnissen auftritt.

Nun gibt es Zeiten, in denen wir möglicherweise wissen, welchen Wert dies haben soll, wenn die Person, die den Datensatz einfügt, dies nicht tut. Wenn Sie beispielsweise ein date inserted-Feld haben, ist es angebracht, einen Standardwert für das aktuelle Datum zu haben und nicht zu erwarten, dass der Benutzer dieses Feld ausfüllt. Sie haben wahrscheinlich wahrscheinlich bessere Informationen für dieses Feld. 

Manchmal handelt es sich um ein Urteilsgespräch und hängt von den Geschäftsregeln ab, die Sie anwenden müssen. Angenommen, Sie haben ein speaker honoraria-Feld (was der Preis ist, den ein Sprecher bezahlt bekommen würde). Ein Standardwert von 0 kann gefährlich sein, da dies bedeuten könnte, dass Sprecher eingestellt werden und wir beabsichtigen, ihnen nichts zu zahlen. Es ist auch möglich, dass es gelegentlich Sprecher gibt, die ihre Zeit für ein bestimmtes Projekt spenden (oder Mitarbeiter des Unternehmens sind und daher nicht extra dafür bezahlt werden), wobei Null ein korrekter Wert ist, so dass Sie keine Null verwenden können der Wert, um festzustellen, dass Sie nicht wissen, wie viel dieser Sprecher bezahlt werden soll. In diesem Fall ist Null der einzig geeignete Wert und der Code sollte ein Problem auslösen, wenn jemand versucht, den Sprecher einer Konferenz hinzuzufügen. In einer anderen Situation wissen Sie möglicherweise bereits, dass mindestens 3000 Sprecher bezahlt werden und dass nur Sprecher, die einen anderen Tarif ausgehandelt haben, Daten in das Feld honoraria eingeben. In diesem Fall ist es sinnvoll, den Standardwert 3000 einzugeben. In anderen Fällen können unterschiedliche Clients unterschiedliche Mindestwerte aufweisen. Daher sollte der Standardwert anders gehandhabt werden (normalerweise durch eine Nachschlagetabelle, die automatisch den Mindestwert honoraria für diesen Client im Dateneingabeformular auffüllt).

Ich denke, die beste Regel ist, den Wert als null zu belassen, wenn Sie zum Zeitpunkt der Dateneingabe wirklich nicht wissen können, welchen Wert das Feld haben soll. Verwenden Sie nur einen Standardwert, der für die jeweilige Situation immer von Bedeutung ist, und verwenden Sie eine andere Methode, um den Wert einzugeben, wenn er unter verschiedenen Umständen anders sein kann.

3
HLGEM

In einem Data Warehouse möchten Sie immer Standardwerte anstelle von NULL-Werten haben.

Stattdessen hätten Sie einen Wert wie "unbekannt", "nicht bereit", "fehlend".

Dadurch können INNER JOINs effizient in den Fakt- und Dimensionstabellen ausgeführt werden, da "alles immer einen Wert hat".

3
adolf garlic

Wie bereits erwähnt, ist NULL kein Wert.

Seien Sie sehr vorsichtig mit allem, was von jemandem verkündet wird, der von "dem NULL-Wert" spricht, als ob es ein Wert wäre.

NULL ist sich nicht gleich. x = y ergibt false, wenn sowohl x als auch y NULL sind. x = y ergibt true, wenn sowohl x als auch y der Standardwert sind.

Dieser scheinbar sehr einfache Unterschied hat fast endlose Konsequenzen. Und die meisten dieser Konsequenzen sind Sprengfallen, die Sie wirklich beißen.

1
Erwin Smout

Zwei sehr gute Access-Artikel über Nulls von Allen Browne:

Aspekte der Arbeit mit Nullen in VBA-Code:

Die Artikel sind Access-orientiert, können jedoch für Benutzer von Datenbanken nützlich sein, insbesondere für Neulinge aufgrund des Konversationsstils der Schrift.

0
David-W-Fenton

Ich schätze die ganze Diskussion sehr. Ich bin gerade dabei, ein Data Warehouse zu bauen, und benutze das Kimball-Modell ziemlich streng. Es gibt jedoch einen sehr lautstarken Benutzer, der Ersatzschlüssel hasst und NULLs überall haben möchte. Ich habe ihm gesagt, dass es in Ordnung ist, NULL-fähige Spalten für Attribute von Dimensionen und für Datumsangaben oder Zahlen zu haben, die in Berechnungen verwendet werden, da Standardwerte falsche Daten enthalten. Ich bin damit einverstanden, dass das Zulassen von NULL in bestimmten Spalten Vorteile bringt, aber das Cubing ist viel besser und zuverlässiger, wenn für jeden Fremdschlüssel einer Dimension ein Ersatzschlüssel vorhanden ist, selbst wenn dieser Ersatzwert für einen Dummy-Datensatz -1 oder 0 ist . SQL mag Ganzzahlen für Joins. Wenn ein Dimensionswert fehlt und ein Dummy als Ersatzschlüssel bereitgestellt wird, erhalten Sie dieselbe Anzahl von Datensätzen mit einer Dimension, als würden Sie mit einer anderen Dimension Cubing durchführen. Berechnungen müssen jedoch korrekt ausgeführt werden und Sie müssen NULL-Werte in diesen berücksichtigen. Der Geburtstag sollte NULL sein, damit zum Beispiel das Alter nicht berechnet wird. Ich glaube an eine gute Datenverwaltung und diese Entscheidungen mit den Benutzern zu treffen, zwingt sie dazu, mehr als je zuvor über ihre Daten nachzudenken. 

0
Diana Bodell

NULL-Werte NIEMALS Speicherplatz in DB2 für OS/390 und z/OS einsparen. Jede nullfähige Spalte erfordert ein zusätzliches Byte Speicher für das Nullkennzeichen. Eine CHAR (10) -Spalte, die nullfähig ist, erfordert also 11 Byte Speicherplatz pro Zeile - 10 für die Daten und 1 für den Null-Indikator. Dies ist unabhängig davon, ob die Spalte auf Null gesetzt ist oder nicht.

DB2 für Linux, Unix und Windows verfügt über eine Komprimierungsoption, mit der Spalten auf null gesetzt werden können, um Platz zu sparen. Bei Verwendung dieser Option entfernt DB2 den ungenutzten Speicherplatz aus einer Zeile, in der Spalten auf Null gesetzt sind. Diese Option ist auf dem Mainframe jedoch nicht verfügbar.

REF: http://www.craigsmullins.com/bp7.htm

Daher ist die beste Modellierungspraxis für DB2 Z/OS die Verwendung von "NOT NULL WITH DEFAULT" als Standard für alle Spalten. Es ist dasselbe in einigen großen Geschäften, die ich kannte. Erleichtert die Lebensdauer von Programmierern, da der Nullindikator nicht verarbeitet werden muss. Außerdem wird Speicherplatz gespart, da kein zusätzliches Byte für den NULL-Indikator verwendet werden muss.

0
Prasad Alla