He estado aprendiendo sobre el bit string
tipo de datos últimamente, y tengo mucha curiosidad sobre:
Al final de esta página del documento está la oración:
... más 5 u 8 bytes de sobrecarga dependiendo de la longitud de la cadena
Cómo se manejan las cadenas de bits en otros lenguajes como PHP, Java, C #, C ++, etc., a través de controladores como Npgsql, ODBC, etc.
Para la pregunta n. ° 1, el uso de smallint o bigint será mucho más eficiente en el almacenamiento y tal vez ofrezca una ganancia de rendimiento ya que los enteros son compatibles en todas partes. La mayoría de los lenguajes de programación manejan operaciones de bits en enteros con facilidad. Si ese es el caso, ¿cuál es el punto de introducir el tipo de datos de cadena de bits? ¿Es solo para casos que necesitan una gran cantidad de máscaras de bits? ¿Quizás la indexación de campo de bits? Tengo más curiosidad acerca de cómo se realiza la indexación de campo de bits en PostgreSQL.
Para el # 2, estoy confundido, más que curioso. Por ejemplo, ¿qué pasa si almaceno máscaras de bits de día de la semana en un campo de bit (7), un bit por día, con el bit más bajo que representa el lunes. Luego consulto el valor en PHP y C ++. ¿Que voy a obtener? La documentación dice que tendré una cadena de bits, sin embargo, una cadena de bits no es algo que pueda usar directamente, como con los enteros. Entonces, en este caso, ¿debería renunciar al campo de bits?
¿Alguien puede explicar por qué y cuándo debo usar bit o bit variable?
fuente
Respuestas:
Si solo tiene algunas variables, consideraría mantener
boolean
columnas separadas .NULL
valores para bits individuales si lo necesita. Siempre puede definir columnasNOT NULL
si no lo hace.Optimizando el almacenamiento
Si tiene más de una mano de variables completas pero menos de 33, una
integer
columna puede servirle mejor. (O abigint
para hasta 64 variables).=
operador).bit string
oboolean
.Con incluso más variables, o si desea manipular mucho los valores, o si no tiene tablas enormes y espacio en disco / RAM no es un problema, o si no está seguro de qué elegir, lo consideraría
bit(n)
obit varying(n)
.Ejemplos
Para solo 3 bits de información, las
boolean
columnas individuales funcionan con 3 bytes,integer
necesita 4 bytes ybit string
6 bytes (5 + 1).Para 32 bits de información, un
integer
todavía necesita 4 bytes, unbit string
ocupa 9 bytes para el mismo (5 + 4) y lasboolean
columnas ocupan 32 bytes.Otras lecturas
fuente
Todos los tipos de PostgreSQL son útiles para algunas cosas y menos útiles para otras. En general, obtiene más de preocuparse por la funcionalidad primero y el rendimiento después. PostgreSQL tiene una gran cantidad de funciones para manipular varios tipos de tipos de datos y estos no son una excepción.
Esperaría en la capa de aplicación, a menos que su controlador db lo maneje a través de algún tipo de conversión de tipo, obtendrá una representación de cadena y tendrá que manejar esto. Por lo tanto, puede o no ser útil en esa capacidad.
Donde probablemente sea útil es cuando desea seleccionar registros basados en operaciones bit a bit, como bit a bit o bit a bit, o manipular los datos en consultas SQL. A menos que esté haciendo esto, muchas de las características más esotéricas de PostgreSQL son menos útiles.
Tenga en cuenta también que para cadenas más largas de información binaria hay una interfaz de objeto grande que le permite hacer streaming, etc. y una interfaz bytea que permite una representación de cadena más compacta.
tl; dr: Si lo necesitas lo sabrás. De lo contrario, archívelo en la sección "reservado para uso futuro" de su mente.
fuente