web-dev-qa-db-fra.com

Est-il logique de stocker quelques valeurs booléennes en tant que tableau?

J'ai une table avec cinq colonnes booléennes. Dans 90% plus des lignes, toutes les colonnes sont nuls. (False est équivalent à null pour moi.)

Au lieu d'avoir des colonnes booléennes, je pourrais avoir une colonne de tableau unique qui contient un tableau d'un type de données personnalisé énuméré et stockez donc uniquement les colonnes qui ne sont pas null.

Je me sens bizarre en utilisant des tableaux, mais mon collègue m'a signalé qu'il n'y a pas vraiment une raison forte contre les utiliser, et nous pourrions réellement voir des économies de leur utilisation car nous ne stockons pas de colonnes vides.

Y a-t-il des inconvénients pour utiliser un tableau? Spécifiquement: Est-ce qu'ils prendraient plus de place, prenaient-ils plus de temps pour interroger ou prévenir les fonctionnalités Postgres (E.G. Index gin) d'être utilisées?

5
Xodarap

Dans votre cas, je pense que vous pourriez envisager l'utilisation d'un type de données Type de cordes de bits . Par exemple, quelque chose comme:

CREATE TABLE yourtable (
   booleans bit[5] default B'00000',
   ... other fields ... )

Il est efficace en termes de mémoire et ne nécessite pas l'utilisation d'un type complexe comme un tableau PostgreSQL (en réalité , il est un tableau de bits), et plus , vous n'avez pas à accorder une attention particulière à la différence entre FALSE et NULL (et vous pouvez également définir le champ entier sur une valeur null, si vous en avez besoin).

2
Renzo