Eu tenho lido sobre razões para usar ou não Guid
e int
.
int
é menor, mais rápido, fácil de lembrar, mantém uma sequência cronológica. E quanto a Guid
, a única vantagem que encontrei é que é único. Nesse caso, a Guid
seria melhor do que int
e por quê?
Pelo que vi, int
não tem falhas, exceto pelo limite de número, que em muitos casos é irrelevante.
Por que exatamente foi Guid
criado? Na verdade, acho que ele tem outro propósito além de servir como chave primária de uma tabela simples. (Algum exemplo de um aplicativo real usando Guid
algo?)
(Guid = UniqueIdentifier) no SQL Server
int
não tem falhas, exceto pelo limite de número, que em muitos casos é irrelevante.": na verdade, nesse contexto de INT vs GUID, o limite superior de um assinado de 32 bitsINT
é totalmente irrelevante, pois o limite superior de um sinal assinado , 64 bitsBIGINT
está muito além de quase todos os usos (ainda mais se você começar a numerar no limite inferior; e o mesmo vale paraINT
) e ainda tem a metade do tamanho de um GUID (8 bytes em vez de 16) e seqüencial.Respostas:
Isso foi solicitado no Stack Overflow aqui e aqui .
A publicação de Jeff explica muito sobre os prós e os contras do uso do GUID.
Se você tem certeza sobre o desempenho e não planeja replicar ou mesclar registros, use
int
e defina o incremento automático ( semente de identidade no SQL Server ).fonte
UNIQUEIDENTIFIER
maisINT
porqueINT
tem um limite superior é bastante pobre raciocínio desde que seja ilimitado, enquanto bem verdade, não é uma prática benefício. Você pode dobrar facilmente a capacidade efetiva de umINT
iniciando-o no limite inferior (-2,14 bilhões) em vez de em 1. Ou, se os 4,3 bilhões completos não forem suficientes, comece com umBIGINT
que ainda tem apenas 8 bytes, comparado a 16 para o GUID e é seqeuential.Se você estiver sincronizando seus dados com uma fonte externa, um GUID persistente pode ser muito melhor. Um exemplo rápido de onde estamos usando um GUIDs é uma ferramenta que é enviada ao cliente para rastrear sua rede e fazer certas classes de descoberta automática, armazenar os registros encontrados e, em seguida, todos os registros do cliente são integrados a um banco de dados central de volta ao nosso fim. Se usássemos um número inteiro, teríamos 7.398 "1" s, e seria muito mais difícil acompanhar qual "1" era qual.
fonte
Eu usei uma abordagem híbrida com sucesso. As tabelas contêm AMBOS uma
id
coluna inteira de chave primária de incremento automático E umaguid
coluna. Eleguid
pode ser usado conforme necessário para identificar globalmente a linha de maneira exclusiva eid
pode ser usado para consultas, classificação e identificação humana da linha.fonte
id
já é suficiente para os humanos identificarem uma linha?INT
PK. Acho estranho que essa abordagem não seja muito mais comum, pois é o melhor dos dois mundos. Parece que a maioria das pessoas prefere resolver problemas em termos muito absolutistas, sem perceber que o PK não precisa ser um GUID para que o aplicativo ainda use GUIDs para exclusividade e / ou portabilidade global.Algumas práticas recomendadas ainda mencionam que você deve usar um tipo de dados que acomode com menos memória possível todo o conjunto de valores que você usará. Por exemplo, se você o está usando para armazenar um número de empregadores em uma pequena empresa e é improvável que chegue a 100, ninguém sugeriria o uso de um valor bigint, enquanto o int (mesmo o smallint) faria.
Obviamente, a desvantagem disso é como "Diga não à escalabilidade!"
Além disso, eu sei que isso não está totalmente relacionado, mas há outro fator a respeito disso. Quando não é excessivo, geralmente tento recomendar o uso de uma chave primária não gerada automaticamente, se isso fizer sentido. Por exemplo, se você estiver salvando as informações do motorista, não se preocupe em criar uma nova coluna gerada automaticamente para "ID", basta usar o número da licença.Eu sei que isso parece realmente óbvio, mas vejo isso sendo esquecido com bastante frequência.Para contexto: esta parte da resposta foi abordada a partir de uma abordagem teórica de dados, na qual você deseja que seu PK seja o identificador exclusivo de dados de um registro. Na maioria das vezes, criamos aqueles quando eles já existem, daí a resposta anterior.
No entanto, é muito raro você ter um controle rígido sobre esses pontos de dados e, como tal, pode ser necessário fazer correções ou ajustes. Você não pode fazer isso com chaves primárias (bem, você pode, mas pode ser uma dor).
Obrigado @VahiD pelos esclarecimentos.
fonte
O uso de IDs de incremento automático pode vazar informações sobre sua atividade comercial. Se você administra uma loja e usa
order_id
para identificar publicamente uma compra, qualquer pessoa pode descobrir seu número mensal de vendas por aritmética simples.fonte
Outra coisa com como os GUIDs são gerados. mrdenny apontou corretamente que, mesmo que newsequentialid () esteja sendo usado, reiniciar as instâncias faz com que novos valores iniciem com os "buracos" deixados para trás no processamento anterior. Outra coisa que afeta os GUIDs "sequenciais" é a placa de rede. Se bem me lembro, o UID da NIC é usado como parte do algoritmo GUID. Se uma NIC for substituída, não há garantia de que o UID terá um valor mais alto para manter o aspecto seqüencial das coisas. Também não tenho certeza de como várias NICs podem afetar a atribuição de valores usando o algoritmo.
Apenas um pensamento e espero estar me lembrando corretamente. Tenha um ótimo dia!
fonte
Use ambos
Use int / Bigint para Chave Primária, pois é fácil manter e usar como relações de chave estrangeira.
Mas vincule uma coluna ao GUID para que cada linha também tenha uma coluna exclusiva
fonte
int
eguid
, como você sugere na sua resposta. Além disso, eu não estava falando sobre explicar sua sugestão apenas para mim - meu argumento era que você poderia querer atualizar sua resposta . A propósito, você sabe que outro respondente já sugeriu o mesmo (mais ou menos) que você ?