it-swarm.com.de

Was ist der richtige Datentyp, um nur -1 0 und 1 in der Postgres-Spalte zu speichern?

  • Ich möchte nur 3 Zustände in einer Spalte speichern (wenn es 2 wäre, würde ich einen Booleschen Wert verwenden)
  • Ich habe überlegt, eine ENUM zu verwenden ('up', 'down', 'none'), aber es scheint, dass ENUMs einen erheblichen Platzbedarf haben
  • Gibt es eine bessere Möglichkeit, nur -1 0 und 1 in einer PostgresQL-Spalte zu speichern?
14
PirateApp

Wenn Sie Platz sparen möchten, können Sie den Datentyp "char" Verwenden. Es speichert ein einzelnes Byte.

sie können integer oder text in "char" umwandeln:

SELECT 'u'::"char", 'd'::"char", 'n'::"char";

 char | char | char 
------+------+------
 u    | d    | n
(1 row)

Eine Aufzählung verwendet 4 Bytes, da sie intern als real gespeichert ist.

Um Platz zu sparen, müssen Sie Ausrichtung berücksichtigen. Die Werte werden immer gemäß Typausrichtung ausgerichtet. Zum Beispiel muss ein bigint immer an einer Adresse beginnen, die durch 8 teilbar ist.

Nun, wenn Ihre Tabelle definiert ist als

CREATE TABLE (
   smallflag "char",
   largenum  bigint
);

zwischen den Spalten befinden sich 7 Auffüllbytes, wodurch alle Platzgewinne aus "char" moot gerendert werden.

Platzieren Sie Ihre Tabellenspalten daher sorgfältig.

20
Laurenz Albe

Ein bisschen hacken, aber wenn Sie die Spalte nullbar machen, können Sie trotzdem einen Bool mit einem Nullwert als drittem Wert verwenden.

Boolean verwendet jedoch immer noch 1 Byte in Postgres.

15
simon at rcl

Es gibt eine tinyint-Erweiterung, die Ganzzahlen von -128 bis 127 in einem einzelnen Byte Speicherplatz speichern kann. Derzeit ist jedoch ein Umschreiben erforderlich, um mit Postgres Version 11 und höher kompatibel zu sein.

https://github.com/umitanuki/tinyint-postgresql

Warum dieser Datentyp in den wichtigsten Postgres-Typen immer noch nicht verfügbar ist, war mir immer ein Rätsel.

1
Lucas