AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 1910
Accepted
Jaco Briers
Jaco Briers
Asked: 2011-03-26 04:12:20 +0800 CST2011-03-26 04:12:20 +0800 CST 2011-03-26 04:12:20 +0800 CST

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

  • 772

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 string).

Entendo que usar um nvarchar (50) em vez de um int usaria muito mais espaço se estivesse vinculado a uma tabela com muitos registros.

Por outro lado, usar o valor de pesquisa diretamente basicamente nos pouparia de fazer uma junção. Posso imaginar que isso seria uma grande economia se a junção fosse sempre necessária (estamos trabalhando em um aplicativo da web, então 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 fazer"?

sql-server primary-key
  • 5 5 respostas
  • 10565 Views

5 respostas

  • Voted
  1. Best Answer
    Gaius
    2011-03-26T23:06:29+08:002011-03-26T23:06:29+08:00

    A resposta à sua pergunta é lógica, não física - o valor que você procura pode mudar por motivos comerciais. Por exemplo, se você indexar seus clientes por endereço de e-mail, o que acontece quando um endereço de e-mail muda? Obviamente, isso não se aplica a todas as suas tabelas de pesquisa, mas os benefícios de fazer isso da mesma maneira em todo o aplicativo é que isso torna seu código mais simples. Se tudo é inteiro → relações inteiras internamente, você está coberto.

    Apenas leia seu comentário para Sandy - talvez neste caso o que você realmente deseja seja um Check Constraint , não uma chave estrangeira/tabela de pesquisa, 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ê obterá:

    (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.
    

    Este é um método eficiente e de alto desempenho, mas a desvantagem é claro que adicionar um novo sabor significa uma mudança de código. Aconselho não fazer isso no aplicativo - porque você precisa fazer isso em todos os aplicativos que se conectam a esse banco de dados, esse é o design mais limpo possível porque há apenas um único caminho de código para fazer a validação.

    • 23
  2. CoderHawk
    2011-03-26T04:57:36+08:002011-03-26T04:57:36+08:00

    “Usando o valor de 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 a 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 Orders inclui um CustomerID indicando qual cliente fez o pedido. O CustomerID é uma chave estrangeira que aponta para um registro de cliente na tabela Clientes. Ao apresentar uma lista de Pedidos (da tabela Pedidos), você pode querer exibir o nome real do cliente, em oposição ao CustomerID. Como o nome do cliente está na tabela de clientes e você está apresentando dados da tabela Pedidos, é necessário criar uma tabela de pesquisa, que usa o valor CustomerID no registro Pedidos e usa esse valor para navegar no relacionamento e retornar o mais legível, nome do cliente.

    Você pode detalhar o propósito da sua tabela de pesquisa? é usado para armazenar alguns dados estáticos como os seguintes e esses registros não são uma entrada de outros registros de tabelas?

    tabela de sabores

    Orange  
    Pista  
    Mango
    

    Se a sua situação for acima, gostaria de recomendar 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.

    • 7
  3. dba4life
    2011-03-26T08:25:23+08:002011-03-26T08:25:23+08:00

    Como você qualificou sua pergunta com 'especificamente para uma tabela de pesquisa', a resposta provavelmente foi simplificada para 'economiza espaço'.

    Acho que se você remover esse qualificador, sua pergunta será 'Por que usar chaves substitutas em vez de chaves naturais?' Escrevi o seguinte em apoio às chaves substitutas:

    "Migrar um valor inteiro em vez de uma chave composta mais ampla tem vários benefícios. Ele fornece boa consistência em todo o modelo físico, em geral economiza mais espaço do que custa e reduz a E/S quando comparado à migração de chaves compostas; especialmente em um modelo normalizado. Além disso, eles simplificam a compreensão de um modelo e consultas de junções."

    Em grande parte, é por isso que "se tornou a coisa padrão a se fazer". O subproduto infeliz é que as pessoas usam uma chave substituta e não pensam quais são as chaves candidatas ... Mas agora estamos saindo da sua pergunta :)

    • 7
  4. Susan Kennedy
    2012-03-07T17:38:27+08:002012-03-07T17:38:27+08:00

    Uma das razões que 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 consulta usando os valores como chave primária precisará ser alterada na tabela de consulta e em todos os registros da tabela principal em que foi usada.

    • 3
  5. Vojta Rylko
    2011-12-19T13:01:38+08:002011-12-19T13:01:38+08:00

    Ao definir o ID, você também pode garantir a exclusividade. Mas quando você toma, por exemplo, e-mail, como identificador único, você transfere a responsabilidade de exclusividade para um terceiro lado não confiável.

    • 2

relate perguntas

  • Chaves primárias de caractere x número inteiro

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve