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?Es spricht nichts dagegen, NULL für Datenfelder zu verwenden. Sie müssen jedoch vorsichtig sein, wenn Sie Schlüssel auf Null setzen. Primärschlüssel sollten niemals NULL sein. Fremdschlüssel können Null sein, aber Sie müssen aufpassen, dass Sie keine verwaisten Datensätze erzeugen.
Wenn etwas "nicht vorhanden" ist, sollten Sie NULL anstelle eines leeren Strings oder einer anderen Art von Flagge verwenden.
Anstatt all die Probleme mit NULL und tristate vs. boolean Logik etc. aufzuschreiben. - werde ich diesen prägnanten Ratschlag geben:
-
Lassen Sie NULL in Ihren Spalten nicht zu, bis Sie einen magischen Wert hinzufügen, um fehlende oder unvollständige Daten darzustellen.
-
Da Sie diese Frage stellen, sollten Sie sehr Vorsicht bei der Annäherung an NULL. Es gibt eine Menge nicht offensichtlicher Fallstricke. Im Zweifelsfall sollten Sie NULL nicht verwenden.
Es gibt eine weitere Alternative zur Verwendung von "N/A" oder "N/K" oder der leeren Zeichenfolge - eine separate Tabelle.
Zum Beispiel, ob wir die Telefonnummer eines Kunden kennen oder nicht:
CREATE TABLE Customer (ID int PRIMARY KEY, Name varchar(100) NOT NULL, Address varchar(200) NOT NULL);
CREATE TABLE CustomerPhone (ID int PRIMARY KEY, Phone varchar(20) NOT NULL, CONSTRAINT FK_CustomerPhone_Customer FOREIGN KEY (ID) REFERENCES Customer (ID));
Wenn wir die Telefonnummer nicht kennen, fügen wir einfach keine Zeile in die zweite Tabelle ein.
Unterschätzen Sie nicht die Komplexität, die Sie schaffen, indem Sie ein Feld NULLbar machen. Die folgende Where-Klausel sieht zum Beispiel so aus, als würde sie mit allen Zeilen übereinstimmen (Bits können nur 1 oder 0 sein, richtig?)
where bitfield in (1,0)
Wenn das Bitfeld jedoch NULL-wertig ist, werden einige Daten nicht erfasst. Oder nehmen Sie die folgende Abfrage:
select * from mytable
where id not in (select id from excludetable)
Wenn nun die Ausschlusstabelle eine Null und eine 1 enthält, bedeutet dies, dass:
select * from mytable
where id <> NULL and id <> 1
Aber "id <> NULL" ist für jeden Wert von id falsch, so dass dies nie eine Zeile zurückgeben wird. Dies überrascht selbst erfahrene Datenbankentwickler.
Da die meisten Menschen von NULL überrascht werden können, versuche ich, sie zu vermeiden, wenn ich kann.
Ich würde sagen, dass Nullen auf jeden Fall verwendet werden sollten. Es gibt keinen anderen richtigen Weg, um fehlende Daten darzustellen. Es wäre zum Beispiel falsch, eine leere Zeichenkette zu verwenden, um eine fehlende Adresszeile darzustellen, oder es wäre falsch, 0 zu verwenden, um ein fehlendes Altersdatenelement darzustellen. Denn sowohl eine leere Zeichenfolge als auch 0 sind Daten. Null ist der beste Weg, um ein solches Szenario darzustellen.
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.