web-dev-qa-db-fra.com

Quel est le bon type de données pour stocker uniquement -1 0 et 1 dans la colonne postgres?

  • Je veux stocker seulement 3 états dans une colonne (si c'était 2, j'utiliserais un booléen)
  • J'ai envisagé d'utiliser un ENUM ("haut", "bas", "aucun") mais il semble que les ENUM prennent une place importante
  • Existe-t-il un meilleur moyen de stocker uniquement -1 0 et 1 dans une colonne PostgresQL?
14
PirateApp

Si vous souhaitez économiser de l'espace, vous pouvez utiliser le "char" Type de données. Il stocke un seul octet.

vous pouvez convertir integer ou text en "char":

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

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

Une énumération utilise 4 octets car elle est stockée en interne sous la forme d'un real.

Ce que vous faites pour économiser de l'espace, vous devrez prendre en compte alignement. Les valeurs sont toujours alignées selon type alignement. Par exemple, un bigint doit toujours commencer à une adresse divisible par 8.

Maintenant, si votre table est définie comme

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

il y aura 7 octets de remplissage entre les colonnes, ce qui rendrait tous les gains d'espace de "char" sans objet.

Placez donc soigneusement les colonnes de votre table.

20
Laurenz Albe

Un peu de hack, mais si vous rendez la colonne nullable, vous pouvez toujours utiliser un booléen, avec une valeur nulle comme troisième valeur.

Cependant, Boolean utilise toujours 1 octet dans Postgres.

15
simon at rcl

Il existe une extension tinyint qui peut stocker des entiers de -128 à 127 dans un seul octet d'espace, mais elle nécessite actuellement une réécriture pour être compatible avec postgres version 11 et supérieure.

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

Pourquoi ce type de données n'est toujours pas disponible dans les principaux types Postgres a toujours été un mystère pour moi.

1
Lucas