Uma coluna separada por valor é mais flexível quando se trata de pesquisar.
Uma tabela de chave/valor separada é mais flexível se linhas diferentes tiverem coleções diferentes de valores booleanos.
E se
- sua lista de valores booleanos é mais ou menos estática
- todas as suas linhas têm todos esses valores booleanos
- sua pesquisa de desempenho crítico é encontrar linhas em que qualquer um dos valores seja falso
então usar strings de texto como '1001010010' etc é uma boa maneira de armazená-los. Você pode pesquisar assim
WHERE flags <> '11111111'
para encontrar as linhas que você precisa.
Você pode usar uma coluna BINARY com um bit por sinalizador. Mas sua tabela será mais fácil de usar para consultas casuais e inspeção visual se você usar texto. A economia de espaço com o uso de BINARY em vez de CHAR não será significativa até que você comece a armazenar muitos milhões de linhas.
editar É preciso dizer:toda vez que construí algo assim com arrays de atributos booleanos, mais tarde fiquei desapontado com o quão inflexível acabou sendo. Por exemplo, suponha que fosse um catálogo de lâmpadas. Na virada do milênio, as bandeiras booleanas podem ter sido coisas como
screw base
halogen
mercury vapor
low voltage
Então, as coisas mudam e eu me vejo precisando de mais sinalizadores booleanos, como,
LED
CFL
dimmable
Energy Star
etc. De repente, meus tipos de dados não são grandes o suficiente para conter o que eu preciso que eles mantenham. Quando escrevi "sua lista de valores booleanos é mais ou menos estática", quis dizer que você não espera que algo como as características da lâmpada mudem durante a vida útil do seu aplicativo.
Assim, uma tabela separada de atributos pode ser uma solução melhor. Teria essas colunas:
item_id fk to item table -- pk
attribute_id attribute identifier -- pk
attribute_value
Isso é, em última análise, flexível. Você pode simplesmente adicionar novos sinalizadores. Você pode adicioná-los a itens existentes ou a novos itens a qualquer momento durante a vida útil do seu aplicativo. E cada item não precisa da mesma coleção de sinalizadores. Você pode escrever o "quais itens têm algum atributo falso?" consulta assim:
SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0
Mas você precisa ter cuidado porque a consulta "quais itens têm atributos ausentes" é muito mais difícil de escrever.