sql >> Database >  >> RDS >> Mysql

Hoe 60 Booleans op te slaan in een MySQL-database?

Een aparte kolom per waarde is flexibeler als het gaat om zoeken.

Een aparte sleutel/waarde-tabel is flexibeler als verschillende rijen verschillende verzamelingen Booleaanse waarden hebben.

En, als

  1. je lijst met Booleaanse waarden is min of meer statisch
  2. al je rijen hebben al die Booleaanse waarden
  3. uw prestatiekritieke zoekopdracht is om rijen te vinden waarin een van de waarden onwaar is

dan is het gebruik van tekstreeksen zoals '100101010' enz. een goede manier om ze op te slaan. Je kunt zo zoeken

 WHERE flags <> '11111111'

om de rijen te vinden die u nodig hebt.

U kunt een BINARY-kolom gebruiken met één bit per vlag. Maar uw tabel is gemakkelijker te gebruiken voor informele vragen en oogcontrole als u tekst gebruikt. De ruimtebesparing door het gebruik van BINARY in plaats van CHAR zal niet significant zijn totdat u begint met het opslaan van vele miljoenen rijen.

bewerken Het moet gezegd worden:elke keer dat ik zoiets als dit heb gebouwd met arrays van Booleaanse attributen, was ik later teleurgesteld over hoe inflexibel het bleek te zijn. Stel dat het een catalogus van gloeilampen was. Aan het begin van het millennium waren de Booleaanse vlaggen misschien dingen als

screw base
halogen
mercury vapor
low voltage

Dan veranderen de dingen en merk ik dat ik meer Booleaanse vlaggen nodig heb, zoals,

LED
CFL 
dimmable
Energy Star

enz. Plotseling zijn mijn gegevenstypen niet groot genoeg om te bevatten wat ik nodig heb. Toen ik schreef "je lijst met booleaanse waarden is min of meer statisch" bedoelde ik dat je redelijkerwijs niet verwacht dat zoiets als de kenmerken van de gloeilamp veranderen tijdens de levensduur van je toepassing.

Dus een aparte tabel met attributen misschien een betere oplossing zijn. Het zou deze kolommen hebben:

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

Dit is uiteindelijk flexibel. U kunt gewoon nieuwe vlaggen toevoegen. U kunt ze op elk moment tijdens de looptijd van uw aanvraag toevoegen aan bestaande artikelen of aan nieuwe artikelen. En niet elk item heeft dezelfde verzameling vlaggen nodig. U kunt de "welke items hebben valse kenmerken?" schrijven. vraag als volgt:

 SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0

Maar je moet voorzichtig zijn, want de vraag "welke items hebben ontbrekende kenmerken" is een stuk moeilijker te schrijven.



  1. Plezier met (columnstore) compressie op een hele grote tafel – deel 2

  2. TIMESTAMP van MySQL gebruiken versus tijdstempels rechtstreeks opslaan

  3. Hoe kan ik veel zoekopdrachten op één pagina uitvoeren?

  4. MySQL:datumbereik uitbreiden naar nieuwe rijen