Tipps und Tricks zu den Themen: Software- und Webentwicklung

Dienstag, 11. Juni 2013

Datentyp Boolean als Bitset speichern (Beispiel: MySQL-Datenbank)

Häufig ist es erforderlich ein Set aus Wahrheitswerten vom Typ Boolean in eine Datenbank zu speichern. Beispielsweise könnten dies bestimmte Einstellungen sein, die vom Benutzer hinterlegt werden sollen.

Die einfachste Möglichkeit wäre für jeden Wahrheitswert eine separate Spalte in der Tabelle der Datenbank anzulegen. Dies bringt jedoch Nachteile mit sich. Zum einen nimmt die Spaltenanzahl der Datenbank rasant zu, welches wiederum langsamere Zugriffszeiten ergibt. Zum anderen entsteht der Nachteil, dass in der Regel keine echten Boolean-Typen in einem Datenbankmodell gespeichert werden können. In MySQL beispielsweise gibt es zwar den Datentyp "BOOL", dieser wird allerdings nicht von jedem Backend bzw. Datenbanktreiber unterstützt (und wenn benötigt es 1 Byte).

Herkömmlich wird in solchen Situationen auf die Datentypen "ENUM" oder "SET" zurückgegriffen, die eine Auswahlliste von definierten Werten darstellen. Für reine Boolean-Typen allerdings lässt sich auch eine alternative Lösung anwenden: Das bitweise Zusammenfassen von mehreren Boolean-Werten zu einer Zahl. Bei dem MySQL-Datentyp "TINYINT" wäre das beispielsweise eine Zahl der Speichergröße von 8 Bit, sprich 8 verschiedene Boolean-Werte haben dort Platz (jeweils 0 oder 1 im Binärsystem). Dieses Prinzip lässt sich natürlich nach oben hin beliebig erweitern. So hat der Datentyp "SMALLINT" Platz für 16 verschiedene Boolean-Werte, usw...

Zuerst werden die verschiedenen Wahrheitswerte (Wahr/Falsch-Zustände) bitweise zu einer Zahl verkettet: Die Variable "prefs" im oberen Beispiel repräsentiert im Ergebnis eine Zahl, die alle 8 Boolean-Werte abbildet. Durch Maskierung können die einzelnen Wahrheitswerte später wiederhergestellt werden: Hier ein Beispiel, für eine bedingte Abfrage in einem SQL-Query: Der Shift-Operator "<<" sowie die logische Verknüpfung mit "&" sind sogenannte bitweise Operatoren und gehören zu den schnellsten Rechenoperationen die so ziemlich jedes Computersystem beherrscht! Die obere Abfrage ist daher etwas schneller im Vergleich zu dem Datentyp "SET", vorausgesetzt dass innerhalb der SQL-WHERE-Klausel gleich mehrere Wahrheitswerte überprüft werden sollen (gemessen in einer Testdatenbank mit 15.000 Einträgen). Gleichzeitig wird Speicherplatz gespart, vergleichsweise würden 16 Werte als "VARCHAR" (der Länge 1) in separaten Spalten 256 Bit je Datenbankeintrag verbrauchen, wogegen der obere Lösungsvorschlag nur 16 Bit benötigt. Das ist ein Verhältnis von 1:16! Allerdings machen sich solche Unterschiede erst bei einem größeren Umfang an Datenbankeinträgen deutlich bemerkbar.



Keine Kommentare:

Kommentar veröffentlichen