Jump to content


- - - - -

Chave Primária Composta










3 respostas a este tópico

#1 Yueh

    Membro

  • Membros
  • PipPip
  • 25 posts
  • Estado:Amazonas

Adicionado 05 October 2004 - 09:32 AM

Olá. Estou com algumas dúvidas quanto ao uso de chaves primárias compostas. Gostaria da ajuda de DBA's e profissionais, por favor.

1. Há alguma restrição quanto ao tipo de atributos a serem escolhidos para formar uma chave primária composta? Por exemplo, ela só pode ser composta por atributos numéricos (p.ex. cod1 e cod2) ? Ou pode ser formada por um numérico e um texto(p.ex. data e nome)?

2.Existe alguma restrição para seu uso?

3. Gostaria de referências excelentes a respeito, pq eu li no Navathe mas achei muito superficial

Editado por Yueh, 05 October 2004 - 09:35 AM.


#2 OsmarJr

    Membro - Junior 1

  • Moderador
  • 276 posts
  • Sexo:Masculino
  • Estado:Paraná

Adicionado 05 October 2004 - 11:10 AM

Dê uma olhada neste texto:

Quote

Este é um texto do Graham Thorpe, a quem já solicitei autorização para traduzir, que coloco aqui para uma boa discussão. Os resultados serão devolvidos para ele, para atualização e melhoria do site.

Chaves Primárias

A função essencial da chave primária de uma tabela é identificar unicamente as suas linhas - nem mais nem menos. Cada valor de chave primária deve ser único dentro de uma tabela, de modo que o motor da base de dados possa saber a diferença entre as linhas. O mesmo valor de chave primária pode aparecer em outra tabela, mas não pode ser duplicado dentro dela. E a chave primária não pode ter um valor Nulo pois o motor de base de dados exige um valor para poder localizar o registro.

A segunda maior função da chave primária é fornecer um "gancho" para a criação de relacionamentos entre tabelas. Um campo chave primária é relacionado a um campo correspondente, a chave estrangeira, em outra tabela. Os valores da chave primária e da chave estrangeira são os mesmos para registros ligados por meio de um relacionamento.

A chave primária de uma tabela é sempre indexada. Não há exceções a esta regra. A chave primária deve ser idexada de forma que o motor da base de dados possa localizar rapidamente as linhas baseando-se nos valores das chaves. A sugestão que diz que a indexação de chaves primárias é opcional está totalmente errada.

Uma ID de Replicação é uma escolha terrível para chave primária. O Access fornece o tipo de dados Replication ID para identificar unicamente os registros em uma base de dados replicada. Uma Replicaton ID (que na verdade é um GUID, ou ID Globalmente Única) está garantida como sendo única no universo. Um número GUID é gerado a partir de diversos bits de informação, incluindo, entre outros, o nome do computador, a data e a hora e quantos bytes estão livres no Drive C:.

Números GUID são difíceis de ler. Você consegue dizer rapidamente se {8EC7B8E3-3B51-4C0C-8481-7AEEF9074EBE} e {8EC7B8E3-3B51-4C0C-8481-7AEEF9074FBE} têm o mesmo valor? (Não têm). Mas é fácil dizer que 7817 é diferente de 7819. Números GUID são difíceis de usar como chaves primárias pois são difíceis para nós, humanos, fazermos a comparação entre eles.

Além disso, um ID de Replicação ocupa 16 bytes de memórioa e de espaço em disco, enquanto que um inteiro longo utiliza apenas 4 bytes. Geralmente menor é melhor por que um computador trabalha 4 bytes muito mais rapidamente do que consegue trabalhar um Id de Replicação de 16 bytes. Computadores modernos da classe Pentium, usando Windows de 32 bytes pode "puxar" um valor inteiro longo em um único processo, onde são necessários pelo menos quatro ciclos para recuperar um valor de ID de Replicação. Ciclos de máquina se acumulam, tornando um aplicativo mais lento.

O comentário que uma ID de Replicação é a chave primária ideal porque "o campo será usado automaticamente como Identificação" não é correto. Não vejo nenhuma vantagem na utilização do tipo de dados ID de Replicação sobre a utilização de um tipo de dados inteiro longo. A Microsoft fornece o tipo de dados Autonumeração nas bases de dados Access (e o atributo Identity no SQL Server) para que tenhamos uma chave primária conveniente e eficiente para nossas tabelas.

Sei que algumas pessoas dizem que devemos utilizar sempre "chaves naturais" (números de CPF, Números de CNPJ, ID do Funcionário, etc) como chaves primárias, mas eu uso sempre campos Autonumeração ou Identity como minhas chaves primárias. As tabelas são compostas de elementos de dados e de criação. A criação inclui nomes de campos, índices, restrições (como as regras de validação) e definições de chaves. Na minha opinião a escolha da chave primária é uma decisão de criação e não tem nada a ver com os dados. Nunca existe a necessidade do usuário "ver" a chave primária. Ela existe apenas para identificar unicamente os registros e ancorar os relacionamentos entre as tabelas.

Autonumeração com inteiros longos são chaves primárias ideais, pois são automáticos, não podem ser alterados e, com certeza, são únicos em uma tabela.

Existe uma grande diferença, que poucos notam, entre chave primária (o indicador único do registro) e índice (qualquer parte do registro). A chave primária identifica o registro e o(s) índice(s) aceleram as consultas.

Sobre melhoria de desempenho e como o Jet trata índices (não sei se é para Access :) ) dê uma olhada neste artigo.

#3 Yueh

    Membro

  • Membros
  • PipPip
  • 25 posts
  • Estado:Amazonas

Adicionado 06 October 2004 - 11:05 AM

Obrigado pela indicação.
Acessei o artigo tb. Muito bom, Entendi a diferença entre índices e chave primária.
Mas eu gostaria de algo mais específico sobre a utilização de chaves primárias compostas.
É por que eu ouvi o absurdo de dizerem quem isso não existe. No entanto, tenho encontrado vários tutoriais e fontes falando sobre o tema. Mas para validar meu ponto de vista preciso de obras de autores renomados na área de BD, como o que vc citou. E ainda não encontrei algum que dê ênfase nesse detalhe.
Aceito mais indicações para pesquisa.
Obrigado pela sua atenção e pelo seu tempo.

Editado por Yueh, 06 October 2004 - 11:08 AM.


#4 Weber Marques

    Membro - Novato

  • Membros
  • Pip
  • 3 posts

Adicionado 02 July 2008 - 07:08 PM

Caros colegas!
Estou com um problema em um projeto.
Estou pegando um sistema de terceiros (desenvolvido em Microsoft SQL Server + Delphi + Cristal Reports) e passando esse sistema para PHP + MySQL.
Missão impossível? Nem tanto...rs
Mas agora que já modelei o novo sistema para ser compatível com o antigo (pois o cliente não pode perder os dados atuais) esbarrei num problema:

Tenho uma tabela chamada empresas, que obviamente tem campos do tipo: codigoEmpresa, razaoSocial, endereco, cnpj, inscricaoEstadual, etc...
O campo codigoEmpresa é auto incremento e chave primária.
O campo cnpj é um índice único.
O campo inscricaoEstadual é um índice único, porém podendo ser nulo.

Quando tentei executar o SQL para importar os dados, uma surpresa desagradável. O programador que desenvolveu o sistema antigo não tomou o cuidado de modelar o banco de dados, de maneira que tenho mais de uma empresa com o mesmo cnpj, causando erro de duplicidade.

Analisando os dados duplicados na chave cnpj, me veio a seguinte indagação:

CNPJ deve ser mesmo usado como campo chave única? Se for composta, será que tenho que criar um campo numérico chamado filial para fazer chave composta por cnpj e filial?

Se existir uma empresa com filiais, cada um terá seu cnpj, ou o cnpj é o mesmo para as filiais? E no caso da inscricaoEstadual e inscricaoMunicipal, como ficam?

Espero contar com a ajuda de vcs!
Forte abraço,
Weber





1 usuário(s) esta(ão) lendo este tópico

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)