Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichert man 60 Booleans in einer MySQL-Datenbank?

Eine separate Spalte pro Wert ist flexibler bei der Suche.

Eine separate Schlüssel/Wert-Tabelle ist flexibler, wenn verschiedene Zeilen unterschiedliche Sammlungen von booleschen Werten haben.

Und wenn

  1. Ihre Liste boolescher Werte ist mehr oder weniger statisch
  2. alle Ihre Zeilen haben alle diese booleschen Werte
  3. Ihre leistungskritische Suche besteht darin, Zeilen zu finden, in denen einer der Werte falsch ist

Dann ist die Verwendung von Textzeichenfolgen wie '1001010010' usw. eine gute Möglichkeit, sie zu speichern. So können Sie suchen

 WHERE flags <> '11111111'

um die benötigten Zeilen zu finden.

Sie könnten eine BINARY-Spalte mit einem Bit pro Flag verwenden. Ihre Tabelle ist jedoch einfacher für gelegentliche Abfragen und Augeninspektionen zu verwenden, wenn Sie Text verwenden. Die Platzersparnis durch die Verwendung von BINARY anstelle von CHAR wird nicht signifikant sein, bis Sie anfangen, viele Millionen Zeilen zu speichern.

bearbeiten Es muss gesagt werden:Jedes Mal, wenn ich so etwas mit Arrays von booleschen Attributen gebaut habe, war ich später enttäuscht darüber, wie unflexibel es sich herausstellte. Nehmen wir zum Beispiel an, es wäre ein Katalog mit Glühbirnen. Um die Jahrtausendwende waren die booleschen Flags vielleicht so etwas wie

screw base
halogen
mercury vapor
low voltage

Dann ändern sich die Dinge und ich benötige mehr boolesche Flags wie

LED
CFL 
dimmable
Energy Star

usw. Plötzlich sind meine Datentypen nicht groß genug, um das aufzunehmen, was ich brauche. Als ich schrieb "Ihre Liste von booleschen Werten ist mehr oder weniger statisch", meinte ich damit, dass Sie vernünftigerweise nicht erwarten, dass sich so etwas wie die Eigenschaften einer Glühbirne während der Lebensdauer Ihrer Anwendung ändern.

Also, eine separate Tabelle mit Attributen vielleicht eine bessere Lösung sein. Es hätte diese Spalten:

   item_id           fk to item table         -- pk
   attribute_id      attribute identifier     -- pk
   attribute_value   

Das ist letztlich flexibel. Sie können einfach neue Flags hinzufügen. Sie können sie während der Lebensdauer Ihrer Anwendung jederzeit zu vorhandenen oder neuen Elementen hinzufügen. Und nicht jeder Artikel benötigt dieselbe Sammlung von Flaggen. Sie können die Frage "Welche Artikel haben falsche Attribute?" schreiben. Abfrage wie folgt:

 SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0

Aber Sie müssen vorsichtig sein, denn die Abfrage "welche Elemente haben fehlende Attribute" ist viel schwieriger zu schreiben.