2010-12-13 11 views
7

Nicht sicher, was die Best Practices für den Umgang mit NULL-Werten sind, wenn ich eine einzige Tabelle habe, in der zwei Felder nur teilweise ausgefüllt werden und viele NULL-Werte in den Zeilen erzeugen.Erstellen einer Db-Tabelle NULL-Best Practices

Sollten die zwei Felder in eine separate Tabelle verschoben werden, die zwei Tabellen ohne NULL-Werte erzeugt?

Ein Join über diese beiden Tabellen würde nur ein Ergebnis zurückgeben, das meiner ursprünglichen Tabelle mit den NULLs entspricht, also was ist der Sinn darin?

Scheint sinnlos, sie zu trennen, aber ich habe ein wenig darüber gelesen, Null-alles zusammen in der db zu vermeiden.

Alle Gedanken willkommen.

+0

Führen Sie Abfragen für diese beiden Felder aus? –

+0

Mögliche Antworten auch hier: http://dba.stackexchange.com/a/5227/14987 –

Antwort

10
  1. Rein theoretisch soll ein NULL "unbekannter Wert" bedeuten. Also - wiederum rein theoretisch - sollten Sie Ihre Tabellen so entwerfen, dass sie normalisiert werden, so dass Sie keine NULL-Werte ausfüllen müssen, um "nicht anwendbar für diese Zeile" zu bedeuten. Dieser Punkt steht jedoch praktisch in keinem Zusammenhang mit praktischen Überlegungen (Design, Leistung oder Lesbarkeit von Abfragen).

  2. In der Praxis gibt es einige Leistungsaspekte. Sie sollten sehr spärliche Daten in den folgenden Fällen normalisieren weg:

    • Es materiellen Vorteil ist die Tabelle von Verkürzung (beide IO weise und/oder Raum weise). NULLs benötigen Platz, und je weiter die Zeilen, desto schlechter die Leistung. Dies ist besonders dann der Fall, wenn die Tabelle viele Zeilen enthält und es viele solcher Spalten gibt. Für einen kleineren Tisch mit nur zwei solcher Spalten sind die realisierten Vorteile möglicherweise nicht die Mühe wert, eine zusätzliche Verbindung zu haben.

    • Ihre Abfragen haben die betreffende Spalte in der WHERE-Klausel. IIRC, die Abfrage einer stark NULL-Spalte ist ziemlich ineffizient.

    • Auf der anderen Seite kann die Optimierung von Joins in der Abfrage die Leistung des Optimierungsprogramms beeinträchtigen (zumindest bei Sybase, wenn Ihre Joins 10 + Tabellen enthalten), da CPU-Ressourcen belegt werden, wenn das Optimierungsprogramm ausgeführt wird verwirrend den Optimierer, um einen SEHR schlechten Plan auszuwählen). Die Lösung besteht darin, zu viele Tabellen aufgrund von Normalisierung zu vermeiden (z. B. keine Aufteilung der 2 Spalten in eine separate Tabelle) oder den Abfrageplan zu erzwingen. Letzteres ist offensichtlich Bad Juju.

+0

'Nullen' nehmen nicht immer Platz. Wenn Oracle am Ende einer Zeile steht, nehmen sie null Bytes - und selbst wenn sie nicht sind, nehmen sie höchstens 1 Byte. –

+0

@JackPDouglas - Wusste das nicht über Oracle, danke !. In Sybase (oder MS SQL Server, wenn Sie keine Sparse-Spalte verwenden) ist das leider nicht der Fall. – DVK

+0

Was ist mit MySQL? –

2

Nulls verursachen falsche und widersprüchliche Ergebnisse in Abfragen und in der Regel die Komplexität des Codes durch die spezielle Handhabung in Code benötigt, die sie verarbeiten muss erhöhen. Aus diesen Gründen ist es normalerweise sinnvoll, Nullen in Ihren Datenbankentwürfen zu vermeiden oder zu minimieren. Sie müssen auch keine Nullen in Abfragen verwenden, obwohl SQL sie leider sehr schwierig zu vermeiden macht. Wenn Sie jedoch keine Nullen in Basistabellen verwenden, stellen Sie sicher, dass Ihr Datenmodell die Realität besser widerspiegelt, und Sie geben den Datenbankbenutzern mehr Kontrolle darüber, wie Nullen verwendet werden sollen.

+0

@dportas - Könnten Sie bitte näher auf "Nullen verursachen falsche und inkonsistente Ergebnisse in Abfragen" -Teil? – DVK

+1

"Nullwerte verursachen inkonsistente und inkonsistente Ergebnisse in Abfragen" - nur wenn Sie Sentinel-Werte und NULLs im Allgemeinen mischen und abgleichen. Ich würde viel lieber eine saubere Null als eine leere Zeichenfolge oder NULL bevorzugen. Nicht zuletzt mit SQL Server null Bitmap zum Beispiel – gbn

+1

@DVK, Null ist kein Wert. Im Gegensatz zu regulären Werten macht die Art und Weise, wie SQL Null behandelt, in der realen Welt normalerweise keinen Sinn. Die Gültigkeit der Ergebnisse hängt von der beabsichtigten Bedeutung von null ab. In der Praxis haben sie viele verschiedene und widersprüchliche Bedeutungen. Zum Beispiel haben Sie vorgeschlagen, dass Null verwendet werden könnte, um einen "unbekannten Wert" zu bezeichnen, aber SQL unterstützt das nicht wirklich. In der Mathematik, der Realität und im allgemeinen Sinn würde x = x zu WAHR evaluieren, wenn x unbekannt ist, aber nicht in SQL, wenn x null ist. Daher behandelt SQL null nicht so, als würde es einen "unbekannten Wert" bedeuten. – sqlvogel

2

Wie dportas in einem Kommentar schon sagt, ist es hilfreich zu wissen, was ein null Wert in einem bestimmten Bereich bedeutet - nicht das, was es in der Theorie bedeutet, aber was es bedeutet, in Ihre Daten.

Ich denke, solange man klar ist, was ein null in der Tabelle bedeutet, und wenn Sie sicher sind, es bedeutet nur eine Sache, Sie eine fundierte pragmatische Entscheidung darüber, ob es ermöglichen, machen kann.

Meinung: Meine Faustregel ist, dass NULL festlegbare Felder sind in Ordnung, aber nicht Multi-Task

+0

+1 Meine Gedanken auch. Vergessen Sie die Theorie und seien Sie konsequent ... – gbn

+0

Zitat von Keith Hare, der das SQL-Standards-Komitee leitete: "Früh in der Entwicklung des SQL: 1999 ANSI & ISO-Standards gab es ein Konzept von benutzerdefinierten NULL-Typen. Die Idee Englisch: www.doc-o-matic.com/webhelp/TdlgEditEdit.html Man musste bis zu 128 verschiedene NULL - Typen verwenden, dann brauchte man einen Mechanismus, um den NULL - Typ zu bestimmen und zwei NULL - Typen zu vergleichen, um festzustellen, ob sie vom selben NULL - Typ waren Im Standard war es sehr komplex zu spezifizieren. Es gab keinen Hinweis darauf, dass einer der Anbieter das Konzept jemals umsetzen würde, so dass es schließlich aussortiert wurde. " – onedaywhen

+0

@onedaywhen hehe [schlagen Sie dazu] (http://dba.stackexchange.com/questions/5222/why-shouldnt-we-allow-nulls/5223#5223) –

2

Nulls sind entscheidend in einer Datenbank zu haben. Ich habe mich noch nie mit einer Datenbank beschäftigt, die Nullen nicht erlaubt, die am Ende nicht viel schwieriger zu hinterfragen war, viel schwieriger zu pflegen (wie entscheidest du, welcher Wert bedeutet, dass ich die Antwort nicht weiß) und normalerweise mehr schlechte Daten. Ja, Nullen erfordern eine spezielle Behandlung in Abfragen, also fügen Sie beispielsweise ein viel späteres Datum (1.1.1999) als Enddatum hinzu, um zu vermeiden, dass Sie eine Null haben.

Die Wahrheit ist, einige Daten sind gerade nicht bekannt, als der Datensatz eingefügt wird. Es gibt keinen Ersatz für null.

Nun, in Ihrem Fall, wo Sie auf zwei Tabellen ausbrechen sollten, hängt viel von der Breite der Tabellen und der Häufigkeit ab, die Sie benötigen, um diese Nullable-Abfragen abzufragen. Ich würde wahrscheinlich nicht eine zweite Spalte in eine andere Tabelle verschieben, obwohl ich viele Nullen hatte, weil sie immer mit den anderen Informationen in der Basistabelle abgefragt wird. Es wäre auch unwahrscheinlich, dass ich eine Enddatumsspalte verschieben würde. Aber wenn die Spalten Dinge waren, die man gut kennt, die man normalerweise nicht abfragt, wenn man die Basisdaten abfragt (wie Geburtstag, Haarfarbe, etc.), dann kann eine gesonderte Tabelle nur für die Datensätze, die die Daten enthalten, in Ordnung sein. Denken Sie jedoch daran, wenn Sie abfragen, ob Sie einen inneren Join verwenden, eliminieren Sie alle Datensätze, die keinen Wert in der zweiten Tabelle haben. Wenn ich normalerweise alle Datensätze haben möchte (wie mit dem zweiten Vornamen, frage ich nur selten Leute mit dem zweiten Vornamen 'Mary'), dann neige ich dazu, sie in der gleichen Tabelle zu behalten, es sei denn, der Tisch wird sehr breit und ich Normalerweise möchten Sie diese Informationen nicht abfragen.

+0

Es kann argumentiert werden, dass Nullen nützlich sind, aber zu sagen, dass sie "kritisch" sind oder dass es "keinen Ersatz" für sie gibt, geht zu weit. Datenbanken sind nur Sammlungen von Fakten über die Welt. Wissenschaft, Mathematik und Logik gelang es, die Welt Jahrhunderte lang genau zu beschreiben, bevor SQL und Nullen aufkamen. Selbst in SQL entwerfen viele Leute Datenbanken, die perfekt funktionieren, ohne Nullen zu verwenden. – sqlvogel

+0

Ja, sie entwerfen Datenbanken ohne sie, ich habe noch nie eine gesehen, die gut funktioniert hat. Was verwenden Sie, wenn Sie möchten, dass ein numerischer Wert später gesetzt wird und 0 beispielsweise eine Bedeutung für das Feld hat? Woher weiß der Entwickler, welcher falsche Wert verwendet wird oder was in der Vergangenheit verwendet wurde? – HLGEM

+0

@HLGEM - siehe Punkt 1 meiner Antwort. Worauf sich Ihr Kommentar bezieht, ist die tatsächliche 100% ige Verwendung eines NULL in relationaler Logik - "Unbekannter Wert"; und als solche ist definitiv sehr schwer zu verzichten - magische "ungültiger Wert" spezielle Werte sind sehr böse. NULL verwendet als "kein Wert", der sich im Laufe der Zeit eingeschlichen hat, was optional ist. – DVK

Verwandte Themen