Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Irgendwelche Nachteile von Bit-Flags in Datenbankspalten?

Wenn Sie nur eine Handvoll Rollen haben, sparen Sie nicht einmal Speicherplatz Speicherplatz in PostgreSQL . Eine integer Spalte verwendet 4 Bytes, ein bigint 8 Byte. Beide erfordern möglicherweise ein Ausrichtungspolster:

  • Die Postgres-Zeilengrößen verstehen
  • Berechnen und Platz sparen in PostgreSQL

Ein boolean Spalte verwendet 1 Byte. Effektiv können Sie vier oder mehr boolesche Spalten für eine integer anpassen Spalte, acht oder mehr für einen bigint .

Berücksichtigen Sie auch diesen NULL Werte verwenden nur ein Bit (vereinfacht) in der NULL-Bitmap.

Einzelne Spalten sind einfacher zu lesen und indizieren . Andere haben das bereits kommentiert.

Sie könnten weiterhin Indizes für Ausdrücke oder Teilindizes verwenden, um Probleme mit Indizes zu umgehen ("non-sargable"). Verallgemeinerte Aussagen wie:

Die Datenbank kann bei einer Abfrage wie dieser keine Indizes verwenden

oder

Diese Bedingungen sind nicht SARG-fähig!

sind nicht ganz richtig - vielleicht für einige andere RDBMS, denen diese Funktionen fehlen.
Aber warum umgehen, wenn Sie das Problem ganz vermeiden können?

Wie Sie klargestellt haben, sprechen wir über 6 verschiedene Typen (vielleicht mehr). Gehen Sie mit individuellem boolean Säulen. Sie sparen wahrscheinlich sogar Platz im Vergleich zu einem bigint . Der Platzbedarf scheint in diesem Fall unerheblich.

Wenn diese Flags schlossen sich gegenseitig aus , könnten Sie eine verwenden Spalte vom Typ enum oder eine kleine Nachschlagetabelle und ein darauf verweisender Fremdschlüssel. (Bei fraglicher Aktualisierung ausgeschlossen.)