AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 2895
Accepted
That Realtor Programmer Guy
That Realtor Programmer Guy
Asked: 2011-05-24 12:50:10 +0800 CST2011-05-24 12:50:10 +0800 CST 2011-05-24 12:50:10 +0800 CST

Para que servem as chaves negativas?

  • 772

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?

database-design database-recommendation
  • 3 3 respostas
  • 8209 Views

3 respostas

  • Voted
  1. Best Answer
    jcolebrand
    2011-05-24T13:28:06+08:002011-05-24T13:28:06+08:00

    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.

    • 14
  2. gbn
    2011-05-24T20:55:05+08:002011-05-24T20:55:05+08:00

    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.

    • 11
  3. David Spillett
    2011-05-25T01:24:00+08:002011-05-25T01:24:00+08:00

    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.

    • 9

relate perguntas

  • Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

  • Quais bancos de dados são recomendados para serem usados ​​como bancos de dados integrados?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve