Se hai solo una manciata di ruoli, non risparmi nemmeno alcuno spazio di archiviazione spazio in PostgreSQL . Un integer
la colonna utilizza 4 byte, un bigint
8 byte. Entrambi potrebbero richiedere il riempimento di allineamento:
- Dare un senso alle dimensioni delle righe di Postgres
- Calcolo e risparmio di spazio in PostgreSQL
Un boolean
la colonna utilizza 1 byte. In effetti, puoi adattare quattro o più colonne booleane per un integer
colonna, otto o più per un bigint
.
Tieni anche conto che NULL
i valori utilizzano solo un bit (semplificato) nella bitmap NULL.
Le singole colonne sono più facili da leggere e da indicizzare . Altri l'hanno già commentato.
Puoi comunque utilizzare indici su espressioni o indici parziali per aggirare i problemi con gli indici ("non sargable"). Dichiarazioni generalizzate come:
il database non può utilizzare gli indici su una query come questa
o
Queste condizioni non sono SARGable!
sono non del tutto vere - forse per alcuni altri RDBMS privi di queste funzionalità.
Ma perché aggirare quando puoi evitare del tutto il problema?
Come hai chiarito, stiamo parlando di 6 tipologie distinte (forse di più). Vai con boolean
individuale colonne. Probabilmente risparmierai anche spazio rispetto a un bigint
. Il requisito di spazio sembra irrilevante in questo caso.
Se questi flag erano mutuamente esclusivi , potresti usarne uno colonna di tipo enum
o una piccola tabella di ricerca e una chiave esterna che vi faccia riferimento. (Escluso nell'aggiornamento della domanda.)