Sim, existem consequências negativas para o uso de uma string em vez de um tipo numérico para uma Chave Primária, e ainda mais se o PK estiver em Cluster (o que de fato é o seu caso). No entanto, o grau em que você vê o (s) efeito (s) do uso de um campo de sequência é uma função de a) quantas linhas estão nesta tabela eb) quantas linhas em outras tabelas têm Chave Estrangeira para este PK. Se você tiver apenas 10k linhas nesta tabela e 100k linhas em algumas outras tabelas que FK a esta tabela através desse campo, talvez não seja tão perceptível. Mas esses efeitos certamente se tornam mais visíveis à medida que a contagem de linhas aumenta.
Você precisa considerar que os campos em um Índice de cluster são transferidos para índices não de cluster. Portanto, você não está apenas olhando até 40 bytes por linha, mas (40 * some_number) bytes. E em todas as tabelas FK, você tem os mesmos 40 bytes na linha e, mais frequentemente, haverá um índice Não-Clusterizado nesse campo, pois está sendo usado em JOINs, portanto, agora é realmente duplicado em todas as tabelas que FK este. Se alguém está inclinado a pensar que 40 bytes * 1 milhão de linhas * 10 cópias não são motivo de preocupação, consulte o meu artigo O disco é barato! ORLY? que detalha todas (ou pelo menos a maioria) das áreas afetadas por esta decisão.
A outra coisa a considerar é que filtrar e classificar strings, especialmente quando não estiver usando um agrupamento binário (presumo que você esteja usando o padrão de banco de dados que normalmente não diferencia maiúsculas de minúsculas) é muito menos eficiente (ou seja, leva mais tempo) do que quando usa INT
/ BIGINT
. Isso afeta todas as consultas que filtram / ingressam / classificam nesse campo.
Portanto, usar algo como CHAR(5)
provavelmente seria bom para um PK em cluster, mas principalmente se também fosse definido com COLLATE Latin1_General_100_BIN2
(ou algo parecido).
E o valor de [CODE]
alguma vez pode mudar? Se sim, é mais um motivo para não usá-lo como PK (mesmo que você defina os FKs ON UPDATE CASCADE
). Se não puder ou nunca mudar, tudo bem, mas ainda há motivos mais do que suficientes para não usá-lo como um PK em cluster.
Obviamente, a pergunta pode ser formulada incorretamente, pois parece que você já possui esse campo no seu PK.
Independentemente disso, sua melhor opção, de longe, é usar [ID_CODE]
como PK em cluster, usar esse campo em tabelas relacionadas como FK e manter [CODE]
como UNIQUE INDEX
(o que significa que é uma "chave alternativa").
Atualizar
Um pouco mais de informação com base nesta pergunta em um comentário a esta resposta:
[ID_CODE], como PRIMARY KEY, é a melhor opção se eu usar a coluna [CODE] para pesquisar a tabela?
Tudo isso depende de muitos fatores, alguns dos quais eu já mencionei, mas que reafirmaremos:
Uma Chave Primária é como a linha individual é identificada, independentemente de ser referenciada por Chaves Estrangeiras. Como o sistema identifica internamente a linha está relacionado, mas não necessariamente o mesmo, como seus usuários se identificam / nessa linha. Qualquer coluna NOT NULL com dados exclusivos pode funcionar, mas há questões de praticidade a serem consideradas, especialmente se a PK for, de fato, referenciada por quaisquer FKs. Por exemplo, os GUIDs são únicos e algumas pessoas realmente gostam de usá-los por vários motivos, mas são muito ruins para índices de cluster ( NEWSEQUENTIALID
é melhor, mas não perfeito). Por outro lado, os GUIDs são ótimos como chaves alternativas e são usados pelo aplicativo para procurar a linha, mas os JOINs ainda são feitos usando uma PK INT (ou similar).
Até agora, você não nos disse como o [CODE]
campo se encaixa no sistema de todos os ângulos, além de mencionar agora que é assim que você procura linhas, mas isso é para todas as consultas ou apenas algumas? Conseqüentemente:
Esta decisão não pode ser tomada puramente na questão de "NVARCHAR sim ou não?". Mais uma vez direi que, de um modo geral, não acho que seja uma boa ideia, mas certamente há momentos em que está bem. Dado tão poucos campos nesta tabela, não é provável que exista mais, ou pelo menos não muitos, índices. Portanto, você pode estar bem de qualquer maneira [CODE]
como o Índice de Cluster. E se nenhuma outra tabela fizer referência a essa tabela, você também poderá fazer o PK. Mas, se outras tabelas fizerem referência a essa tabela, eu optaria pelo [ID_CODE]
campo como PK, mesmo se Não estiver em cluster.