Eu tenho um aplicativo Django que usa PostgreSQL para analisar dados de tweets. O conjunto de dados aumenta em milhares de registros a cada solicitação. Estou usando o banco de dados principalmente como um cache, então planejei excluir todos os registros a cada 24 horas para permitir novas solicitações sem aumentar desnecessariamente o tamanho do banco de dados.
Django usa o SERIAL
tipo para armazenar os ids; um novo item recebe o próximo valor mais alto do último item que foi criado, em vez do primeiro número disponível. Não uso os ids para nada fora do ORM. Minha preocupação é que acabarei ficando sem espaço de chave em minha VM de 32 bits. O que o PostgreSQL faz quando o próximo valor é muito grande SERIAL
? Dá erro? Ele reverte para um?
TLDR : Se você tiver mais de 2 31 valores possíveis, altere o tipo de coluna para
BIGSERIAL
.Explicação :
O
SERIAL
tipo é um inteiro de 32 bits com sinal e foi projetado para valores menores que 2 31 ( NOTA: é 2 31 , não 2 32 , pois são inteiros com sinal ). Aqui está o trecho dos documentos do PostgreSQL:O comportamento de como ele lida com o estouro após 2 31 não é mencionado nos documentos, mas afirma claramente que você não deve usá-lo se espera ter valores maiores que isso.
SERIAL
as colunas são números de sequência. O servidor acompanha o valor anterior (o máximo anterior) e cada vez que um valor é solicitado, o valor é incrementado. Essa incrementação pode acontecer independentemente de o id ser realmente salvo permanentemente. Se a transação que buscou o id for revertida, o id será "perdido" e sua sequência terá buracos (por exemplo, lacunas de ids não utilizados). Não há nada de errado com isso e, se você estiver simplesmente usando-os como IDs exclusivos, ter lacunas não deve causar problemas.As sequências são implementadas assim para serem eficientes. O servidor só precisa acompanhar um valor (o máximo anterior) para gerar IDs exclusivamente, ele pode armazená-los em várias conexões para acelerar a geração de sequências e, ao permitir lacunas, nunca precisa bloquear transacionalmente o objeto de sequência ao gerar sequências . Isso os torna muito eficientes e simultâneos.
Basta mudar sua tabela de banco de dados para usar
BIGSERIAL
.