- Eu quero armazenar apenas 3 estados em uma coluna (se fosse 2, eu usaria um booleano)
- Eu considerei usar um ENUM('up', 'down', 'none') mas parece que os ENUMs ocupam um espaço significativo
- Existe uma maneira melhor de armazenar apenas -1 0 e 1 em uma coluna PostgresQL?
relate perguntas
-
Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo
-
Os procedimentos armazenados impedem a injeção de SQL?
-
Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?
-
Sequências Biológicas do UniProt no PostgreSQL
-
Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?
Se você quiser economizar espaço, você pode usar o
"char"
tipo de dados. Ele armazena um único byte.você pode lançar
integer
outext
para"char"
:Um enum usa 4 bytes, pois é armazenado internamente como um arquivo
real
.Você não deve usar
"char"
com caracteres não ASCII!O que você pretende economizar espaço, você terá que levar em conta o alinhamento . Os valores são sempre alinhados de acordo com o alinhamento do tipo . Por exemplo, a
bigint
sempre tem que começar em um endereço divisível por 8.Agora, se sua tabela estiver definida como
haverá 7 bytes de preenchimento entre as colunas, o que tornaria todos os ganhos de espaço
"char"
discutíveis.Portanto, coloque as colunas da sua tabela com cuidado.
Um pouco complicado, mas se você tornar a coluna anulável, você ainda pode usar um bool, com um valor nulo como o terceiro valor.
Boolean ainda usa 1 byte no Postgres, no entanto.
Existe uma extensão tinyint que pode armazenar inteiros de -128 a 127 em um único byte de espaço, mas atualmente requer uma reescrita para ser compatível com o postgres versão 11 e superior.
https://github.com/umitanuki/tinyint-postgresql
Por que esse tipo de dados ainda não está disponível nos principais tipos do Postgres sempre foi um mistério para mim.
Eu não sou realmente um especialista em Postgresql, mas verificando os documentos você poderia usar [var]char( n ) como alguém sugeriu. Ou se você estiver confortável trabalhando com valores de bits, você pode usar [var]bit( n ) que parece ser o menor possível. O tamanho do armazenamento para [var]bit( n ) é basicamente o número de bits arredondados para o próximo byte.
Para portabilidade: [var]char( n ) é (afaik) universalmente suportado, enquanto [var] bit( n ) às vezes é chamado de [var]binary(n)