Si solo tiene un puñado de roles, ni siquiera guarda ningún almacenamiento espacio en PostgreSQL . Un integer
columna usa 4 bytes, un bigint
8 bytes Ambos pueden requerir relleno de alineación:
- Dar sentido a los tamaños de fila de Postgres
- Calcular y ahorrar espacio en PostgreSQL
Un boolean
la columna usa 1 byte. Efectivamente, puede ajustar cuatro o más columnas booleanas para un integer
columna, ocho o más para un bigint
.
También tenga en cuenta que NULL
los valores solo usan un bit (simplificado) en el mapa de bits NULL.
Las columnas individuales son más fáciles de leer e indexar . Otros ya han comentado sobre eso.
Todavía podría utilizar índices en expresiones o índices parciales para evitar problemas con índices ("no sargable"). Declaraciones generalizadas como:
la base de datos no puede usar índices en una consulta como esta
o
¡Estas condiciones no son SARGable!
son no del todo ciertas - tal vez para algunos otros RDBMS que carecen de estas características.
Pero, ¿por qué eludir cuando puede evitar el problema por completo?
Como has aclarado, estamos hablando de 6 tipos distintos (quizás más). Ir con boolean
individual columnas Probablemente incluso ahorre espacio en comparación con un bigint
. El requisito de espacio parece irrelevante en este caso.
Si estas banderas eran mutuamente excluyentes , podrías usar uno columna de tipo enum
o una pequeña tabla de consulta y una clave foránea que hace referencia a ella. (Se descartó en la actualización de la pregunta).