Um pouco novo no uso de bancos de dados SQL padrão (atualmente trabalhando principalmente com MySQL), ainda não encontrei muitos usos disso.
Quando e por que é útil ter chaves negativas (ou melhor, assinadas) indexando uma tabela?
Um pouco novo no uso de bancos de dados SQL padrão (atualmente trabalhando principalmente com MySQL), ainda não encontrei muitos usos disso.
Quando e por que é útil ter chaves negativas (ou melhor, assinadas) indexando uma tabela?
Tudo o que uma chave primária é é um valor que determinamos ser o valor de extrema importância em um registro. Quer essa chave seja um int com sinal, um int sem sinal, uma string, um blob (na verdade, há limites) ou um UUID (ou qualquer outro nome que tenha hoje), o fato ainda é que é uma chave e que é a coisa de extrema importância.
Como não somos obrigados a usar apenas números orientados positivamente para nossas chaves, faz sentido considerar que um int assinado irá apenas para ~ 2 bilhões, enquanto um int não assinado irá para ~ 4 bilhões. Mas não há nada de errado em usar um int assinado, definindo o valor inicial para ~ -2 bilhões e definindo um incremento de um. Depois de aproximadamente 2 bilhões de registros, você atingirá "zero" e continuará até ~ 2 bilhões.
Por que seria útil ter "chaves negativas" em uma tabela, é a mesma questão de "por que é útil ter chaves em uma tabela". O "valor" de uma chave não tem impacto em seu status como chave. Uma chave é uma chave é uma chave.
O importante é se a chave é válida.
Quanto ao motivo pelo qual seria útil permitir chaves negativas, posso sugerir alguns motivos:
E se você quisesse indicar retornos em um sistema de vendas como números negativos de pedidos de vendas, que correspondiam ao número positivo de pedidos de vendas, facilitando assim a correlação (isso é ingênuo e mal projetado, mas funcionaria no sentido de uma "planilha").
E se você quisesse ter uma tabela de usuários e indicar que aqueles com números negativos eram controlados pelo sistema (o SO faz exatamente isso, para usuários de feed de bate-papo).
Eu poderia continuar, mas realmente a única razão pela qual o número negativo é importante é se você ou eu atribuímos importância a ele. Além disso, não há grande razão para que o valor de uma chave tenha influência sobre a própria chave.
Se estivermos falando sobre colunas de identidade ou numeração automática, o valor em si não deve ter significado. (às vezes sim, de acordo com os usuários de bate-papo do SO mencionados por drachenstern, o que eu já fiz antes)
No entanto, geralmente você perderia metade do seu intervalo se estiver usando números inteiros assinados.
Veja: O que fazer quando um campo em uma tabela se aproxima do número máximo de 32 bits assinados ou não assinados?
Outro exemplo: em pequenos cenários de replicação, usar valores negativos para um site e positivos para outro fornece algum conhecimento implícito da origem de qualquer linha.
Nem todos os sistemas de banco de dados oferecem suporte a tipos inteiros não assinados, sendo o MSSQL um dos que não oferece suporte. Nesses casos, valores negativos são possíveis em campos-chave inteiros simplesmente porque são possíveis no tipo (você pode usar regras ou gatilhos para bloqueá-los, como mostrado neste exemplo , mas provavelmente não há necessidade de adicionar a sobrecarga de aplicar essas regras a cada inters/atualização).
No que diz respeito ao banco de dados, o valor real de uma chave primária não importa, desde que seja exclusivo na tabela. Para ele -42 e 42 são apenas dois números diferentes da mesma forma que 42 e 69 são - o significado só será dado na negatividade ou não do valor pelo seu código.
Não oferecer suporte a tipos inteiros não assinados é provavelmente uma decisão de design baseada na redução da complexidade - ou seja, não querer que dois tipos inteiros de 32 bits diferentes se preocupem em verificar os intervalos ao atribuir valores entre eles. Ele limita o número de índices possíveis em um campo de incremento automático começando em 0 ou 1 pela metade do que seria possível em um tipo não assinado (~2e9 em vez de ~4e9), mas isso raramente é um problema significativo (se você provavelmente precisar uma série de valores-chave dessa magnitude, você provavelmente optou por um tipo de 64 bits, especialmente se estiver usando uma arquitetura de 64 bits, onde esses valores são processados de forma não menos eficiente do que os de 32 bits), embora se você quiser o intervalo completo e precisar para manter 32 bits por motivos de espaço, você pode iniciar o incremento em -2.147.483.647.