82 Stimmen

Sind Nullen in einer relationalen Datenbank in Ordnung?

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.

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.

18voto

Ken Punkte 2064

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.

14voto

Mark Brackett Punkte 83046

Anstatt all die Probleme mit NULL und tristate vs. boolean Logik etc. aufzuschreiben. - werde ich diesen prägnanten Ratschlag geben:

  1. Lassen Sie NULL in Ihren Spalten nicht zu, bis Sie einen magischen Wert hinzufügen, um fehlende oder unvollständige Daten darzustellen.

  2. 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.

9voto

finnw Punkte 46519

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.

8voto

Andomar Punkte 224164

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.

7voto

Vaibhav Punkte 11143

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X