Pergunta

Duplicate possíveis:
Como você gosta suas chaves primárias?

Estou ciente dos benefícios de usar um GUID, bem como os benefícios de usar e INT como um PK em um banco de dados. Considerando que um GUID é em essência um pouco INT 128 e um INT normal é de 32 bits, o INT é um protetor de espaço (embora este ponto é geralmente discutível na maioria dos sistemas modernos).

No final, em que circunstâncias você se vê usando um INT como um PK contra um GUID?

Foi útil?

Solução

Kimberley Tripp (SQLSkills.com) tem um artigo sobre o uso como chaves primárias do GUID. Ela aconselha contra ele por causa da sobrecarga desnecessária.

Outras dicas

Além de ser uma má escolha quando você precisa sincronizar várias instâncias de banco de dados, do INT tem uma desvantagem eu não vi mencionado: inserções sempre ocorrem em uma extremidade da árvore índice. Isso aumenta a contenção de bloqueio quando você tem uma tabela com uma grande quantidade de movimento (desde as mesmas páginas de índice tem que ser modificado por inserções concorrentes, enquanto GUID do será inserido todo o índice). O índice pode também ter de ser reequilibrado com maior frequência se uma árvore B * ou estrutura de dados semelhante é usado.

É claro que, de int são mais fáceis sobre o olho ao fazer consultas manuais e construção relatório e consumo de espaço pode adicionar-se através de usos FK.

Eu estaria interessado em ver qualquer medição de quão bem por exemplo SQL Server realmente lida com mesas insert-pesados ??com a identidade PK.

Para responder à sua pergunta: No final, em que circunstâncias você se vê usando um INT como um PK contra um GUID?

Gostaria de usar um GUID se o meu sistema teria um online / versão offline que dentro da versão offline você pode salvar os dados e que os dados são transferidos de volta ao servidor um dia durante uma sincronia. Dessa forma, você tem certeza que você não vai ter a mesma tecla duas vezes dentro de seu banco de dados.

o INT é um protetor de espaço (embora isso ponto é geralmente discutível no mais moderno sistemas).

Não é assim. Pode parecer assim à primeira vista, mas nota que a chave primária de cada tabela será repetido várias vezes ao longo do banco de dados em índices e como chave estrangeira em outras tabelas. E vai ser envolvido em praticamente qualquer consulta que contém sua tabela -. E muito intensamente quando é uma chave estrangeira usada para uma join

Além disso, lembre-se que processadores modernos são muito, muito rápido, mas velocidades de RAM não acompanharam. comportamento de cache torna-se, portanto, cada vez mais importante. E a melhor maneira de obter um bom comportamento do cache é ter conjuntos de dados menores. Assim, a diferença aparentemente irrelevantes entre 4 e 16 bytes pode resultar em uma diferença notável na velocidade. Não necessariamente sempre -. Mas é algo a considerar

Temos Guids no nosso software empresarial muito complexo em todos os lugares. Funciona sem problemas.

Eu acredito Guids são semanticamente mais adequado para servir como identificadores. Também há nenhum ponto em desnecessariamente se preocupar com o desempenho até que você se depara com esse problema. Cuidado com otimização prematura.

Há também uma vantagem com a migração do banco de dados de qualquer tipo. Com Guids você não terá colisões. Se você tentar mesclar vários bancos de dados, onde ints são usados ??para a identidade, você terá que substituir seus valores. Se estes valores antigos foram usados ??em URLs, eles agora será diferente hit seguinte SEO.

Ao comparar valores como primária a relação de chave estrangeira, o INT será mais rápido. Se as tabelas são indexadas corretamente e as mesas são pequenos, você pode não ver muito de uma desaceleração, mas você tem que experimentar para ter certeza. INTs também são mais fáceis de ler, e se comunicar com outras pessoas. É muito mais simples dizer: "Você pode olhar para registro de 1234?" em vez de "Você pode olhar para registro 031E9502-E283-4F87-9049-CE0E5C76B658?"

Alguns sistemas operacionais não geram GUIDs mais baseado em características únicas de hardware (CPUID, MAC), porque ele fez rastreamento usuários fáceis (questões de privacidade). Isto significa que a singularidade GUID é muitas vezes não mais como universal como muitas pessoas pensam.

Se você usar alguma função auto-id do seu banco de dados, o banco de dados poderia, em teoria, tenha absoluta certeza de que não haja duplicação.

Se as vidas de dados em um único banco de dados (como a maioria dos dados para as aplicações que nós escrevemos em geral faz), então eu uso um IDENTITY. É fácil, destinado a ser utilizado dessa forma, não fragmentar o índice agrupado e é mais do que suficiente. Você vai correr para fora da sala em 2 bilhões de alguns registros (~ 4 bilhões, se você usar valores negativos), mas você seria brinde de qualquer maneira se você tivesse que muitos registros em uma tabela, e então você tem um armazenamento de dados problema.

Se as vidas de dados em vários bancos de dados, ou interfaces independentes com um serviço de terceiros, então eu vou usar o GUID que foi provavelmente já gerado. Um bom exemplo seria uma tabela UserProfiles no banco de dados que mapeia usuários no Active Directory para seus perfis de usuário na aplicação através do seu objectGUID que Active Directory atribuída a eles.

Se você está pensando em fundir banco de dados em algum momento, ou seja, para um multi-site tipo de replicação de configuração, Guid de vai economizar muita dor. Mas diferente do que eu acho do Int mais fácil.

Eu sempre penso PK deve ser numérico onde possble. Não se esqueça de ter GUIDs como um PK provavelmente significa que eles também são usados ??em outras tabelas como chaves foreign, então paginação eo índice etc será maior.

Eu acho que o banco de dados também é importante. De uma perspectiva MySQL -. Geralmente, menor o tipo de dados mais rápido o desempenho

Parece uma realidade para int vs GUID também - http://kccoder.com/mysql/uuid-vs-int-insert -Desempenho /

Gostaria de usar GUID como PK apenas se este limites fundamentais para valor semelhante. Por exemplo, ID de utilizador (utilizadores em WinNT são descreve com GUID), ou ID de grupo de utilizadores. Outro exemplo. Se você desenvolver sistema distribuído para a gestão de documentos e diferentes partes do sistema em locais diferentes em todo o mundo pode criar alguns documentos. Nesse caso eu iria usar GUID, porque garante que 2 documentos criados em diferentes partes do sistema distribuído não teria mesmo Id.

Um INT é certamente muito mais fácil de ler quando a depuração, e muito menor.

Gostaria, no entanto, usar um GUID ou similar, como uma chave de licença para um produto. Você sabe que vai ser único, e você sabe que não vai ser seqüencial.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top