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