Nullwerte oder lieber leere Strings speichern.

Hallo,

ich programmiere gerade eine Applikation in Java und benutze
als DB eine Postgres 8.1.4 und den neuesten JDBC-Treiber dafür.

Wenn ich Datensätze aus einer TAbelle abfrage bekomme ich
überall, wo ein NULL-Wert ist, den STring “null” zurückgeliefert.

Das ist ein Nachteil, denn dann muss ich immer abfragen:

if ((name = rs.getString(1)).equals(“null”)) then name = “”;

Das kostet bei vielen Datensätzen und vielen Attributen viel
Rechenzeit!

Ich frage mich, ob ich nicht gleich in der Datenbank leere Strings
anstatt NULL ablege.

Hätte auch den Vorteil, dass ich in Java für meine Entity-Klassen
(also z. B. die Klasse Adresse, in der ich eine Adresse
speichere), nur einen Konstruktor brauche, und nicht 10 verschiedene für alle möglichen Kombinationen von Attributen bzw. Nullwerten.

Hat jemand eine andere Idee, oder ist es für die Datenbank
vorteilhafter NULL-Werte abzulegen? Oder gibt es sonst einen
Vorteil für NULL-Werte?

Danke im Voraus
Yves

Siehe meine Antwort auf deine Antwort in dem anderen Thread:

NOT NULL und leere Strings sind zwei völlig unterschiedliche Werte, diesen Sachverhalt solltest du dir verinnerlichen.

Um dein Problem zu lösen, kannst du dein Datenmodell umschreiben, kannst Default Werte auf die Spalte setzen (z.B.: DEFAULT ‘’) oder einfach deine Applikation einen Fehler erzeugen lassen, wenn kein Wert eingegeben wurde.

Siehe meine Antwort auf deine Antwort in dem anderen Thread:

In welchem?

NOT NULL und leere Strings sind zwei völlig unterschiedliche Werte, diesen Sachverhalt solltest du dir verinnerlichen.

Ja, ich weiß :slight_smile: Deswegen habe ich diese Frage ja auch gestellt.

Um dein Problem zu lösen, kannst du dein Datenmodell umschreiben, kannst Default Werte auf die Spalte setzen (z.B.: DEFAULT ‘’) oder einfach deine Applikation einen Fehler erzeugen lassen, wenn kein Wert eingegeben wurde.

Meinst du mein Datenbank-Schema? In meinem Datenmodell sind
überhaupt keine Constraints bzw. Default-WErte.

Ich wollte eigentlich viel mehr wissen, ob es Datenbank-technische
Vorteile von NULL bezüglich “” gibt.

Gruß
Yves

Nun, du kannst ja NOT NULL für die Spalten sagen, dann kannst du dir bei den Queries schon mal die Abfragen auf diesen Zustand sparen.

Als Ergebnis musst du bloss noch auf ‘’ prüfen, was deine Queries einfacher macht.

Ob das ganze Vorteile bringt? Keine Ahnung, ich kenne deine Anwendung nicht. Da beide Möglichkeiten für unterschiedliche Aufgaben gedacht sind, kann man die so direkt auch nicht miteinander vergleichen.

Naja, das ist es ja, das hat nichts mit meiner Anwendung zu tun.
Zur Not kann ich mit COALESCE die Null’s substituieren, das ist meiner
Anwendung egal.

Ich will wirklich nur wissen, ob es DATENBANK-Technische Vorteile hat,
NULL statt “” zu speichern. Vielleicht habe ich mich undeutlich ausgedrückt.

@ads: Welche Möglichkeit ist denn für welche Aufgabe gedacht?

Ich vermute mal, dass es NULL nur gibt, damit man kürzere Einfüge-Abfragen
schreiben kann, indem man nicht alle Attribute angeben muss? Oder?

Die Fragestellung ist schon eigenartig. Sie beantwortet sich doch schon dadurch, ob man auf einen Test des Wertes NULL bei einer Datenbank verzichten kann.



mfg

fristo

Hallo.

Definitiv nein. Wie ads schon schilderte, haben beide “Werte” ihre Daseinsberechtigung. Ein leerer String drückt etwas anderes aus als null. Ich selbst nutze null ausschließlich, wenn ich ausdrücken möchte, dass etwas undefiniert ist. Es sollte also nicht darum gehen, ob du mit COALESCE irgendetwas umgehen kannst, sondern viel grundlegender darum, ob der Wert, den du speichern willst, eher durch einen leeren String oder durch null repräsentiert wird. Das ist jedenfalls meine Meinung… :wink:

Gruß, eazy

@eazy: Ja, ok. Dann wäre es einfach nur Definitions-Sache ob man Null oder
‘’ nimmt.

@fristo: Klar, fristo, aber auch nur aus Anwender (Anwendungs)-Sicht. Vielleicht aber nicht aus Datenbank-technischer Sicht! Also Art der Speicherung…

Egal, ich machs jetzt einfach, wie es semantisch am besten passt und am
einfachsten in die Anwendung passt.

Trotzdem danke

Gruß
Yves

also aus erfahrung kann ich dir sagen, verwende NULL wenn es nicht definiert oder einfach gar nichts ist. ansonsten einen string. mag sein das das einmalig etwas mehr arbeit ist aber langristig gesehen sparst du dir a menge arbeit. du musst dich dann nämlich immer nicht so sehr in deinen code eindenken…

cu tb.

Hallo congor,

Nein, dem Anwender interessiert nicht, ob Du in der Datenbank für eine Spalte den Wert NULL speicherst, dem Anwender gibst Du immer in deiner Applikation ein Textfeld für die Eingabe vor. Es ist also immer die Entscheidung des Entwicklers, ob er für einen leeren String den Wert NULL in der Datenbank speichert oder nicht. Und es gibt SELECT’s, wo Dir die Datenbank zwangsweise den Wert NULL in bestimmten Spalten liefert, weil eben für diese Spalten es keinen Wert gibt und damit undefiniert sind (z.B bei JOINS).

Spätestens wenn Du einen Datensatz liest, muß eine Überprüfung auf den Wert NULL erfolgen, das ja für die entsprechende Spalte ein entsprechendes Feld in Deiner Applikation erstellt werden muß (mit oder ohne Inhalt). Zudem fallen die Zeiten für die Überprüfung garnicht ins Gewicht. Das Lesen eines Datensatzes dauer wesentlích länger.

Der Wert NULL hat in Datenbanken die gleiche Bedeutung wie in Java, nämlich dass der Wert undefiniert ist.



mfg

fristo

Hallo,

… hast Du beispielsweise nummerische Werte abspeicher, über die Du z.B. ein AVG(feldname) laufen lassen willst, so wird dies nur richtig berechnet, wenn die leeren Felder null und nicht ‘0’ sind! Die null-Felder werden dann weder bei der Feldanzahl noch bei dem Wert berücksichtigt!

Gruss
Rolf