SQL: leere Zeichenfolge vs NULL-Wert

72

Ich weiß, dass dieses Thema ein bisschen umstritten ist und es gibt viele verschiedene Artikel / Meinungen im Internet. Leider gehen die meisten von ihnen davon aus, dass die Person nicht weiß, was der Unterschied zwischen NULL und einer leeren Zeichenfolge ist. So erzählen sie Geschichten über überraschende Ergebnisse mit Joins / Aggregaten und üben im Allgemeinen etwas fortgeschrittenere SQL-Lektionen. Auf diese Weise verpassen sie absolut den ganzen Punkt und sind daher für mich nutzlos. Hoffentlich werden diese Frage und alle Antworten das Thema etwas vorantreiben.

Nehmen wir an, ich habe eine Tabelle mit persönlichen Informationen (Name, Geburt usw.), in der eine der Spalten eine E-Mail-Adresse mit dem Typ varchar ist. Wir gehen davon aus, dass einige Personen aus irgendeinem Grund möglicherweise keine E-Mail-Adresse angeben möchten. Beim Einfügen solcher Daten (ohne E-Mail) in die Tabelle stehen zwei Optionen zur Verfügung: Setzen Sie die Zelle auf NULL oder setzen Sie sie auf eine leere Zeichenfolge (''). Nehmen wir an, ich kenne alle technischen Auswirkungen der Auswahl einer Lösung gegenüber einer anderen und kann für beide Szenarien korrekte SQL-Abfragen erstellen. Das Problem ist, dass beide Werte, auch wenn sie sich auf technischer Ebene unterscheiden, auf logischer Ebene genau gleich sind. Nachdem ich mir NULL angesehen hatte und zu dem Schluss gekommen bin, dass ich die E-Mail-Adresse des Mannes nicht kenne. Auch egal wie sehr ich es versucht habe, Ich konnte keine E-Mail mit NULL oder einer leeren Zeichenfolge senden, daher stimmen anscheinend die meisten SMTP-Server mit meiner Logik überein. Daher neige ich dazu, NULL zu verwenden, wenn ich den Wert nicht kenne und leere Zeichenfolgen für eine schlechte Sache halte.

Nach einigen intensiven Diskussionen mit Kollegen kam ich mit zwei Fragen:

  1. Bin ich zu Recht davon ausgegangen, dass die Verwendung einer leeren Zeichenfolge für einen unbekannten Wert dazu führt, dass eine Datenbank über die Fakten "lügt"? Genauer gesagt: Wenn ich die Vorstellung von SQL von dem, was Wert ist und was nicht, verwende, könnte ich zu dem Schluss kommen: Wir haben eine E-Mail-Adresse, nur indem wir herausfinden, dass sie nicht null ist. Aber wenn ich später versuche, eine E-Mail zu senden, komme ich zu einem widersprüchlichen Ergebnis: Nein, wir haben keine E-Mail-Adresse, die @! # $ Database muss gelogen haben!

  2. Gibt es ein logisches Szenario, in dem ein leerer String '' ein so guter Träger für wichtige Informationen sein könnte (neben Wert und ohne Wert), dass das Speichern auf andere Weise mühsam / ineffizient wäre (wie bei einer zusätzlichen Spalte). Ich habe viele Posts gesehen, in denen behauptet wurde, dass es manchmal gut ist, leere Zeichenfolgen zusammen mit realen Werten und NULL-Werten zu verwenden, aber bisher kein logisches Szenario (in Bezug auf das SQL / DB-Design) gesehen zu haben.

PS Manche Leute werden versucht sein zu antworten, dass es nur eine Frage des persönlichen Geschmacks ist. Ich stimme nicht zu. Für mich ist es eine Designentscheidung mit wichtigen Konsequenzen. Daher würde ich gerne Antworten sehen, bei denen die Meinung dazu aus logischen und / oder technischen Gründen gestützt wird.

Jacek Prucia
quelle
11
Sind Sie sich bewusst , dass in Oracle, die leere Zeichenfolge ist NULL?
user281377
8
@ammoQ: Oracle behandelt Zeichenfolgen mit einer Länge von null nicht standardmäßig. Außerdem ist ''auch in Oracle nicht das gleiche wie NULL. Wenn Sie beispielsweise eine CHAR(1)Spalte zuweisen , die der Wert ''ergibt ' '(dh ein Leerzeichen), nicht NULL. Außerdem, wenn Jacek Oracle verwendet, würde diese Frage wahrscheinlich nicht einmal auftauchen :-)
Dean Harding
2
Dean: Sie haben Recht mit dem Beispiel char (1), aber das ist noch eine andere WTF, da '' IS NULLsie truein PL / SQL ausgewertet wird .
user281377
"Bin ich zu Recht davon ausgegangen, dass die Verwendung einer leeren Zeichenfolge für einen unbekannten Wert dazu führt, dass eine Datenbank über die Fakten" lügt "?" Wenn es Ihren Geschäftsanwendern egal ist, ob unbekannt oder leer, spielt die Lüge dann überhaupt eine Rolle?
Andy
Wenn Sie eine Zeichenfolge verwenden müssen ... stellen Sie bitte sicher, dass diese leer ist. Lassen Sie eine Zeichenfolge mit einem Leerzeichen nicht für Ihren unbekannten Wert stehen. Ich bitte dich.
Airn5475

Antworten:

83

Ich würde sagen, das NULList die richtige Wahl für "keine E-Mail-Adresse". Es gibt viele "ungültige" E-Mail-Adressen und "" (leere Zeichenfolge) ist nur eine. Zum Beispiel ist "foo" keine gültige E-Mail-Adresse, "a @ b @ c" ist nicht gültig und so weiter. Nur weil "" keine gültige E-Mail-Adresse ist, ist dies kein Grund, sie als Wert für "keine E-Mail-Adresse" zu verwenden.

Ich glaube, Sie haben Recht, wenn Sie sagen, dass "" nicht der richtige Weg ist, um "Ich habe keinen Wert für diese Spalte" zu sagen. "" ist ein Wert.

Ein Beispiel, bei dem "" ein gültiger Wert sein kann, wobei "" der zweite NULLVorname einer Person sein kann. Da nicht jeder einen zweiten Vornamen hat, müssen Sie zwischen "kein zweiter Vorname" ("" - leere Zeichenfolge) und "Ich weiß nicht, ob diese Person einen zweiten Vornamen hat oder nicht" ( NULL) unterscheiden. Es gibt wahrscheinlich viele andere Beispiele, in denen eine leere Zeichenfolge immer noch ein gültiger Wert für eine Spalte ist.

Dean Harding
quelle
5
Stimme voll und ganz zu. NULL gibt es aus einem Grund. SELECT COUNT (*) AUS IHRER TABELLE, WO E-MAIL IST [NOT] NULL ist der Weg, dies zu tun, nicht der Vergleich von Zeichenfolgen, der tendenziell langsamer ist (auch für leere Zeichenfolgen, nehme ich an, aber ich bin nicht sicher, ob dies der Fall ist :).
LudoMC
5
Ich denke, NULLbedeutet nicht, dass es keine E-Mail-Adresse gibt. Ich denke, es bedeutet, dass die E-Mail-Adresse derzeit nicht bekannt ist, nicht bekannt ist oder aus anderen Gründen nicht ausgefüllt werden kann. Glücklicherweise gibt es wahrscheinlich keine Situation, in der man die Informationen über Personen, die wirklich keine E-Mail-Adresse haben und nicht haben möchten, in einer Datenbank speichern möchte, da sonst wahrscheinlich ein separates boolesches Feld erforderlich wäre.
Alexey
9
@Alexey - NULL bedeutet, dass kein Wert vorhanden ist. Wie andere bereits betont haben, ist eine leere Zeichenfolge ein Wert.
Ramhound
3
@ Ramhound, ich bin damit einverstanden, dass die leere Zeichenfolge ein Wert ist, und dass NULL vage "es gibt keinen Wert" bedeutet. Ich habe gerade meine Interpretation von "kein Wert" erklärt. Meiner Meinung nach ist es nicht dasselbe wie "die Person hat kein E-Mail-Konto eröffnet". Es ist eher "keine E-Mail-Adresse für diese Person aufgezeichnet".
Alexey
5
@Ramhound NULL bedeutet, dass es keinen Wert gibt. Eine Person ohne zweiten Vornamen hat dort keinen Wert. Daher sollte NULL auch in einer mittleren anfänglichen Spalte verwendet werden ... Dies steht völlig im Gegensatz zu dem in dieser Antwort dargestellten Argument.
Izkata,
41

Ich stimme den obigen Kommentaren zu, füge aber dieses Argument als Hauptmotivation hinzu:

  1. Für jeden Programmierer, der sich eine Datenbank ansieht, ist es offensichtlich, dass ein mit NULL gekennzeichnetes Feld ein optionales Feld ist. (dh der Datensatz benötigt keine Daten für diese Spalte)
  2. Wenn Sie ein Feld als NICHT NULL markieren, sollte jeder Programmierer intuitiv davon ausgehen, dass es sich um ein erforderliches Feld handelt.
  3. In einem Feld, das Nullen zulässt, sollten Programmierer erwarten, dass Nullen anstelle von leeren Zeichenfolgen angezeigt werden.

Verwenden Sie zur Selbstdokumentation der intuitiven Codierung NULL anstelle von leeren Zeichenfolgen.

colinbashbash
quelle
4
+1 Dies ist das "am wenigsten überraschende" Argument in Bezug auf Entwickler gegen leere Zeichenfolgen. Kein Entwickler, der später kommt, würde jemals erwarten, dass leere Zeichenfolgen verwendet werden, um "keine E-Mail-Adresse" darzustellen.
Thomas
6

In Ihrem Beispiel würde ich eine leere Zeichenfolge verwenden, wenn der Wert direkt aus dem Webfeld stammt. Wenn der Benutzer angeben kann, dass er keine E-Mails bereitstellen oder löschen möchte, dann NULL.

Hier sind Links zu Punkten, die Sie in Betracht ziehen könnten: https://stackoverflow.com/questions/405909/null-vs-empty-when-deal-with-user-input/405945#405945

--- bearbeitet (Antwort auf Thomas Kommentar) ---

Datenbanken leben nicht ohne Anwendungen, die sie verwenden. Die Definition von NULL oder '' hat keinen Wert, wenn die Anwendung sie nicht richtig verwenden kann.

Stellen Sie sich ein Beispiel vor, in dem der Benutzer das LANGE Formular ausfüllt und die Eingabetaste drückt, um eine permanente Anforderung an den Server zu senden. Er könnte gerade dabei sein, seine E-Mail-Adresse einzugeben. Höchstwahrscheinlich möchten Sie alles, was er hat, im E-Mail-Feld speichern, damit er es später fertigstellen kann. Was ist, wenn er nur ein Zeichen eingegeben hat? Was ist, wenn er ein Zeichen eingibt und es dann löscht? Wenn E-Mails nicht benötigt werden, möchten Benutzer sie manchmal löschen. Dies ist der einfachste Weg, um ein Feld zu löschen. Auch für den Fall, dass eine E-Mail nicht benötigt wird, lohnt es sich, diese vor dem Senden zu validieren.

Ein weiteres Beispiel: Benutzer geben eine E-Mail als spamto @ [bigcompany] .com an. In diesem Fall muss keine E-Mail gesendet werden, obwohl sie vorhanden und gültig ist (und möglicherweise sogar vorhanden ist). Das Senden einer solchen E-Mail ist vielleicht billig, aber wenn es 10.000 Benutzer mit solchen E-Mails für tägliche Abonnements gibt, kann eine solche Validierung viel Zeit sparen.

Konstantin Petrukhnov
quelle
7
-1. Ob die Datenbank eine Website steuert oder nicht, ist unerheblich. Das Entwerfen von Datenbanken ist eine andere Welt als das Webdesign. Die Datenbank sollte so konzipiert sein, dass Fakten über die Geschäftsdomäne erfasst werden, unabhängig von der Schnittstelle, die zum Schreiben verwendet wird. Sollten Sie Ihrer Logik nach Nullen verwenden, wenn die erste Anwendung zufällig eine ausführbare Datei ist? Was passiert, wenn die erste App eine Webanwendung ist, die nächste jedoch eine mobile App? Entwerfen Sie die Datenbank, um Fakten mithilfe von Normalisierungsregeln zu erfassen, und entwerfen Sie die Website, um darauf zu schreiben.
Thomas
Ich bin froh, dass Sie gelernt haben, wie man auf dieser Site schreibt und kommentiert :) Ich bin immer noch der Meinung, dass die DB Anwendungen unterstützen sollte, die sie verwenden. Überprüfen Sie meine bearbeitete Antwort.
Konstantin Petrukhnov
4
Datenbanken leben nicht ohne Anwendungen, die sie verwenden. Nach meiner Erfahrung ist dies einfach nicht wahr und kurzsichtig. Fast immer wird die Datenbank außerhalb der Anwendung verwendet, für die sie entworfen wurde. Im Allgemeinen überleben Datenbanken länger als die Anwendungen, für die sie erstellt wurden. Datenbanken sollten so konzipiert sein, dass sie Fakten über das Unternehmen sammeln, und die Benutzeroberfläche sollte so aufgebaut sein, dass sie die Datenbank nicht umgekehrt lesen und in sie schreiben kann. Relationales Design ist eine völlig andere Denkweise als Anwendungsdesign.
Thomas
2
Beispiele, bei denen die Datenbank nicht nur von der ursprünglichen Anwendung verwendet wird: Berichte, Integrationen mit anderen Systemen.
Thomas
1
Wie Thomas angedeutet hat, können und werden DBs häufig von mehr als einer Anwendung verwendet, was der Idee, Ihre DB-Daten sauber zu halten, noch mehr Gewicht verleiht. Wenn Sie in Ihrer Anwendung keine NULL-Werte verwenden möchten oder können, können Sie diese einfach in Ihrer Datenzugriffsebene durch Ihre "magischen Werte" (nette Beschreibung Thomas) ersetzen. Auf diese Weise müssen zukünftige Anwendungen, die auf die Datenbank zugreifen möchten, die magischen Werte der ursprünglichen Anwendungen nicht kennen bzw. diesen entsprechen.
Bendemes
5

Ich denke, Dean Hardings Antwort deckt dies wirklich gut ab. Vor diesem Hintergrund möchte ich erwähnen, dass Sie, wenn Sie auf DB-Ebene über NULLs und leere Strings sprechen, über Ihre anderen Datentypen nachdenken sollten. Würden Sie ein Mindestdatum speichern, wenn kein Datum angegeben ist? oder -1, wenn kein int angegeben wird? Wenn Sie einen Wert speichern, für den Sie keinen Wert haben, müssen Sie eine ganze Reihe von Nicht-Werten nachverfolgen. Mindestens einer für jeden Datentyp (möglicherweise mehr, wenn Sie Fälle erhalten, in denen -1 ein tatsächlicher Wert ist, sodass Sie eine Alternative usw. benötigen). Wenn Sie etwas "Fudgy" auf Anwendungsebene tun müssen / möchten, ist dies eine Sache, aber Sie müssen Ihre Daten nicht verunreinigen.

bendemes
quelle
2
+1 - Das nenne ich die "Magic Value Solution". Wir müssen uns für jeden Datentyp einen magischen Wert ausdenken, um die Abwesenheit eines Wertes darzustellen. Außerdem ist oder wird in einigen Spalten der gemeinsame magische Wert ein legitimer Wert und daher wird ein neuer magischer Wert benötigt.
Thomas
5

Leider hat Oracle die Darstellung des VARCHAR-Strings der Länge Null mit der Darstellung von NULL verwechselt. Sie werden beide intern durch ein einzelnes Byte mit dem Wert Null dargestellt. Dies erschwert die Diskussion um einiges.

Ein Großteil der Verwirrung um NULL dreht sich um dreiwertige Logik . Betrachten Sie den folgenden Pseudocode:

if ZIPCODE = NULL
    print "ZIPCODE is NULL"
else if ZIPCODE <> NULL
    print "ZIPCODE is not NULL"
else print "Something unknown has happened"

Sie würden die dritte Nachricht nicht erwarten, aber das ist, was Sie unter drei bewerteten Logik erhalten würden. Die drei-wertige Logik führt die Menschen zu zahlreichen Fehlern.

Eine andere Quelle der Verwirrung ist das Ziehen von Schlussfolgerungen aus dem Fehlen von Daten, wie das Ziehen einer Schlussfolgerung aus dem Hund, der in der Nacht nicht gebellt hat. Oft waren diese Schlussfolgerungen nicht das, was der Verfasser der NULL zu übermitteln beabsichtigte.

Trotzdem gibt es viele Situationen, in denen NULL mit dem Fehlen von Daten zurechtkommt und genau die gewünschten Ergebnisse erzielt. Ein Beispiel sind Fremdschlüssel in optionalen Beziehungen. Wenn Sie NULL verwenden, um keine Beziehung in einer bestimmten Zeile anzugeben, wird diese Zeile aus einer inneren Verknüpfung entfernt, genau wie Sie es erwarten würden.

Beachten Sie auch, dass Sie mit NULL auch dann fertig werden müssen, wenn Sie NULL in den gespeicherten Daten (sechste Normalform) vollständig vermeiden, wenn Sie äußere Verknüpfungen ausführen.

Walter Mitty
quelle
4

Verwenden Sie Null.

Es hat keinen Sinn, den Wert '' zu speichern, wenn Sie das Feld in der Tabelle einfach auf null setzen möchten. Es macht auch Fragen offensichtlicher.

Welche SQL-Abfrage ist offensichtlicher und lesbarer, wenn Sie Benutzer mit einer E-Mail-Adresse suchen möchten?

  1. SELECT * FROM Users WHERE email_address != ''

  2. SELECT * FROM Users WHERE email_address IS NOT NULL

  3. SELECT * FROM Users WHERE email_address != '' and email_address IS NOT NULL

Ich würde sagen, 2 ist. Obwohl 3 robuster ist, wenn schlechte Daten gespeichert sind.

Für den Fall, dass die E-Mail-Adresse auf dem Formular optional ist, sollte sie auch in der Tabelle enthalten sein. In SQL ist es ein nullwertfähiges Feld, was bedeutet, dass es nicht bekannt ist.

Ich kann mir keinen vernünftigen Geschäftswert vorstellen, wenn ich eine leere Zeichenfolge in einer anderen Tabelle als nur schlechtes Design speichere. Es ist so, als würde man einen String-Wert von 'NULL' oder 'BLANK' speichern und die Entwickler davon ausgehen, dass er null oder ein leerer String ist. Für mich ist das schlechtes Design. Warum das speichern, wenn es NULL gibt?

Verwenden Sie einfach NULL, und Sie werden alle ein bisschen glücklicher machen.

MEHR INFO:

SQL verwendet ein dreiwertiges Logiksystem: True, False und Unknown.

Für eine bessere und detailliertere Erklärung empfehle ich Entwicklern Folgendes: SQL-Abfragen - jenseits von WAHR und FALSCH .

Schwamm
quelle
3

Bei der spezifischen technischen Frage ist das Problem nicht null im Vergleich zu einer leeren Zeichenfolge, sondern ein Validierungsfehler . Eine leere Zeichenfolge ist keine gültige E-Mail-Adresse!

Für die philosophische Frage ist die Antwort ähnlich: Validieren Sie Ihre Eingaben. Wenn eine leere Zeichenfolge ein gültiger Wert für das betreffende Feld ist, erwarten Sie ihn und codieren Sie ihn. Wenn nicht, verwenden Sie null.

Eine leere Zeichenfolge wäre eine gültige Eingabe, um die Frage zu beantworten: Was hat der Pantomime der Giraffe gesagt?

Steven A. Lowe
quelle
Selbst mit der besten Absicht der Welt kann die Validierung dieses Problem möglicherweise nicht lösen. Möglicherweise muss er immer noch eine Methode für Zeilen verwenden, bei der alle Spalten mit einem Wert versehen werden müssen. In diesem Fall bleibt die Frage: Welchen Wert soll ich verwenden, wenn es keinen Wert gibt? Und die Antwort wird natürlich sein: Der Wert, der keinen Wert anzeigt. In DBs ist dies normalerweise NULL.
Jmoreno
2

Ich könnte mir einen Grund für NULL und die leere Zeichenkette vorstellen:

  • Sie haben gültige E-Mail-Adressen: [email protected]
  • Sie haben keine (und sollten wahrscheinlich nach einer fragen): NULL
  • Sie wissen, dass diese Person keine E-Mail-Adresse hat: Empty String.

Ich würde das jedoch nicht empfehlen und ein separates Feld verwenden, um zu fragen, ob Sie wissen, dass keines vorhanden ist.

Marcel
quelle
1

Die Frage, wie ich es verstehe, ist, welche Interpretationen von NULL und leerer Zeichenkette gewählt werden sollten. Dies hängt davon ab, in wie vielen Zuständen sich das jeweilige Feld befinden kann.

Die Interpretation hängt davon ab, wie auf die Datenbank zugegriffen wird. Wenn der Code eine Ebene enthält, die die Datenbank vollständig abstrahiert, ist die Auswahl einer funktionsfähigen Richtlinie (einschließlich Two-Coulmn) völlig akzeptabel. (Es ist jedoch wichtig, die Richtlinie klar zu dokumentieren.) Wenn jedoch an mehreren Stellen auf die Datenbank zugegriffen wird, sollten Sie ein sehr einfaches Schema verwenden, da der Code schwerer zu warten ist und in diesem Fall möglicherweise fehlerhaft ist.

apoorv020
quelle
1

Grundsätzlich gibt es auf logischer Ebene keinen Unterschied zwischen "ungültigem" Wert und "keine Benutzereingabe", sondern meistens nur "Sonderfälle". Fehlerfall.

NULL zu haben, nimmt zusätzlichen Platz in Anspruch: ceil (columns_with_null / 8) in Bytes / pro Zeile.

Leere Zelle und Null sind beide Möglichkeiten, um zu markieren, dass etwas nicht stimmt. Warum brauchst du 2 "falsche" Zustände? Warum NULL-Werte verwenden, wenn sie zusätzlichen Speicherplatz beanspruchen und genau das Gleiche bedeuten wie leere Zeichenfolgen? Das führt nur zu Verwirrung und Redundanz, wenn Sie zwei Bedeutungen haben (die genau dasselbe bedeuten könnten). Es ist leicht zu vergessen, dass Sie NULL anstelle von leeren Zeichenfolgen verwenden sollten (wenn der Benutzer beispielsweise einige Felder weggelassen hat).

Und Ihre Daten können zu einem Durcheinander werden. In einer perfekten Welt würde man sagen "die Daten werden immer korrekt sein und ich werde mich erinnern" ... aber wenn Leute in einem Team arbeiten müssen und nicht jeder genau auf Ihrem Niveau ist, ist es nicht ungewöhnlich zu sehen, WO (aa. xx <> '' AND bb.zz IST NICHT NULL)

Anstatt meine Teammitglieder jeden zweiten Tag zu korrigieren, erzwinge ich einfach eine einfache Regel. Keine Nullwerte, NIE!

Das Zählen von NON-NULL-Werten ist schneller ... die einfache Frage ist, wofür müssten Sie das tun?

Slawek
quelle
Ich erinnere mich vage daran, dass ich irgendwo gelesen habe, dass die Verwendung von NULL tatsächlich Kosten (sowohl für die Berechnung als auch für die Speicherung) für die Datenbank verursacht. Ein guter Punkt, um diese Formel aufzurufen.
Jacek Prucia
Vergessen Sie nicht, dass eine VARCHARSpalte mindestens 1 Byte benötigt, um die Länge der Zeichenfolge zu speichern, auch wenn sie Null ist.
dan04
Leere Zelle und Null sind beide Möglichkeiten, um zu markieren, dass etwas nicht stimmt . Nicht wahr. Eine Null ist eine Möglichkeit, das Fehlen eines Werts anzuzeigen. Ich wette, die meisten RDBMS verwenden ein Bit-Array in jeder Zeile, um anzugeben, welche Spalten null sind. Somit ist der zusätzliche Raum so klein, dass er irrelevant ist. Die Sorge um die zusätzliche Verarbeitung ist eine vorzeitige Optimierung und ist nichts im Vergleich zu den Geschwindigkeitsschwankungen, die andere Entwickler verursachen, um festzustellen, dass Sie absichtlich leere Zeichenfolgen verwendet haben.
Thomas
3
Keine Nullwerte . Dies ist der Strauß-Ansatz. "Wir werden unseren Kopf in den Sand stecken und erklären, dass es keine fehlenden Werte gibt". Dies führt normalerweise zur Magic Value-Lösung, bei der Sie für jeden Datentyp einen magischen Wert festlegen müssen, um das Fehlen eines Werts darzustellen.
Thomas
1

Ich neige dazu, es nicht aus der DB-Perspektive, sondern aus einer Programmperspektive zu betrachten. Ich weiß, dass diese Frage für den SQL-Klick ist, aber wirklich, wie viele Benutzer greifen nicht mehr direkt auf Daten zu?

In einem Programm mag ich nicht null / nothing. Es gibt ein paar Ausnahmen, aber genau das sind sie. Und diese Ausnahmen sind wirklich nur schlechte Implementierungen.

Wenn der Benutzer die E-Mail also nicht eingegeben hat, sollte es etwas geben, das bestimmt, ob dies gültig ist oder nicht. Wenn eine leere E-Mail in Ordnung ist, wird eine leere Zeichenfolge angezeigt. Wenn der Benutzer keine E-Mail eingegeben hat und dies gegen eine Regel verstößt, sollte das Objekt dies anzeigen.

Die Idee, dass Null Sinn hat, ist eine alte Schule und muss von modernen Programmierern umgangen werden.

Warum kann das E-Mail-Feld auch im DB-Design keine Nullen zulassen und keine Zeichenfolge mit einer Länge von Null haben und ein anderes Feld, das angibt, ob der Benutzer etwas eingegeben hat? Ist ein bisschen so viel von einem DBMS zu verlangen? Die DB sollte meiner Meinung nach weder die Geschäftslogik noch die Anzeigelogik behandeln. Es wurde nicht dafür gebaut und erledigt daher einen sehr schlechten Job damit.

ElGringoGrande
quelle
Warum kann das E-Mail-Feld keine Nullen zulassen und hat keine Zeichenfolge mit der Länge Null? Einfach ausgedrückt: Jeder Entwickler, der etwas über Datenbanken weiß, würde niemals erwarten, dass leere Zeichenfolgen eine magische Bedeutung haben. Sie versuchen, Ihren eigenen magischen Wert zu erstellen, um das darzustellen, was grundsätzlich in jeder Datenbank bereits vorhanden ist: ein Konzept, um das Fehlen eines Werts darzustellen. Warum das Rad neu erfinden? Auch die Idee von NULL ist weit, weit, weit von der alten Schule entfernt. Nullen sind der Grundstein für das Verständnis des relationalen Datenbankdesigns.
Thomas
LOL. Wie ich aus der Sicht eines Programmierers sagte, sind Nullen fast immer ein Ärgernis und werden für BUSINESS LOGIC fast nie benötigt. Ich persönlich interessiere mich als Entwickler nicht besonders für relationales Design. Wenn ich das tun würde, wäre ich ein DB-Typ. Wenn ich eine Null von einer DB bekomme, konvertiere ich sie fast immer in etwas Rationales, wie eine leere Zeichenfolge, und lasse mein ruhmreiches OOP-Design es magisch machen. Das Framework kümmert sich um die dummen Nullen, die DBAs der Welt aufzwingen. Ich weiß, dass DB-Typen damit umgehen müssen und ich fühle für dich. Aber als Programmierer muss ich nicht. Ich habe bessere Lösungen.
ElGringoGrande
Sie müssen sich "nie" mit Nullen auseinandersetzen. Also, was Sie beschreiben, ist Straußlösung kombiniert mit der Zauberwertlösung. Msgstr "Ich werde die Tatsache ignorieren, dass keine Werte vorhanden sind und ich werde alle Null - Ganzzahlen in -1 konvertieren". Bis der Tag kommt, an dem -1 ein realer Wert ist. Es sollte beachtet werden, dass einer der Gründe, warum MS .NET Generika hinzufügte, darin bestand, die massive Impedanzinkongruenz zwischen Datenbanken und Anwendungscode zu beheben, und dass es in erster Linie darum ging, Nullen in Code der mittleren Ebene auszudrücken. Diese "dummen Nullen" existieren auch in der Geschäftslogik.
Thomas
Die Tatsache, dass eine Ganzzahl in der Datenbank fehlt (oder null ist), bedeutet nicht, dass ich sie mit -1 darstellen oder eine Nullable (int) ausgeben muss. Wenn Sie denken, dass dies die einzige Möglichkeit ist, mit Nullen umzugehen, verstehen Sie die Programmierung nicht sehr gut. Denken Sie daran, null ist nicht dasselbe wie nichts. Wie Sie sagten, repräsentiert null einen Platzhalter für fehlende Werte in einer Art Datenstruktur. Es bedeutet etwas. Die Geschäftslogik benötigt dieses Konzept selten (was nicht das gleiche wie nie ist), da es sich um ein besseres Konzept handelt, nicht um Daten. Und wenn dies der Fall ist, ist Null selten der beste Weg, dies darzustellen.
ElGringoGrande
Sogar die Geschäftslogik muss fehlende Werte berücksichtigen (dh darstellen), und das ist nach meiner Erfahrung in fast jedem System der letzten 20 Jahre der Fall, das ich gesehen oder gebaut habe. Die Datenbank modelliert die Geschäftsdaten, die erfasst und gespeichert werden sollen. Wenn die Geschäftslogik mit der Datenbank interagieren möchte, muss sie wissen, wie sie mit Nullen umgeht. Ob es sich um eine benutzerdefinierte Struktur, einen magischen Wert oder eine generische Struktur handelt, ist unerheblich. Die Geschäftslogik muss den Empfang eines fehlenden Werts aus der Datenbank verarbeiten und einen Wert als in der Datenbank nicht vorhanden markieren können.
Thomas
-1

Ich denke nicht, dass es wichtig ist, aber ich mag es besser, wenn der NULL da ist.

Wenn ich die in einer Tabelle angezeigten Daten ansehe (wie in SQL Server Management Studio), kann ich einen fehlenden Wert besser unterscheiden, wenn NULL angegeben ist und der Hintergrund eine andere Farbe hat.

Wenn ich ein Leerzeichen sehe, frage ich mich immer, ob es wirklich leer ist oder ob es ein Leerzeichen oder unsichtbare Zeichen gibt. Mit NULL ist es auf den ersten Blick garantiert leer.

Bildbeschreibung hier eingeben

Normalerweise unterscheide ich die Werte in der Anwendung nicht, weil es unerwartet und seltsam ist, dass NULL und leere Zeichenfolge etwas anderes bedeuten würden. Und die meiste Zeit gehe ich defensiv vor und beschäftige mich nur mit beiden Staaten. Aber für mich als Mensch ist NULL beim Betrachten der Daten einfacher zu verarbeiten.

Tom Pažourek
quelle
dies scheint nicht alles zu bieten erhebliche über Punkte gemacht und erläutert vor 12 Antworten
gnat
@gnat: Ich bin anderer Meinung, niemand in den Antworten erwähnte den Aspekt der menschlichen Anzeige der Daten noch. Es gibt nur einen einzigen NULL-Wert, aber es kann viele Werte geben, die wie eine leere Zeichenfolge aussehen (nicht nur Leerzeichen, sondern auch viele komische Unicode-Zeichen). Ich kann keine andere Antwort finden, die diesen Aspekt des Problems erwähnt.
Tom Pažourek
Soweit ich das beurteilen kann, war dies in der vor 5 Jahren veröffentlichten zweiten Top-Antwort ziemlich gut dargestellt : "Es ist für jeden Programmierer, der sich eine Datenbank ansieht, offensichtlich ..." etc
gnat
@gnat: Ich verstehe deinen Standpunkt, obwohl ich denke, dass der Autor nicht dasselbe meint. Ich glaube, er ist mehr darüber, dass NULL optionale Felder impliziert, aber leere Zeichenfolge kann auch für erforderliche Felder verwendet werden, daher ist NULL logischer für fehlende Werte. Ich stimme ihm zu. Meine Antwort weist jedoch darauf hin, dass eine leere Zeichenfolge nicht so eindeutig ist wie ein NULL-Wert, da viele Dinge auf den ersten Blick wie leere Zeichenfolgen aussehen können, obwohl sie eigentlich keine leeren Zeichenfolgen sind.
Tom Pažourek