Grundsatzfrage, INT Flag oder BOOLEAN

Grundsatzfrage, INT Flag oder BOOLEAN

am 25.10.2007 04:20:43 von Benjamin Kalytta

Hallo,

ich habe da einmal eine Grundsatzfrage welche zwar nicht MySQL
spezifisch ist, die sich aber der eine odere andere hier sicherlich auch
schon gestellt hat.

Wenn man Felder benötigt die nur ein ja/nein speichern sollen wie z.B.
"Enabled", "Visible", "Available". Sollte man da lieber jeweils eigene
Felder für anlegen mit dem Datentyp BOOLEAN (TINYINT 0/1) oder sollte
man ein einziges Feld dafür anlegen und dann mit Integer Flags arbeiten?
(Enabled = 1, Visible = 2, Available = 4, usw.)

Was sollte man hier verwenden in Hinblick auf
Konzept/Geschwindigkeit/Wartbarkeit?

Benjamin Kalytta

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 25.10.2007 09:02:16 von Christian Franzen

"Benjamin Kalytta" schrieb
> Wenn man Felder benötigt die nur ein ja/nein speichern sollen wie z.B.
> "Enabled", "Visible", "Available". Sollte man da lieber jeweils eigene
> Felder für anlegen mit dem Datentyp BOOLEAN (TINYINT 0/1) oder sollte man
> ein einziges Feld dafür anlegen und dann mit Integer Flags arbeiten?
> (Enabled = 1, Visible = 2, Available = 4, usw.)

Also ich würde aus rein pragmatischen Gründen zu mehreren Boolean Feldern
tendieren, denn damit ist es wesentlich einfacher die Eigenschaften von
einandern unabhängig "einzustellen". Z.B. könnte es ja passieren das Daten
zwar available aber nicht enable sind. Prinzipiel könntest du sowas mit
deinem zweiten Ansatz natürlich auch implementieren aber doch wesentlich
unübersichtlicher. Ist aber wahrscheinlich dann doch geschmacksache. Ich
kann mir nicht vorstellen das es dabei (relevante) performancetechnische
unterschiede gibt.

mfg Xion

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 25.10.2007 09:30:11 von Claus Reibenstein

Benjamin Kalytta schrieb:

> Wenn man Felder benötigt die nur ein ja/nein speichern sollen wie z.B.
> "Enabled", "Visible", "Available". Sollte man da lieber jeweils eigene
> Felder für anlegen mit dem Datentyp BOOLEAN (TINYINT 0/1) oder sollte
> man ein einziges Feld dafür anlegen und dann mit Integer Flags arbeiten?
> (Enabled = 1, Visible = 2, Available = 4, usw.)

Für die letzte Variante gibt es den Datentyp SET. Dann brauchst Du Dich
nicht mit "Integer Flags" rumquälen.

Was man verwendet, hängt wohl in erster Linie von der Anwendung ab. Eine
allgemeine Aussage ist hier - wie fast immer - kaum möglich.

Gruß. Claus

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 25.10.2007 18:19:24 von Peter Schleif

Benjamin Kalytta schrieb:
>
> BOOLEAN ?

Hängt IMHO von der Anzahl der Boolean-Felder ab. Ein paar sind wohl
okay. Aber ab 10 wird die Tabelle dann unnötig breit. Mich nervt es
dann im phpMyAdmin immer endlos scrollen zu müssen und dass der Aufbau
im Browser immer länger braucht.

Peter

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 25.10.2007 21:43:15 von Benjamin Kalytta

>
> Ein paar sind wohl okay. Aber ab 10 wird die Tabelle dann unnötig breit
Das Problem bei Integer Flags ist aber doch, dass es dafür keine SQL
Standardspezifischen Abfragen gibt, sprich dass man momentan auf MySQL
festgelegt ist.

Weil man müsste ja folgendes machen können:

SELECT Field FROM Tabelle WHERE Status & 3

Soetwas ist meines Wissen nach nicht im SQL 2003 Standard definiert und
wird nur von MySQL unterstützt oder irre ich mich da? Bleibt einem also
nichts andere übrig als BOOLEAN Felder zu verwenden?

Benjamin

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 26.10.2007 15:43:14 von mueller

Peter Schleif wrote:

> Benjamin Kalytta schrieb:
>>
>> BOOLEAN ?
>
> Hängt IMHO von der Anzahl der Boolean-Felder ab. Ein paar sind wohl
> okay. Aber ab 10 wird die Tabelle dann unnötig breit. Mich nervt es
> dann im phpMyAdmin immer endlos scrollen zu müssen und dass der Aufbau
> im Browser immer länger braucht.
>
> Peter

Du bestimmst Dein Tabellendesign nach dem Aussehen in PHPMyAdmin?

Robert

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 27.10.2007 00:43:11 von Dominik Echterbruch

Benjamin Kalytta schrieb:
>
>> Ein paar sind wohl okay. Aber ab 10 wird die Tabelle dann unnötig breit
>
> Das Problem bei Integer Flags ist aber doch, dass es dafür keine SQL
> Standardspezifischen Abfragen gibt, sprich dass man momentan auf MySQL
> festgelegt ist.

Falsch. Claus hat dir einen Tipp dazu gegeben: Verwende den Datentyp SET.

> wird nur von MySQL unterstützt oder irre ich mich da? Bleibt einem also
> nichts andere übrig als BOOLEAN Felder zu verwenden?

BOOLEAN ist in MySQL nur ein Alias für TINYINT UNSIGNED. Statt einem Bit
pro Wert verbrauchst du also 8 Bit. Da finde ich SET doch wesentlich
eleganter. Und besser wartbar.

Grüße,
Dominik
--
Wo kämen wir denn hin, wenn jeder sagen würde wo kämen wir hin, aber
niemand gehen würde um zu sehen, wohin wir kämen, wenn wir gingen?
(Autor unbekannt)

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 28.10.2007 18:04:30 von dafox

Dominik Echterbruch schrieb:
> Benjamin Kalytta schrieb:

>>> Ein paar sind wohl okay. Aber ab 10 wird die Tabelle dann unnötig breit

>> Das Problem bei Integer Flags ist aber doch, dass es dafür keine SQL
>> Standardspezifischen Abfragen gibt, sprich dass man momentan auf MySQL
>> festgelegt ist.

> Falsch. Claus hat dir einen Tipp dazu gegeben: Verwende den Datentyp SET.

In welchem SQL-Standard ist der Datentyp SET spezifiziert?

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 28.10.2007 19:47:45 von Dominik Echterbruch

Thomas Hamacher schrieb:
> Dominik Echterbruch schrieb:
>> Benjamin Kalytta schrieb:
>
>>>> Ein paar sind wohl okay. Aber ab 10 wird die Tabelle dann unnötig breit
>
>>> Das Problem bei Integer Flags ist aber doch, dass es dafür keine SQL
>>> Standardspezifischen Abfragen gibt, sprich dass man momentan auf MySQL
>>> festgelegt ist.
>
>> Falsch. Claus hat dir einen Tipp dazu gegeben: Verwende den Datentyp SET.
>
> In welchem SQL-Standard ist der Datentyp SET spezifiziert?

Ups... Erwischt... Ich habe wohl etwas zu schnell quer gelesen und das
mit dem Standard übersehen. Ich muß gestehen, daß ich nicht weiß, ob das
ein Standardtyp ist. Aber immerhin: Ich kenne ihn (oder zumindest
ähnliche Typen) auch von anderen DBMSen.

Grüße,
Dominik
--
Wo kämen wir denn hin, wenn jeder sagen würde wo kämen wir hin, aber
niemand gehen würde um zu sehen, wohin wir kämen, wenn wir gingen?
(Autor unbekannt)

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 28.10.2007 21:18:46 von guenter.nowak

On 25 Okt., 03:20, Benjamin Kalytta wrote:
> Hallo,
>
> ich habe da einmal eine Grundsatzfrage welche zwar nicht MySQL
> spezifisch ist, die sich aber der eine odere andere hier sicherlich auch
> schon gestellt hat.
>
> Wenn man Felder benötigt die nur ein ja/nein speichern sollen wie z.B.
> "Enabled", "Visible", "Available". Sollte man da lieber jeweils eigene
> Felder für anlegen mit dem Datentyp BOOLEAN (TINYINT 0/1) oder sollte
> man ein einziges Feld dafür anlegen und dann mit Integer Flags arbeiten?
> (Enabled =3D 1, Visible =3D 2, Available =3D 4, usw.)
>
> Was sollte man hier verwenden in Hinblick auf
> Konzept/Geschwindigkeit/Wartbarkeit?
>
> Benjamin Kalytta

hallo
ich würde eher für einzelne felder pro flag plädieren. mehrere
attribute in ein einziges zusammenzudränden entsprich wohl nicht dem
ideal von relationalem datenbank design. die verwendung von indexe ist
dann auch ausgeschlossen, wenn man mit integer flags arbeitet
mfg günter

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 29.10.2007 01:52:37 von Hadanite Marasek

> Wenn man Felder benötigt die nur ein ja/nein speichern sollen wie z.B.
> "Enabled", "Visible", "Available". Sollte man da lieber jeweils eigene
> Felder für anlegen mit dem Datentyp BOOLEAN (TINYINT 0/1) oder sollte
> man ein einziges Feld dafür anlegen und dann mit Integer Flags arbeiten?
> (Enabled = 1, Visible = 2, Available = 4, usw.)
>
> Was sollte man hier verwenden in Hinblick auf
> Konzept/Geschwindigkeit/Wartbarkeit?

Das kommt letzlich auf die die Anwendung an. Eine dritte Möglichkeit ist
eine n:m-Beziehung. Die vierte wäre ein Bitfeld, d. h. Du sagst, 111
binär steht für z. B. read/write/execute und speicherst dann den
entsprechenden Integer, der sich aus bindec(111) ergibt.

Letzlich ist das alles eine Frage, wie Du willst, dass es skaliert.

--
Mein Zeugs:
http://www.hadanite-marasek.de/classes.php
http://www.objektivsuche.de/
Ansonsten:
http://www.php-faq.de/q/q-newsgroup-wie-helfen.html

Re: Grundsatzfrage, INT Flag oder BOOLEAN

am 29.10.2007 17:26:07 von Michael Fesser

..oO(Benjamin Kalytta)

>Wenn man Felder benötigt die nur ein ja/nein speichern sollen wie z.B.
>"Enabled", "Visible", "Available". Sollte man da lieber jeweils eigene
>Felder für anlegen mit dem Datentyp BOOLEAN (TINYINT 0/1) oder sollte
>man ein einziges Feld dafür anlegen und dann mit Integer Flags arbeiten?
>(Enabled = 1, Visible = 2, Available = 4, usw.)
>
>Was sollte man hier verwenden in Hinblick auf
>Konzept/Geschwindigkeit/Wartbarkeit?

Wie in diesem Thread schon mehrfach erwähnt - es kommt drauf an.

In meinen Applikationen benutze ich solche Flags in mehreren Tabellen:
Statusflags, Zugriffsrechte usw. Ich packe dazu alles in ein oder zwei
Integer, die dann von der Applikation bitweise interpretiert werden. Der
Grund dafür ist, daß die Anzahl der Flags nicht von vornherein feststeht
und die jeweilige Bedeutung zum Teil auch von der Applikation abhängt.
Insofern scheiden separate Spalten oder SETs in diesem Fall für mich aus.

Micha