Aqui está uma simplificação grosseira de uma configuração intensa com a qual estou trabalhando. table_1
e table_2
ambos têm incremento automático de chaves primárias substitutas como o ID. info
é uma tabela que contém informações sobre ambos table_1
e table_2
.
table_1 (id, field)
table_2 (id, field, field)
info ( ???, field)
Estou tentando decidir se devo criar a chave primária de info
um composto dos IDs de table_1
e table_2
. Se eu fizesse isso, qual deles faz mais sentido?
(neste exemplo, estou combinando o ID 11209 com o ID 437)
INT(9)
11209437 (eu posso imaginar por que isso é ruim)
VARCHAR (10)
11209-437
DECIMAL (10,4)
11209.437
Ou alguma outra coisa?
Seria bom usar isso como a chave primária em um banco de dados MYSQL MYISAM?
Respostas:
Eu usaria uma chave composta (multi-coluna).
Dessa forma, você pode ter t1ID e t2ID como chaves estrangeiras apontando para suas respectivas tabelas.
fonte
UPDATE info ... WHERE t1ID=11209 AND t2ID=437
?Eu não tornaria a chave primária da tabela "info" uma composição dos dois valores de outras tabelas.
Outros podem articular melhor os motivos, mas parece errado ter uma coluna que é realmente composta de duas informações. E se você quiser classificar o ID da segunda tabela por algum motivo? E se você quiser contar o número de vezes que um valor de qualquer tabela está presente?
Eu sempre os manteria como duas colunas distintas. Você pode usar uma chave primária de duas colunas no mysql ... PRIMARY KEY (id_a, id_b) ... mas eu prefiro usar um índice exclusivo de duas colunas e ter um campo de chave primária de incremento automático.
fonte
a sintaxe é
CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3)
por exemplo:CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
o exemplo acima funcionará se você estiver gravando enquanto estiver criando a tabela, por exemplo:
Para adicionar essa restrição a uma tabela existente, é necessário seguir a seguinte sintaxe
fonte
Suponha que você já tenha criado uma tabela agora, você pode usar esta consulta para criar chave primária composta
fonte
Além das preferências pessoais de design, há casos em que se deseja fazer uso de chaves primárias compostas. As tabelas podem ter dois ou mais campos que fornecem uma combinação exclusiva e não necessariamente por meio de chaves estrangeiras.
Como exemplo, cada estado dos EUA tem um conjunto de distritos congressionais exclusivos. Embora muitos estados possam ter um CD-5 individualmente, nunca haverá mais de um CD-5 em nenhum dos 50 estados e vice-versa. Portanto, a criação de um campo de numeração automática para o Massachusetts CD-5 seria redundante.
Se o banco de dados gerar uma página da web dinâmica, escrever código para consulta em uma combinação de dois campos pode ser muito mais simples do que extrair / reenviar uma chave com número automático.
Portanto, embora não responda à pergunta original, certamente aprecio a resposta direta de Adam.
fonte
Chaves primárias compostas são o que você deseja, onde deseja criar um relacionamento muitos para muitos com uma tabela de fatos. Por exemplo, você pode ter um pacote de aluguel de férias que inclui várias propriedades nele. Por outro lado, a propriedade também pode estar disponível como parte de vários pacotes de aluguel, por conta própria ou com outras propriedades. Nesse cenário, você estabelece o relacionamento entre a propriedade e o pacote de aluguel com uma tabela de fatos de propriedade / pacote. A associação entre uma propriedade e um pacote será única; você somente ingressará no usando property_id com a tabela de propriedades e / ou package_id com a tabela de pacotes. Cada relacionamento é único e uma chave de incremento automático é redundante, pois não será exibida em nenhuma outra tabela. Portanto, definir a chave composta é a resposta.
fonte
fonte
@AlexCuse Eu queria adicionar isso como comentário à sua resposta, mas desisti depois de fazer várias tentativas fracassadas de adicionar novas linhas nos comentários.
Dito isso, t1ID é único na tabela_1, mas isso não o torna exclusivo também na tabela INFO.
Por exemplo:
A tabela_1 possui:
Campo ID
1 A
2 B
A Tabela_2 possui:
Campo ID
1 X
2 Y
INFO pode ter:
t1ID campo t2ID
1 1 alguns
1 2 dados
2 1 em cada
2 2 linhas
Portanto, na tabela INFO para identificar exclusivamente uma linha, você precisa de t1ID e t2ID
fonte