Si vous n'avez qu'une poignée de rôles, vous n'enregistrez même pas de stockage espace dans PostgreSQL . Un integer
la colonne utilise 4 octets, un bigint
8 octets. Les deux peuvent nécessiter un rembourrage d'alignement :
- Comprendre la taille des lignes Postgres
- Calculer et économiser de l'espace dans PostgreSQL
Un boolean
la colonne utilise 1 octet. En effet, vous pouvez adapter quatre colonnes booléennes ou plus pour un integer
colonne, huit ou plus pour un bigint
.
Tenez également compte du fait que NULL
les valeurs n'utilisent qu'un seul bit (simplifié) dans le bitmap NULL.
Les colonnes individuelles sont plus faciles à lire et à indexer . D'autres ont déjà commenté cela.
Vous pouvez toujours utiliser des index sur des expressions ou des index partiels pour contourner les problèmes d'index ("non-sargable"). Déclarations générales telles que :
la base de données ne peut pas utiliser d'index sur une requête comme celle-ci
ou
Ces conditions ne sont pas SARGables !
ne sont pas tout à fait vrais - peut-être pour d'autres RDBMS dépourvus de ces fonctionnalités.
Mais pourquoi contourner alors que vous pouvez complètement éviter le problème ?
Comme vous l'avez précisé, nous parlons de 6 types distincts (peut-être plus). Aller avec un boolean
individuel Colonnes. Vous économiserez probablement même de l'espace par rapport à un seul bigint
. L'espace requis semble sans importance dans ce cas.
Si ces drapeaux étaient mutuellement exclusifs , vous pouvez en utiliser un colonne de type enum
ou une petite table de recherche et une clé étrangère y faisant référence. (Éliminé dans la mise à jour de la question.)