Oracle
 sql >> Database >  >> RDS >> Oracle

Qualche svantaggio per i bit flag nelle colonne del database?

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.)