sql >> Database teknologi >  >> RDS >> Mysql

Hvordan gemmer man 60 Booleans i en MySQL-database?

En separat kolonne pr. værdi er mere fleksibel, når det kommer til søgning.

En separat nøgle-/værditabel er mere fleksibel, hvis forskellige rækker har forskellige samlinger af booleske værdier.

Og hvis

  1. din liste over boolske værdier er mere eller mindre statisk
  2. alle dine rækker har alle disse booleske værdier
  3. din præstationskritiske søgning er at finde rækker, hvor nogen af ​​værdierne er falske

så er det en god måde at gemme dem ved at bruge tekststrenge som '1001010010' osv. Du kan søge sådan her

 WHERE flags <> '11111111'

for at finde de rækker, du skal bruge.

Du kan bruge en BINÆR kolonne med en bit pr. flag. Men dit bord vil være lettere at bruge til afslappede forespørgsler og øjeæbleinspektion, hvis du bruger tekst. Pladsbesparelserne ved at bruge BINARY i stedet for CHAR vil ikke være betydelige, før du begynder at gemme mange millioner rækker.

rediger Det skal siges:hver gang jeg har bygget sådan noget med arrays af boolske attributter, er jeg senere blevet skuffet over, hvor ufleksibel det viste sig at være. Antag for eksempel, at det var et katalog over pærer. Ved årtusindskiftet kunne de boolske flag have været sådan noget som

screw base
halogen
mercury vapor
low voltage

Så ændrer tingene sig, og jeg har brug for flere booleske flag, som f.eks.

LED
CFL 
dimmable
Energy Star

osv. Pludselig er mine datatyper ikke store nok til at rumme det jeg skal have dem til. Da jeg skrev "din liste over boolske værdier er mere eller mindre statisk" mente jeg, at du ikke med rimelighed forventer, at noget som lyspærens egenskaber ændrer sig i løbet af din ansøgnings levetid.

Så en separat tabel med attributter måske være en bedre løsning. Det ville have disse kolonner:

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

Dette er i sidste ende fleksibelt. Du kan bare tilføje nye flag. Du kan tilføje dem til eksisterende elementer eller til nye elementer på et hvilket som helst tidspunkt i din ansøgnings levetid. Og hver genstand behøver ikke den samme samling af flag. Du kan skrive "hvilke varer har nogen falske attributter?" forespørgsel som denne:

 SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0

Men du skal være forsigtig, fordi forespørgslen "hvilke varer har manglende attributter" er meget sværere at skrive.



  1. Hvordan kører man SQL-script i MySQL?

  2. Hvad er det korrekte DateTime-format til MySQL-databasen?

  3. Er det muligt at slippe alle fremmednøglebegrænsninger på en tabel på én gang i mySQL 5?

  4. Kan ikke starte MySQL, port 3306 er optaget