sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar man 60 Booleans i en MySQL-databas?

En separat kolumn per värde är mer flexibel när det kommer till sökning.

En separat nyckel-/värdetabell är mer flexibel om olika rader har olika samlingar av booleska värden.

Och om

  1. din lista med booleska värden är mer eller mindre statisk
  2. alla dina rader har alla dessa booleska värden
  3. din prestationskritiska sökning är att hitta rader där något av värdena är falska

att använda textsträngar som '1001010010' etc är ett bra sätt att lagra dem. Du kan söka så här

 WHERE flags <> '11111111'

för att hitta de rader du behöver.

Du kan använda en BINÄR kolumn med en bit per flagga. Men ditt bord blir lättare att använda för tillfälliga frågor och ögonglobsinspektion om du använder text. Utrymmesbesparingarna genom att använda BINARY istället för CHAR kommer inte att bli betydande förrän du börjar lagra många miljoner rader.

redigera Det måste sägas:varje gång jag har byggt något sånt här med arrayer av booleska attribut har jag senare blivit besviken över hur oflexibelt det visade sig vara. Anta till exempel att det var en katalog med glödlampor. Vid millennieskiftet kan de booleska flaggorna ha varit något liknande

screw base
halogen
mercury vapor
low voltage

Sedan förändras saker och jag känner att jag behöver fler booleska flaggor, som,

LED
CFL 
dimmable
Energy Star

etc. Helt plötsligt är mina datatyper inte tillräckligt stora för att hålla vad jag behöver att de ska hålla. När jag skrev "din lista över booleska värden är mer eller mindre statisk" menade jag att du inte rimligen förväntar dig att något liknande glödlampans egenskaper förändras under din ansökans livstid.

Så en separat tabell med attribut kan vara en bättre lösning. Den skulle ha dessa kolumner:

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

Detta är ytterst flexibelt. Du kan bara lägga till nya flaggor. Du kan lägga till dem i befintliga objekt, eller till nya objekt, när som helst under din ansökans livstid. Och varje föremål behöver inte samma samling flaggor. Du kan skriva "vilka föremål har några falska attribut?" fråga så här:

 SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0

Men du måste vara försiktig eftersom frågan "vilka artiklar saknar attribut" är mycket svårare att skriva.



  1. Hur man får datumet från en sträng i Oracle

  2. Skillnaden mellan mysql, mysqladmin, mysqld

  3. Använda dataskyddad med ett Azure Key Vault från Linux

  4. XML-tabell med Oracle 11g