Eu tenho duas mesas:
- Usuário (nome de usuário, senha)
- Perfil (profileId, gênero, data de nascimento, ...)
Atualmente estou usando esta abordagem: cada registro de Perfil tem um campo denominado "userId" como chave estrangeira que se vincula à tabela User. Quando um usuário se registra, seu registro de Perfil é criado automaticamente.
Estou confuso com a minha sugestão de amigo: ter o campo "userId" como a chave primária e estrangeira e excluir o campo "profileId". Qual abordagem é melhor?
database
foreign-keys
primary-key
Duc Tran
fonte
fonte
Respostas:
As chaves estrangeiras são quase sempre "Permitir duplicatas", o que as tornaria inadequadas como chaves primárias.
Em vez disso, encontre um campo que identifique exclusivamente cada registro na tabela ou adicione um novo campo (um inteiro de incremento automático ou um GUID) para atuar como a chave primária.
A única exceção a isso são as tabelas com um relacionamento um para um , em que a chave estrangeira e a chave primária da tabela vinculada são uma e a mesma.
fonte
As chaves primárias sempre precisam ser exclusivas, as chaves estrangeiras precisam permitir valores não exclusivos se a tabela for uma relação um-para-muitos. É perfeitamente normal usar uma chave estrangeira como chave primária se a tabela estiver conectada por um relacionamento um para um, não um relacionamento um para muitos. Se você deseja que o mesmo registro de usuário tenha a possibilidade de ter mais de 1 registro de perfil relacionado, vá com uma chave primária separada, caso contrário, mantenha o que você tem.
fonte
Sim, é legal ter uma chave primária sendo uma chave estrangeira. Esta é uma construção rara, mas se aplica a:
uma relação 1: 1. As duas tabelas não podem ser mescladas em uma por causa de permissões e privilégios diferentes que se aplicam apenas no nível da tabela (em 2017, esse banco de dados seria estranho).
uma relação 1: 0..1. O perfil pode ou não existir, dependendo do tipo de usuário.
o desempenho é um problema, e o design atua como uma partição: a tabela de perfis raramente é acessada, hospedada em um disco separado ou tem uma política de fragmentação diferente em comparação com a tabela de usuários. Não faria sentido se o armazenamento sublinhado fosse colunar.
fonte
É geralmente considerado uma má prática ter um relacionamento pessoal. Isso ocorre porque você poderia apenas ter os dados representados em uma tabela e obter o mesmo resultado.
No entanto, há casos em que você pode não conseguir fazer essas alterações na tabela que está se referindo. Neste caso, não há problema em usar a chave estrangeira como chave primária. Pode ser útil ter uma chave composta consistindo em uma chave primária exclusiva de incremento automático e uma chave estrangeira.
Atualmente, estou trabalhando em um sistema em que os usuários podem fazer login e gerar um código de registro para usar com um aplicativo. Por motivos que não irei abordar, não consigo simplesmente adicionar as colunas necessárias à tabela de usuários. Portanto, estou percorrendo uma rota de um para um com a tabela de códigos.
fonte
Sim, uma chave estrangeira pode ser uma chave primária no caso de um relacionamento um para um entre essas tabelas
fonte
Eu não faria isso. Eu manteria a
profileID
como chave primária da tabelaProfile
Uma chave estrangeira é apenas uma restrição referencial entre duas tabelas
Alguém poderia argumentar que uma chave primária é necessária como alvo de quaisquer chaves estrangeiras que se refiram a ela em outras tabelas. Uma chave estrangeira é um conjunto de uma ou mais colunas em qualquer tabela (não necessariamente uma chave candidata, muito menos a chave primária dessa tabela) que pode conter os valores encontrados na (s) coluna (s) de chave primária de alguns outra mesa. Portanto, devemos ter uma chave primária para corresponder à chave estrangeira. Ou devemos? O único propósito da chave primária no par de chave primária / chave estrangeira é fornecer uma junção inequívoca - para manter a integridade referencial com respeito à tabela "estrangeira" que contém a chave primária referenciada. Isso garante que o valor ao qual a chave estrangeira se refere será sempre válido (ou nulo, se permitido).
http://www.aisintl.com/case/primary_and_foreign_key.html
fonte
Depende do negócio e do sistema.
Se o seu userId for exclusivo e será exclusivo o tempo todo, você pode usar o userId como sua chave primária. Mas se você quiser expandir seu sistema, isso tornará as coisas difíceis. Aconselho você a adicionar uma chave estrangeira no usuário da tabela para fazer um relacionamento com o perfil da tabela em vez de adicionar uma chave estrangeira no perfil da tabela.
fonte
Resposta curta: DEPENDE ... Nesse caso em particular, pode ser bom. No entanto, os especialistas não recomendam isso quase todas as vezes; incluindo o seu caso.
Por quê?
As chaves raramente são exclusivas em tabelas quando são estrangeiras (originadas em outra tabela) da tabela em questão. Por exemplo, um ID de item pode ser único em uma tabela de ITENS, mas não em uma tabela de PEDIDOS, uma vez que o mesmo tipo de item provavelmente existirá em outro pedido. Da mesma forma, os IDs de pedido podem ser únicos (podem) na tabela PEDIDOS, mas não em alguma outra tabela como ORDER_DETAILS, onde um pedido com vários itens de linha pode existir e para consultar um item específico em um pedido específico, você precisa da concatenação de dois FK (order_id e item_id) como o PK para esta tabela.
Não sou um especialista em DB, mas se você puder justificar logicamente para ter um valor gerado automaticamente como seu PK, eu faria isso. Se isso não for prático, uma concatenação de dois (ou talvez mais) FK pode servir como seu PK. MAS, não consigo pensar em nenhum caso em que um único valor FK possa ser justificado como o PK.
fonte