Es gibt eine Denkschule, die besagt, dass Nullwerte in einer relationalen Datenbank nicht erlaubt sein sollten. Das heißt, das Attribut (die Spalte) einer Tabelle sollte keine Nullwerte zulassen. Da ich aus dem Bereich der Softwareentwicklung komme, verstehe ich das nicht. Es scheint so, als ob der Wert Null im Kontext des Attributs gültig ist und daher erlaubt sein sollte. Dies ist in Java sehr üblich, wo Objektreferenzen oft null sind. Da ich keine umfassende Erfahrung mit Datenbanken habe, frage ich mich, ob ich hier etwas übersehe.
Antworten
Zu viele Anzeigen?Das ist ein riesiger Wurmfortsatz, denn NULL kann so viele Dinge bedeuten:
- Kein Sterbedatum, da die Person noch lebt.
- Keine Handynummer, weil wir nicht wissen, wie sie lautet oder ob sie überhaupt existiert.
- Keine Sozialversicherungsnummer, da die Person bekanntermaßen keine hat.
Einige davon können durch Normalisierung vermieden werden, andere durch das Vorhandensein eines Wertes in dieser Spalte ("N/A"), wieder andere durch eine separate Spalte, die das Vorhandensein von NULL erklärt ("N/K", "N/A" usw.).
Es ist auch ein Wermutstropfen, denn die SQL-Syntax, die zum Auffinden dieser Werte erforderlich ist, unterscheidet sich von derjenigen für Nicht-Null-Werte, es ist schwierig, sie zu verknüpfen, und sie werden im Allgemeinen nicht in Indexeinträge aufgenommen.
Aus dem erstgenannten Grund werden Sie Fälle finden, in denen eine Null unvermeidbar ist.
Aus dem letztgenannten Grund sollten Sie dennoch Ihr Bestes tun, um die Anzahl der Einträge zu minimieren.
Unabhängig davon sollten Sie immer NOT NULL-Beschränkungen verwenden, um sich vor Nullen zu schützen, wenn ein Wert erforderlich ist.
Das Hauptproblem bei Nullen ist, dass sie eine spezielle Semantik haben, die bei Vergleichen, Aggregaten und Joins zu unerwarteten Ergebnissen führen kann.
-
Nichts ist jemals gleich null, und nichts ist jemals nicht gleich, größer oder kleiner als null, also müssen Sie nulls auf einen Platzhalterwert setzen, wenn Sie einen Massenvergleich durchführen wollen.
-
Dies ist auch ein Problem bei zusammengesetzten Schlüsseln, die in einer Verknüpfung verwendet werden können. Wenn der natürliche Schlüssel eine löschbare Spalte enthält, sollten Sie die Verwendung eines synthetischen Schlüssels in Betracht ziehen.
-
Nullen können aus der Zählung herausfallen, was vielleicht nicht der gewünschten Semantik entspricht.
-
Nullen in einer Spalte, mit der Sie verknüpfen können, eliminieren Zeilen aus einer inneren Verknüpfung. Im Allgemeinen ist dieses Verhalten wahrscheinlich erwünscht, aber es kann für Leute, die Berichte erstellen, Elefantenfallen darstellen.
Es gibt noch eine ganze Reihe anderer Feinheiten bei Nullen. Joe Celko's SQL für Smarties hat ein ganzes Kapitel zu diesem Thema und ist ein gutes Buch, das man auf jeden Fall lesen sollte. Einige Beispiele für Stellen, an denen Nullen eine gute Lösung sind, sind:
-
Optionale Beziehungen, bei denen eine verbundene Einheit vorhanden sein kann oder nicht. Null ist die einzige Möglichkeit zur Darstellung einer optionalen Beziehung in einer Fremdschlüsselspalte.
-
Spalten, die Sie möglicherweise verwenden möchten, um aus den Zählungen herauszufallen.
-
Optionale numerische Werte (z. B. Währung), die vorhanden oder nicht vorhanden sein können. In Zahlensystemen gibt es keinen effektiven Platzhalterwert für "nicht erfasst" (insbesondere dort, wo Null ein zulässiger Wert ist), daher ist null wirklich die einzige gute Möglichkeit, dies zu tun.
Einige Beispiele für Stellen, an denen Sie die Verwendung von Nullen vermeiden sollten, weil sie wahrscheinlich subtile Fehler verursachen.
-
Nicht erfasste" Werte auf Codefeldern mit einem FK gegen eine Referenztabelle. Verwenden Sie einen Platzhalterwert, damit Sie (oder ein zufälliger Wirtschaftsanalytiker) bei einer Abfrage in der Datenbank nicht versehentlich Zeilen aus den Ergebnismengen entfernen.
-
Beschreibungsfelder, in die nichts eingegeben wurde - Null-String (
''
) funktioniert gut für diesen Zweck. Dies erspart es, die Nullen als Sonderfall zu behandeln. -
Optionale Spalten in einem Berichts- oder Data-Warehouse-System. Erstellen Sie in diesem Fall eine Platzhalterzeile für "Nicht erfasst" in der Dimension und verknüpfen Sie sie mit dieser. Dies vereinfacht die Abfrage und lässt sich gut mit Ad-hoc-Berichtstools kombinieren.
Auch hier ist das Buch von Celko eine gute Abhandlung des Themas.
Das Beste, was man über Normalformulare wissen sollte, ist, dass sie ein Leitfaden sind und dass man sich nicht stur an sie halten sollte. Wenn die akademische Welt mit der realen Welt kollidiert, gibt es selten viele überlebende Krieger der Akedemie.
Die Antwort auf diese Frage ist, dass es in Ordnung ist, Nullen zu verwenden. Beurteilen Sie einfach Ihre Situation und entscheiden Sie, ob sie in der Tabelle angezeigt werden sollen oder ob Sie die Daten in einer anderen Bezugstabelle zusammenfassen wollen, wenn Sie das Gefühl haben, dass das Verhältnis von Nullwerten zu tatsächlichen Werten zu hoch ist.
Wie ein Freund zu sagen pflegt: "Lass das Perfekte nicht der Feind des Guten sein". Ich glaube, Voltaire hat das auch gesagt. 8)
Nach der strengen relationalen Algebra sind Nullen nicht erforderlich. Für jedes praktische Projekt werden sie jedoch benötigt.
Erstens sind viele reale Daten unbekannt oder nicht anwendbar und Nullen setzen dieses Verhalten gut um. Zweitens machen sie Ansichten und äußere Verknüpfungen viel praktischer.
Bei schrittweisen Datenerfassungssystemen werden Sie feststellen, dass Sie Nullen in einer Datenbank nicht vermeiden können, da die Reihenfolge der Fragen bzw. der Datenerfassung nur selten dem logischen Datenmodell entspricht.
Oder Sie können die Werte voreinstellen (und benötigen Code, um diese Standardwerte zu verarbeiten). Sie können zum Beispiel davon ausgehen, dass alle Strings in Ihrem Modell leer sind und nicht null.
Oder Sie können Staging-Datenbanktabellen für die Datenerfassung einrichten, die so lange bestehen bleiben, bis alle Daten erfasst sind, bevor Sie die eigentlichen Datenbanktabellen auffüllen. Das ist eine Menge zusätzlicher Arbeit.
0 Stimmen
Technisch gesehen ist null in der DBMS-Sprache kein Wert, sondern ein fehlender Wert, z. B. unbekannt
26 Stimmen
Es gibt eine Denkschule, die besagt, dass auch Schemata vollständig normalisiert werden sollten. Beide Schulen haben es nie in die reale Welt geschafft :)
0 Stimmen
Wenn wir NULL nicht verwenden sollten, warum sollten RDBMSs uns dann überhaupt die Verwendung von NULL erlauben? An NULL ist nichts auszusetzen, solange man weiß, wie man damit umzugehen hat. Separate Tabellen zu erstellen, um Spalten mit Nullwerten in jedem Szenario zu speichern, ist übermäßig irreführend.
3 Stimmen
Nullen sind ein Artefakt der Impedanz zwischen RDBMS und der Realität. Sie sind ein massiver systemischer Hack zur Überwindung dieser Impedanz. Die Lösung besteht nicht darin, Nullen abzuschaffen, das ist im Kontext von RDBMS nicht praktikabel. Die Lösung sind neue Arten von Datenbanken.
0 Stimmen
Die Impedanz besteht in der Tat zwischen dem Caos (der Realität) und dem menschlichen Drang zur Semantik. Entitäten, Strukturen, Typen oder was auch immer, sie alle sind Gegenstand von Veränderungen. Gehen Sie mit der polymorphen Natur eines jeden Typs um - gehen Sie mit Nullen um.