sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar 60 booleanos en una base de datos MySQL?

Una columna separada por valor es más flexible cuando se trata de buscar.

Una tabla clave/valor separada es más flexible si diferentes filas tienen diferentes colecciones de valores booleanos.

Y, si

  1. su lista de valores booleanos es más o menos estática
  2. todas sus filas tienen todos esos valores booleanos
  3. su búsqueda crítica para el rendimiento es encontrar filas en las que alguno de los valores sea falso

luego, usar cadenas de texto como '1001010010', etc. es una buena manera de almacenarlas. Puedes buscar así

 WHERE flags <> '11111111'

para encontrar las filas que necesita.

Podría usar una columna BINARIA con un bit por bandera. Pero su tabla será más fácil de usar para consultas casuales e inspección visual si usa texto. El ahorro de espacio al usar BINARY en lugar de CHAR no será significativo hasta que comience a almacenar muchos millones de filas.

editar Hay que decirlo:cada vez que construí algo como esto con matrices de atributos booleanos, luego me decepcionó lo inflexible que resultó ser. Por ejemplo, supongamos que fuera un catálogo de bombillas. En el cambio de milenio, las banderas booleanas podrían haber sido cosas como

screw base
halogen
mercury vapor
low voltage

Luego, las cosas cambian y me encuentro necesitando más banderas booleanas, como,

LED
CFL 
dimmable
Energy Star

etc. De repente, mis tipos de datos no son lo suficientemente grandes para contener lo que necesito que contengan. Cuando escribí "su lista de valores booleanos es más o menos estática", quise decir que no espera razonablemente que algo como las características de la bombilla cambien durante la vida útil de su aplicación.

Por lo tanto, una tabla separada de atributos podría ser una mejor solución. Tendría estas columnas:

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

Esto es en última instancia flexible. Simplemente puede agregar nuevas banderas. Puede agregarlos a elementos existentes o a elementos nuevos en cualquier momento durante la vigencia de su aplicación. Y, cada artículo no necesita la misma colección de banderas. Puede escribir "¿qué elementos tienen atributos falsos?" consulta como esta:

 SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0

Pero debe tener cuidado porque la consulta "qué elementos tienen atributos faltantes" es mucho más difícil de escribir.