Angenommen, Sie haben eine Anwendung, deren User
Tabelle ein boolesches Feld enthält Inactive
.
Ist irgendetwas inhärent falsch daran, nur false als null zu speichern? Wenn ja, können Sie bitte erklären, was der Nachteil sein sollte? Ich habe dies vor ein paar Monaten mit jemandem besprochen, und wir waren uns einig, dass es keine Rolle spielen sollte, solange Sie dies in der gesamten App / Datenbank konsequent tun. Jemand, den ich kenne, hat kürzlich nachdrücklich betont, dass "wahr" ist true
oder false
verwendet werden sollte, aber er hat nicht wirklich erklärt, warum.
database-design
null
Ominus
quelle
quelle
Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database
dies die akzeptierte Weisheit ist und Sie nicht neu definieren sollten, was Null in Ihrer Bewerbung bedeutet. Es wird verwirrend für alle anderen sein, die mit Ihrem Code arbeiten.SELECT * FROM foo WHERE bar = FALSE
Geben Sie nicht die Ergebnisse an, die Sie erwarten.Antworten:
Ja.
NULL ist nicht dasselbe wie Falsch.
Per Definition sollten Vergleiche (und Logik), die NULL beinhalten, Werte von NULL (nicht False) zurückgeben. SQL-Implementierungen können jedoch variieren.
True and NULL
ist NULL (nicht falsch).True and NULL or False
ist NULL (nicht falsch).http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29
http://technet.microsoft.com/en-us/library/cc966426.aspx
quelle
null
für die Logik irrelevant ist (wie dies inwhatever OR TRUE
oder der Fall istwhatever AND FALSE
, wenn kein Wertwhatever
die Bedingung ändern kann). Es ist keine Optimierung; So funktioniert 3-wertige Logik . Jedes DBMS, das darauf besteht,UNKNOWN
/NULL
für diese Ausdrücke zurückzugeben, ist grundsätzlich fehlerhaft.Indem Sie Nullen in einem booleschen Feld zulassen, wandeln Sie eine beabsichtigte Binärdarstellung (wahr / falsch) in eine Darstellung mit drei Zuständen (wahr, falsch, null) um, bei der Ihre 'Null'-Einträge unbestimmt sind. Der Wert 'null' ist weder entsprechend 'wahr' noch 'falsch'. Aus welchem Grund müssten Sie Ihre Darstellung erweitern, um ungenau zu sein?
Selbst wenn Sie sich für ein Muster wie dieses entscheiden und es in Ihrer gesamten Anwendung konsequent ausführen, ist dies nicht in Ordnung. Sie werden in einer Situation enden, in der es für neue Augen nicht klar ist, warum dieses Muster vorhanden ist, oder, wahrscheinlicher, in einer Situation, in der dieses Muster versehentlich gebrochen wird.
quelle
Was andere gesagt haben. 3 mögliche Werte sind keine Booleschen Werte.
Möglicherweise benötigen Sie jedoch 3 Werte. Wie (wahr, falsch, unbekannt). Selbst wenn dies der Fall ist, werden Sie, wenn Sie sich in der Ultra-Normalisierung befinden, überhaupt keine Nullwerte zulassen. Stattdessen speichern Sie einen echten Booleschen Wert in einer anderen Tabelle mit einer 1: 1-Beziehung. Ein Nullwert könnte in einer Abfrage durch einen "fehlgeschlagenen" Outer Join erzeugt werden, nicht durch einen physikalisch gespeicherten Nullwert.
quelle
false
), dann haben sie ihren Platz. Andernfalls würden sie nicht existieren. Die Alternative besteht, wie bereits erwähnt, im Grunde darin, eine ganze andere Tabelle mit nur dem Primärschlüssel Ihrer Zeile und einem einzelnen Booleschen Wert (oder int, oder varchar, oder was haben Sie) zu haben. Für jedes Feld, das Sie andernfalls als nullwertfähig festlegen würden. Obwohl relational rein, ist es für die meisten Zwecke zu verworren.Ist
bool?
ein Boolescher Typ? Nein. Es ist ein Typ,Nullable<T>
bei demT
es sich um einen Booleschen Wert handelt. Ein nullwertfähiger Boolescher Wert kann drei Werte haben: true, false und null. Zu verwendenbool
oderbool?
hängt von ihrer anforderung. Es könnte einen legitimen Grund geben, aus dem Sie möglicherweise null verwenden müssen, aber einen Typ, der nach binär riecht, dessen Antwort Sie jedoch nicht kennen. Im obigen BeispielUser.IsActive
scheint eindeutig zu sein. Benutzer ist aktiv oder nicht. Als System möchte es möglicherweise wissen, ob ein Benutzer aktiv ist oder nicht. Es sollte kein "Vielleicht" geben. Denken Sie aber an so etwas wie ein Feature-Flag. Ist die Funktion aktiviert? Die Antworten könnten ja, nein oder nicht sicher sein. Möglicherweise haben Sie eine Geschäftsregel, die nur dann die Schaltfläche anzeigt, wenn das Flag auf true gesetzt ist. Man kann argumentieren, Bool ist standardmäßig false. Warum sollte man also einen nullfähigen Bool erstellen? Umgekehrt die Anforderung: Werden Sie alle Werte in der Datenquelle auf true setzen?quelle