2012-04-03 16 views
13

Estoy trabajando con una tabla en una base de datos PostgreSQL que tiene varias columnas booleanas que determinan algún estado (por ejemplo, published, visible, etc.). Quiero crear una sola columna de estado que almacene todos estos valores, así como posibles nuevos en forma de máscara de bits. ¿Hay alguna diferencia entre integer y bit(n) en este caso?¿Hay alguna diferencia entre los tipos de datos enteros y bits (n) para una máscara de bits?

Esta va a ser una tabla bastante grande, ya que almacena objetos que los usuarios crean a través de una interfaz web. Entonces creo que tendré que usar índices (parciales) para esta columna.

Respuesta

21

Si solo tiene algunas variables Consideraría mantener columnas boolean separadas.

  • La indexación es fácil. En particular, también indexes on expressions y partial indexes.
  • Las condiciones para las consultas son fáciles de escribir y leer, y tienen sentido.
  • Una columna booleana ocupa 1 byte (sin relleno de alineación). Por solo algunas variables, esto ocupa el menor espacio.
  • A diferencia de otras opciones boolean columnas permiten NULL valores para bits individuales si lo necesita. Siempre puede definir las columnas NOT NULL si no lo hace.

Si usted tiene más de una mano las variables completos pero no más de 32, una columna integer puede servir mejor. (O un bigint para hasta 64 variables.)

  • ocupa 4 bytes en el disco (puede requerir relleno de alineación, dependiendo de las columnas anteriores).
  • Indización muy rápida para coincidencias exactas (operador =).
  • El manejo de valores individuales puede ser más lento/menos conveniente que con varbit o boolean.

Con más variables, o si desea manipular los valores mucho, o si no tiene tablas enormes o espacio de disco/RAM no es un problema, o si no está seguro de qué elegir , Consideraría bit(n) or bit varying(n) (short: varbit(n).

Por tan sólo 3 bits de de información, individuo boolean columnas llegar a funcionar con 3 bytes, un integer Necesidades 4 bytes (tal vez relleno alineación adicional) y un bit string 6 bytes (5 + 1).

Para 32 bits de de información, un integer todavía necesita 4 bytes (+ relleno), un bit string ocupa 9 bytes para el mismo (5 + 4) y boolean columnas ocupan 32 bytes.

Para optimizar espacio en disco Además, debe comprender los mecanismos de almacenamiento de PostgreSQL, especialmente la alineación de datos. More in this related answer.

This answer sobre cómo transformar el tiposboolean, bit (n) y número entero pueden ser de ayuda, también.

+0

Muchas gracias por la explicación, ¡eso es exactamente lo que necesitaba! Creo que iré con una columna de 'enteros'. –

0

Puede aplicar el bit string functions directamente a una cadena de bits sin la necesidad de convertir desde un número entero.

Cuestiones relacionadas