NULL – Fluch oder Segen?

Neulich war es wieder so weit. Ich habe zugelassen, nein sogar vorgesehen, dass NULL in die Datenbank eines Auftraggebers geschrieben wurde. NULL ist ein symbolischer Wert, der in SQL-Datenbanken und Programmiersprachen das NICHTS, die LEERE verkörpert, also quasi das Fehlen eines konkreten Werts. Nicht zu verwechseln mit der Zahl oder Ziffer 0.

Das kam nicht gut an. Mein Auftraggeber lehnt NULL in seiner Datenbank grundsätzlich ab, und mit dieser Meinung steht er nicht alleine da. Warum? Weil NULL immer besondere Beachtung verlangt. Ich will es hier nicht zu kompliziert machen, deshalb fasse ich es so zusammen: Wenn man NULL in einem Programm keine ausreichende Beachtung schenkt, kann es zu Laufzeitfehlern kommen. Operationen, die mit „normalen“ Werten wie Zahlen oder Zeichenketten wunderbar funktionieren, scheitern plötzlich, weil man mit NULL nicht rechnen und vergleichen kann. Um das zu verhindern, gibt es in SQL spezielle Funktionen, die mit NULL umgehen können wie z.B. COALESCE, ISNULL oder NVL. In Programmiersprachen wie C# haben wir u.a. NULL-tolerante Operatoren.

Sollte man auf NULL verzichten?

Ist es deshalb tatsächlich besser, auf NULL zu verzichten? Ich denke nein. Mache ich das und initialisiere stattdessen Felder bzw. Variablen mit einem anderen Wert wie z.B. der Zahl 0 und interpretiere diese dann als Indiz für „Leere“ oder „Nichts“, bekomme ich spätestens dann Probleme, wenn 0 auch als normaler zulässiger Wert vorkommen kann. Simples Beispiel: Prüfung des Lagerbestands im Rahmen einer Inventur. Wir benötigen hierzu einen Ist-Lagerbestand und einen Soll-Lagerbestand. Der Ist-Lagerbestand könnte natürlich 0 sein. Der Soll-Lagerbestand könnte auch 0 sein. Oder wurde einer der beiden Lagerbestände einfach noch nicht ermittelt und steht deswegen noch auf dem Initialwert 0? Meine Meinung: Das Leben wird NICHT leichter, wenn man auf NULL-Werte verzichtet. Um das Rätselraten um die Bedeutung der Zahl 0 im jeweiligen Kontext zu beenden, könnte man versucht sein, symbolische Sonderwerte wie -999999 zu kreieren, die den Zustand „noch nicht ermittelt“ symbolisieren. Man könnte auch ein zweites Feld / eine zweite Variable verwenden, um Status und Inhalt zu trennen. Aber steht der Initalwert 0 im Statusfeld dann für „Status noch nicht festgelegt“, also keinen Status? Oder ist 0 schon der Status für „Lagerbestand noch nicht ermittelt“? …

NULL ist ein wertvolles Konzept, das ich nicht missen möchte

Das macht das Leben aber wahrlich nicht einfacher. In diesem Szenario muss man zusätzlichen Aufwand betreiben, um die Bedeutung von Werten zu verwalten und damit umzugehen. Das hat einen wesentlichen Nachteil: NULL ist Standard und jede:r Entwickler:in versteht sofort, was NULL bedeutet. Definiere ich die Semantik von NICHTS mit anderen Mitteln, kann dies zu einem höheren Aufwand für Dokumentation, Fehlersuche, Einarbeitung weiterer Entwickler usw. führen.

Ich mag NULL.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Scroll to Top