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
- din liste over boolske værdier er mere eller mindre statisk
- alle dine rækker har alle disse booleske værdier
- 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.