Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar 60 booleanos em um banco de dados MySQL?


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
  1. sua lista de valores booleanos é mais ou menos estática
  2. todas as suas linhas têm todos esses valores booleanos
  3. 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.