Quero saber por que devo usar um int como chave primária de uma tabela de pesquisa, em vez de apenas usar o valor de pesquisa como chave primária (que na maioria dos casos seria uma cadeia de caracteres).
Entendo que usar um nvarchar (50) em vez de um int usaria muito mais espaço se estiver vinculado a uma tabela com muitos registros.
Por outro lado, usar o valor da pesquisa diretamente basicamente nos pouparia em uma associação. Eu posso imaginar que isso seria uma grande economia se a associação for sempre necessária (estamos trabalhando em um aplicativo da web, portanto isso conta bastante).
Quais são as vantagens de usar uma chave primária int (especificamente para uma tabela de pesquisa), além de ser "a coisa padrão a se fazer"?
sql-server
primary-key
Jaco Briers
fonte
fonte
Respostas:
A resposta para sua pergunta é lógica, não física - o valor que você procura pode mudar por razões comerciais. Por exemplo, se você indexa seus clientes por endereço de email, o que acontece quando um endereço de email é alterado? Obviamente, isso não se aplicará a todas as suas tabelas de pesquisa, mas os benefícios de fazê-lo da mesma maneira em todo o aplicativo é que ele simplifica seu código. Se tudo for relações inteiras → inteiras internamente, você estará coberto.
Basta ler seu comentário para Sandy - talvez, neste caso, o que você realmente queira seja uma restrição de verificação , não uma tabela de chave / pesquisa estrangeira, por exemplo:
Execute isso e você obtém:
Esse é um método eficiente e de alto desempenho, mas a desvantagem é que adicionar um novo sabor significa uma alteração no código. Eu desaconselharia fazê-lo no aplicativo - porque você precisa fazê-lo em todos os aplicativos que se conectam a esse banco de dados, esse é o design mais limpo possível, pois existe apenas um único caminho de código para validação.
fonte
"Usando o valor da pesquisa diretamente" - é um pouco contraditório com o objetivo real da tabela de pesquisa. Por que você está mantendo essa mesa? Se não for uma pesquisa.
Pode ser que eu tenha entendido mal sua pergunta. Aqui está uma definição de tabela de pesquisa do msdn
Você pode elevar o objetivo da sua tabela de pesquisa? é usado para armazenar alguns dados estáticos como o seguinte e esses registros não são uma entrada de outros registros de tabelas?
Tabela de sabores
Se acima é a sua situação, eu recomendaria não usar a tabela de pesquisa; provavelmente codifique esses valores de lista em seu aplicativo da web. Dessa forma, você pode evitar consultas desnecessárias ao banco de dados.
fonte
Como você qualificou sua pergunta como 'especificamente para uma tabela de pesquisa', a resposta provavelmente foi simplificada para 'economizar espaço'.
Acho que se você remover esse qualificador, sua pergunta se tornará 'Por que usar chaves substitutas sobre chaves naturais?' Eu escrevi o seguinte em suporte a chaves substitutas:
"A migração de um valor inteiro, em vez de uma chave composta mais ampla, oferece vários benefícios. Ele oferece boa consistência em todo o modelo físico, economizando, em geral, mais espaço do que custa e reduzindo a E / S em comparação à migração de chaves compostas; normalizado. Além disso, eles simplificam o entendimento de um modelo e as junções de consulta ".
É por isso que "se tornou a coisa padrão a se fazer". O infeliz produto biológico é que as pessoas jogam uma chave substituta e não pensam quais são as chaves candidatas ... Mas agora estamos saindo da sua pergunta :)
fonte
Uma das razões pelas quais sempre uso é que, se alguém digitou incorretamente um valor na tabela de pesquisa, digamos Oraneg em vez de Orange, é muito fácil alterar o valor na tabela de pesquisa.
A tabela de pesquisa com uma chave primária numérica exigirá apenas que o valor seja alterado na tabela de pesquisa.
A tabela de pesquisa que usa os valores como chave primária precisará ser alterada na tabela de pesquisa e em todos os registros da tabela principal em que foi usada.
fonte
Ao definir o ID, você também pode garantir a exclusividade. Porém, quando você recebe, por exemplo, o email, como identificador exclusivo, move a responsabilidade da exclusividade para o terceiro lado não confiável.
fonte