Grundsatzfrage, INT Flag oder BOOLEAN

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
Benjamin Kalytta [ Do, 25 Oktober 2007 04:20 ] [ ID #1854213 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

"Benjamin Kalytta" <bkausbk [at] web.de> 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
Christian Franzen [ Do, 25 Oktober 2007 09:02 ] [ ID #1854214 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

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
Claus Reibenstein [ Do, 25 Oktober 2007 09:30 ] [ ID #1854215 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

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
Peter Schleif [ Do, 25 Oktober 2007 18:19 ] [ ID #1854221 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

>
> 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
Benjamin Kalytta [ Do, 25 Oktober 2007 21:43 ] [ ID #1854225 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

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
mueller [ Fr, 26 Oktober 2007 15:43 ] [ ID #1855166 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

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)
Dominik Echterbruch [ Sa, 27 Oktober 2007 00:43 ] [ ID #1855858 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

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?
dafox [ So, 28 Oktober 2007 18:04 ] [ ID #1856264 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

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)
Dominik Echterbruch [ So, 28 Oktober 2007 19:47 ] [ ID #1856266 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

On 25 Okt., 03:20, Benjamin Kalytta <bkau... [at] web.de> 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
guenter.nowak [ So, 28 Oktober 2007 21:18 ] [ ID #1856270 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

> 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
Hadanite Marasek [ Mo, 29 Oktober 2007 01:52 ] [ ID #1856835 ]

Re: Grundsatzfrage, INT Flag oder BOOLEAN

..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
Michael Fesser [ Mo, 29 Oktober 2007 17:26 ] [ ID #1856846 ]
Datenbanken » de.comp.datenbanken.mysql » Grundsatzfrage, INT Flag oder BOOLEAN

Vorheriges Thema: MySql 5.0 Lizenz
Nächstes Thema: Reverse Engineering einer MySQL-Datenbank über PHP-Scripte