Vor einiger Zeit habe ich das Buch SQL and Relational Theory by C. J. Date gelesen. Der Autor ist dafür bekannt, dass er die dreiwertige Logik von SQL (3VL) kritisiert. 1)Optionen zum Entfernen von NULL-fähigen Spalten aus einem DB-Modell (um die dreiwertige Logik von SQL zu vermeiden)?
Der Autor macht einige Stärken, warum 3VL in SQL sollte vermieden werden, er ist jedoch nicht skizzieren, wie ein Datenbankmodell aussehen würde, wenn Nullable-Spalten nicht erlaubt waren. Ich habe ein wenig darüber nachgedacht und habe folgende Lösungen gefunden. Wenn ich andere Gestaltungsmöglichkeiten verpasst habe, würde ich gerne von ihnen hören!
1) Datum Kritik an der SQL der 3VL wiederum wurde auch kritisiert: siehe this paper by Claude Rubinson (enthält die ursprüngliche Kritik von C. J. Date).
Beispieltabelle
Als Beispiel nehmen die folgende Tabelle, in der wir eine NULL festlegbare Spalte (DateOfBirth
):
# +-------------------------------------------+
# | People |
# +------------+--------------+---------------+
# | PersonID | Name | DateOfBirth |
# +============+--------------+---------------+
# | 1 | Banana Man | NULL |
# +------------+--------------+---------------+
Option 1: Emuliert NULL
durch ein Flag und einen Standardwert:
Anstatt die Spalte auf Null zu setzen, wird jeder Standardwert angegeben (z. 1900-01-01
). Eine zusätzliche Spalte BOOLEAN
gibt an, ob der Wert in DateOfBirth
einfach ignoriert werden soll oder ob er tatsächlich Daten enthält.
# +------------------------------------------------------------------+
# | People' |
# +------------+--------------+----------------------+---------------+
# | PersonID | Name | IsDateOfBirthKnown | DateOfBirth |
# +============+--------------+----------------------+---------------+
# | 1 | Banana Man | FALSE | 1900-01-01 |
# +------------+--------------+----------------------+---------------+
Option 2: eine Spalte von -zulässige in eine separate Tabelle zum Drehen:
Die nullable Spalte durch eine neue Tabelle ersetzt (DatesOfBirth
). Wenn ein Datensatz für diese Spalte keine Daten hat, wird es keinen Eintrag in der neuen Tabelle sein:
# +---------------------------+ 1 0..1 +----------------------------+
# | People' | <-------> | DatesOfBirth |
# +------------+--------------+ +------------+---------------+
# | PersonID | Name | | PersonID | DateOfBirth |
# +============+--------------+ +============+---------------+
# | 1 | Banana Man |
# +------------+--------------+
Während dies wie die bessere Lösung scheint, würde dies möglicherweise in vielen Tabellen führt, die sein müssen beigetreten für eine einzelne Abfrage. Da OUTER JOIN
s nicht erlaubt sind (weil sie NULL
in die Ergebnismenge einführen würden), könnten möglicherweise alle notwendigen Daten nicht mehr wie bisher mit nur einer einzigen Abfrage abgerufen werden.
Frage: Gibt es noch andere Möglichkeiten zur Beseitigung von NULL
(und wenn ja, was sind sie)?
könnten Sie kurz erklären, warum die Dreiwertigkeitslogik vermieden werden sollte. Der Grund dafür ist, dass Sie mindestens ein Bit mehr speichern müssen. Aber wenn Sie stattdessen eine andere Spalte hinzufügen, ergibt das keinen Sinn.Eine weitere Tabelle führt zu Abfrage-Overhead. Ein anderer Grund, den ich mir vorstellen kann, ist, dass Sie den Nullwert behandeln müssen, aber Sie haben es auch mit Ihren Lösungen. – TooAngel
@TooAngel: Es geht nicht nur darum, ein zusätzliches Bit zu speichern. Es geht darum, Abfrageergebnisse zu erhalten, die keinen (allgemeinen) Sinn ergeben, z. 'COUNT (*)' zählt nicht 'NULL' oder' NULL' ist nie gleich 'NULL' (weil' NULL' grundsätzlich die Bedeutung von "unbekannt" hat). - Ich schlage vor, Sie lesen das 5-seitige Papier, das ich in der Fußnote verlinkt habe. Es enthält die (anscheinend fehlerhafte, aber immer noch sehr aufschlussreiche) Kritik von 3VL. Vielleicht möchten Sie auch den Wikipedia-Artikel über ternäre Logik ausprobieren: http://en.wikipedia.org/wiki/Ternary_logic – stakx
Zum oben genannten sollte ich den Hauptpunkt hinzufügen, der wegen der manchmal "nicht intuitiven" ist Ergebnisse, die Sie dank 3VL erhalten, Ergebnisse werden leicht falsch interpretiert. Oder noch schlimmer, eine Frage ist nicht, was man denkt, und man wird (richtige) Ergebnisse bekommen, die nicht richtig erscheinen. Ein letzter Punkt ist, dass "NULL" oft verwendet wird, um verschiedene Dinge zu bedeuten, z. "unknown", "missing", "not applicable" usw., was es noch schwieriger macht, korrekte Abfragen zu formulieren und das Ergebnis aus der DB korrekt zu interpretieren. – stakx