Estou criando uma tabela de banco de dados e não tenho uma chave primária lógica atribuída a ela. Então, estou pensando em deixá-lo sem uma chave primária, mas estou me sentindo um pouco culpado por isso. Eu devo?
Cada tabela deve ter uma chave primária?
database
database-design
Daniel Silveira
fonte
fonte
Respostas:
Resposta curta: sim .
Resposta longa:
No MySQL, o mecanismo de armazenamento InnoDB sempre cria uma chave primária se você não a especificar explicitamente, criando assim uma coluna extra à qual você não tem acesso.
Observe que uma chave primária pode ser composta.
Se você tiver uma tabela de links muitos-para-muitos, crie a chave primária em todos os campos envolvidos no link. Assim, você garante que não possui dois ou mais registros descrevendo um link.
Além dos problemas de consistência lógica, a maioria dos mecanismos RDBMS se beneficiará da inclusão desses campos em um índice exclusivo.
E como qualquer chave primária envolve a criação de um índice exclusivo, você deve declará-lo e obter consistência e desempenho lógicos.
Veja este artigo no meu blog para saber por que você sempre deve criar um índice exclusivo de dados exclusivos:
PS Existem alguns casos muito, muito especiais em que você não precisa de uma chave primária.
Principalmente eles incluem tabelas de log que não têm quaisquer índices por motivos de desempenho.
fonte
Sempre é melhor ter uma chave primária. Dessa forma, ele atende à primeira forma normal e permite continuar no caminho de normalização do banco de dados .
Conforme declarado por outros, existem alguns motivos para não ter uma chave primária, mas a maioria não será prejudicada se houver uma chave primária.
fonte
Sempre que eu criei uma tabela sem uma chave primária, pensando que não precisaria de uma, acabei voltando e adicionando uma. Agora, crio até minhas tabelas de junção com um campo de identidade gerado automaticamente que eu uso como chave primária.
fonte
Exceto em alguns casos muito raros (possivelmente uma tabela de relacionamento muitos-para-muitos ou uma tabela que você usa temporariamente para carregar grandes quantidades de dados), eu diria o seguinte:
Marc
fonte
Você precisará associar esta tabela a outras tabelas? Você precisa de uma maneira de identificar exclusivamente um registro? Se a resposta for sim, você precisa de uma chave primária. Suponha que seus dados sejam algo como uma tabela de clientes com os nomes das pessoas que são clientes. Pode não haver uma chave natural porque você precisa dos endereços, e-mails, números de telefone etc. para determinar se Sally Smith é diferente da Sally Smith e você armazenará essas informações em tabelas relacionadas, pois a pessoa pode ter vários telefones, endereços , e-mails, etc. Suponha que Sally Smith se case com John Jones e se torne Sally Jones. Se você não tem uma chave artificial na mesa, quando atualiza o nome, você acabou de alterar 7 Sally Smiths para Sally Jones, mesmo que apenas uma delas se case e mude o nome dela.
Você diz que não possui chave natural e, portanto, também não possui nenhuma combinação de campo para tornar único, o que torna a chave artificial crítica.
Descobri a qualquer momento que não tenho uma chave natural, uma chave artificial é uma necessidade absoluta para manter a integridade dos dados. Se você possui uma chave natural, pode usá-la como o campo-chave. Mas pessoalmente, a menos que a chave natural seja um campo, ainda prefiro uma chave artificial e um índice exclusivo na chave natural. Você se arrependerá mais tarde se não colocar um.
fonte
Basta adicioná-lo, você se arrependerá mais tarde quando não o fizer (selecionar, excluir, vincular etc.)
fonte
É uma boa prática ter um PK em todas as mesas, mas não é DEVE. Provavelmente você precisará de um índice exclusivo e / ou de um cluster (que é PK ou não), dependendo da sua necessidade.
Confira as seções Chaves Primárias e Índices em Cluster nos Manuais Online (para SQL Server)
"As restrições PRIMARY KEY identificam a coluna ou o conjunto de colunas que possuem valores que identificam exclusivamente uma linha em uma tabela. Não há duas linhas em uma tabela que tenham o mesmo valor de chave primária. Você não pode inserir NULL para nenhuma coluna em uma chave primária. recomendamos usar uma coluna pequena e inteira como chave primária. Cada tabela deve ter uma chave primária. Uma coluna ou combinação de colunas que se qualificam como um valor de chave primária é chamada de chave candidata " .
Mas verifique isso também: http://www.aisintl.com/case/primary_and_foreign_key.html
fonte
Não concorde com a resposta sugerida. A resposta curta é: NÃO .
O objetivo da chave primária é identificar exclusivamente uma linha na tabela para formar um relacionamento com outra tabela. Tradicionalmente, um valor inteiro auto-incrementado é usado para essa finalidade, mas há variações para isso.
No entanto, existem casos, por exemplo, registro de dados de séries temporais, em que a existência de uma chave desse tipo simplesmente não é necessária e apenas ocupa memória. Tornar uma linha única é simplesmente ... não necessária!
Um pequeno exemplo: Tabela A: LogData
Nenhuma chave primária é necessária.
Tabela B: Usuário
Chave Primária (Id) necessária para ser usada como uma "chave estrangeira" na tabela LogData.
fonte
Eu sei que, para usar certos recursos do gridview no .NET, você precisa de uma chave primária para que o gridview saiba qual linha precisa ser atualizada / excluída. A prática geral deve ser ter uma chave primária ou um cluster de chaves primárias. Eu pessoalmente prefiro o primeiro.
fonte
Para torná-lo à prova do futuro, você realmente deveria. Se você deseja replicá-lo, precisará de um. Se você quiser se juntar a outra mesa, sua vida (e a dos pobres tolos que precisam mantê-la no próximo ano) será muito mais fácil.
fonte
Eu sempre tenho uma chave primária, mesmo que no começo ainda não tenha um objetivo em mente. Houve algumas vezes em que eu finalmente preciso de um PK em uma tabela que não tenha um e é sempre mais difícil colocá-lo mais tarde. Eu acho que há mais vantagens em incluir sempre uma.
fonte
Estou no papel de manter o aplicativo criado pela equipe de desenvolvimento offshore. Agora, estou tendo todos os tipos de problemas no aplicativo porque o esquema original do banco de dados não contém PRIMARY KEYS em algumas tabelas. Portanto, não deixe que outras pessoas sofram por causa de seu projeto inadequado. É sempre bom ter chaves primárias nas tabelas.
fonte
Em suma, não. No entanto, você precisa ter em mente que certas operações de CRUD de acesso do cliente exigem isso. Para provas futuras, costumo utilizar sempre chaves primárias.
fonte
Se você estiver usando o Hibernate, não será possível criar uma Entidade sem uma chave primária. Esses problemas podem criar problemas se você estiver trabalhando com um banco de dados existente criado com scripts sql / ddl simples e nenhuma chave primária foi adicionada
fonte