Por que usar um int como chave primária de uma tabela de pesquisa?


30

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"?


4
Você pode encontrar boas informações e talvez até a resposta necessária nas 2 perguntas anteriores: Existe algum benefício de uma chave primária que inclua todas as colunas da tabela? e Chaves primárias Caractere vs Inteiro .
Marian

Respostas:


23

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:

create table icecream (flavour varchar(10))
go
alter table icecream add constraint ck_flavour check (flavour in ('Orange', 'Pista', 'Mango'))
go
insert into icecream (flavour) values ('Orange')
go
insert into icecream (flavour) values ('Vanilla')
go

Execute isso e você obtém:

(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_flavour". The conflict occurred in database "GAIUSDB", table "dbo.icecream", column 'flavour'.
The statement has been terminated.

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.


@ Gaius- Bom exemplo ... Prefiro não usar a restrição de verificação para esse tipo de cenário; principal motivo para não ser sustentável (você apontou isso como uma desvantagem).
CoderHawk

11
@ Sandy Realmente depende dos dados, com que frequência eles serão alterados e onde mais serão usados. Por exemplo, se a restrição precisar ser imposta pelo banco de dados, mas os valores também puderem ser usados ​​para preencher um menu suspenso ou um relatório, uma chave estrangeira seria mais apropriada. De qualquer maneira, eu desaconselharia fazê-lo no aplicativo.
Gaius

7

"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

Uma tabela de pesquisa é usada para exibir informações de uma tabela com base no valor de um campo de chave estrangeira em outra tabela. Por exemplo, considere uma tabela de Pedidos em um banco de dados de vendas. Cada registro na tabela Pedidos inclui um Código do cliente indicando qual cliente fez o pedido. O CustomerID é uma chave estrangeira que aponta para um registro de cliente na tabela Customers. Ao apresentar uma lista de pedidos (na tabela Pedidos), convém exibir o nome real dos clientes, em oposição ao Código do cliente. Como o nome do cliente está na tabela customers e você está apresentando dados da tabela Orders, é necessário criar uma tabela de pesquisa, que aceita o valor CustomerID no registro Orders e usa esse valor para navegar no relacionamento e retornar mais legível, nome do cliente.

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

Orange  
Pista  
Mango

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.


11
ponto positivo, o objetivo da minha tabela de pesquisa é basicamente apenas impor os diferentes valores que uma coluna pode ter por meio de uma restrição de chave estrangeira. Concordo que codificá-lo no aplicativo pode ser outra maneira de lidar com isso.
Jaco Briers

@Jaco Briers - Veja Gaius resposta ... uso restrição CHECK ...
CoderHawk

7

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 :)


3

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.


2

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.