AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Wie speichert ihr boolsche Werte in der DB?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie speichert ihr boolsche Werte in der DB?

Ein Thema von Codehunter · begonnen am 19. Mär 2014 · letzter Beitrag vom 19. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 12:27
Hallo,

Zitat:
Zeitstempel=NULL heisst dann eben FALSE, Zeitstempel<>FALSE ist TRUE mit Zusatz-Info.
Das bedeutet also, um ein Feld wieder auf die Information "False" zu setzen, setze ich den Inhalt auf Null? Wo ist dann die Zusatzinformation? Die hätte ich doch nur, solange das Feld auf "True" steht, also ein Zeitstempel vorhanden ist....

Mir geht es da wie DeddyH, erschließt sich mir nicht wirklich....

Ich verwende für Boole'sche Informationen Smallint-Felder mit 0 für False und 1 für True, wobei nur auf <> 0 geprüft wird (Firebird 2.5.2).

Firebird 3 soll ja Boole'sche Felder direkt unterstützen, aber bis dahin ist wohl noch lang hin.


Grüße
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
684 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 12:39
Das bedeutet also, um ein Feld wieder auf die Information "False" zu setzen, setze ich den Inhalt auf Null? Wo ist dann die Zusatzinformation? Die hätte ich doch nur, solange das Feld auf "True" steht, also ein Zeitstempel vorhanden ist....

Mir geht es da wie DeddyH, erschließt sich mir nicht wirklich....
Wenn man den Kontext mit Hasso Plattner/SAP betrachtet, dann macht es etwas mehr Sinn. Eine Rechnung ist bezahlt am ... oder offen. Dann noch ein INSERT ONLY und die Historie ist gegeben (bezahlte Rechnung plötzlich wieder unbezahlt). Ich gebe zu, das macht nicht bei jedem Boolean-Feld Sinn - aber wenn eine Zusatzinformation vorhanden ist, dann lieber so als mit zwei Feldern (bezahlt, bezahlt_am) - und lach nicht, solche Konstrukte sehe ich fast täglich
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 15:23
Nemen wir das Nudelholz, das ist so schön schief
id name Durchmesser durchmesser_alt_erledigt
  1. Nudelholz 8 null
  2. Marmor 10 10
  3. Birke 12 null
  4. Stahl null null


Wenn Du ein Nudelholz hast, gibt es auch einen Durchmesser (<>null), ohne Durchmesser soll es erst noch gekauft werden. Ist Durchmesser_alt_erledigt belegt, dann gibt es das Nudelholz nicht mehr (frag Furtbichler wo's ist)

Wenn man dafür dann ein Datumsfeld/Timestamp nimmt, dann weiß man von wann bis wann man das Nudelholz gehabt hat.
Oder anders herum: IchbinNudelholzeigentümer:=(durchmesser <> null) and (durchmesser_alt_erledigt = null)
ich_hatte_mal_EIN_nudelholz:=(durchmesser<>null) and (durchmesser_alt_erledigt <> null)


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (19. Mär 2014 um 15:28 Uhr) Grund: blödsinn korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
782 Beiträge
 
#4

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 15:41
Eine Rechnung ist bezahlt am ... oder offen. Dann noch ein INSERT ONLY und die Historie ist gegeben (bezahlte Rechnung plötzlich wieder unbezahlt).
Und dann wird festgestellt, dass eine Zahlung falsch zugeordnet wurde und umgebucht werden muss

Da wäre ein Test "sum(alleBuchungsbeträge) = 0" besser, und wenn es mehrere Teilzahlungen waren, braucht man sowieso bei jeder Zahlung einen Timestamp.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 16:04
Also nach meinen Erfahrungen nach kommt es recht häufig vor, dass später weitere Zustände ausser True und False benötigt werden.
Deshalb verwende ich immer meistens ein BYTE (0..255) als Booleanfeld.
Beispiel 1:
Splashscreen_aktive: True oder False.
Später fällt mir dann ein, dass ich den Splashscreen nicht aktivieren möchte, wenn die Anwendung auf einem Terminalserver läuft; es soll aber einstellbar sein. Und schon sind es 3 Zustände...
Beispiel 2:
Kundensperre (z.B. weil der Kunde im Zahlungsrückstand ist).
Könnte man ja meinen dass True oder False ausreichend sind.
Später möchte man aber genauer wissen weshalb der Kunde gesperrt ist (Insolvent, Zahlungsrückstand, Gerichtsverfahren anhängig, ...) und schon braucht man wieder mehr Zustände.

Deshalb jedes Booleanfeld genau überprüfen und vorrausplanen ob nicht ein Bytefeld besser passt.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 16:21
Hallo,

für mich ergibt das nur Sinn, wenn sichergestellt ist, dass das Feld mit dem Timestamp nie wieder geändert werden kann (da ja sonst die Information verlorenginge), insofern hat joachimd das schon richtiggestellt.

Wenn das Feld wieder geändert werden kann, muss man eben die bisher bekannten Datentypen verwenden (smallint, char, usw. usf).

Gruß
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 16:43
Nicht in allen Fällen ist es ratsam, als Repräsentant für ein Boolean-Feld die kleinste verfügbare Einheit zu nehmen. So erwarten die IbDac-Komponenten von Devart einen Integer. Mit einem SmallInt, der z.B. bei den FibPlus-Komponenten funktionierte, tritt bei Verwendung von IbDac eine Fehlermeldung auf bzw. wird dieses Feld nicht als Boolean erkannt. Der String "Boolean" muß im Feldnamen vorkommen, bei Firebird z.B.:
Code:
CREATE DOMAIN INTBOOLEAN AS
INTEGER
DEFAULT 0
NOT NULL
CHECK (VALUE IN (0,1));

COMMENT ON DOMAIN INTBOOLEAN IS
'Boolean False oder True';
  Mit Zitat antworten Zitat
Alt 19. Mär 2014, 17:27     Erstellt von Smut
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 17:24
Also nach meinen Erfahrungen nach kommt es recht häufig vor, dass später weitere Zustände ausser True und False benötigt werden.
Deshalb verwende ich immer meistens ein BYTE (0..255) als Booleanfeld.
Beispiel 1:
Splashscreen_aktive: True oder False.
Später fällt mir dann ein, dass ich den Splashscreen nicht aktivieren möchte, wenn die Anwendung auf einem Terminalserver läuft; es soll aber einstellbar sein. Und schon sind es 3 Zustände...
Beispiel 2:
Kundensperre (z.B. weil der Kunde im Zahlungsrückstand ist).
Könnte man ja meinen dass True oder False ausreichend sind.
Später möchte man aber genauer wissen weshalb der Kunde gesperrt ist (Insolvent, Zahlungsrückstand, Gerichtsverfahren anhängig, ...) und schon braucht man wieder mehr Zustände.

Deshalb jedes Booleanfeld genau überprüfen und vorrausplanen ob nicht ein Bytefeld besser passt.
  • SplashScreen aktiv ist immer ein Boolean => Entweder aktiv oder nicht aktiv
  • Kundensperre aktiv ist immer ein Boolean => Entweder aktiv oder nicht aktiv
allerdings ist diese Information das Resultat von mehreren Umständen.

Also legt man diese Zusatzinformationen in eine eigene Tabelle und prüft, ob es dort Einträge gibt, und wenn ja, ob diese auf die aktuelle Situation passen.

SplashDisable
OSType
TerminalServer

Kunden
IDName
1Peter
2Paul
KundeSperren
KundeIdGrundSeit
1Insolvenz01.01.2014

Das Beispiel mit den Rechnungen verhält sich ähnlich
Rechnungen
IDKundeIdNummerDatumBetrag
111234501.01.2014100,00
211234602.01.2014200,00
Zahlungen
IDKundeIdDatumBetrag
1110.01.2014250,00
RechnungZahlungen
RechnungIdZahlungIdBetrag
11100,00
21150,00
Löscht man aus der Tabelle RechnungZahlung den Satz 2|1, dann verbleibt bei der Zahlung ein noch nicht zugeordneter Betrag von 150,00 und die Rechnung 2 ist wieder komplett offen.

Den Boolean-Wert für RechnungBezahlt bekommt man also durch die Analyse der entsprechenden Tabelle.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (19. Mär 2014 um 17:29 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: Wie speichert ihr boolsche Werte in der DB?

  Alt 19. Mär 2014, 17:32
Den Boolean-Wert für RechnungBezahlt bekommt man also durch die Analyse der entsprechenden Tabelle.
Nicht sonderlich performant (als berechnetes Feld), oder würdest Du das über einen Trigger lösen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz