Esta pergunta surge depois de ler um comentário nesta pergunta:
Ao criar uma tabela muitos-para-muitos, você deve criar uma chave primária composta nas duas colunas de chave estrangeira ou criar uma chave primária "ID" substituta automática de incremento automático e apenas colocar índices nas duas colunas FK (e talvez uma restrição única)? Quais são as implicações no desempenho para inserir novos registros / reindexação em cada caso?
Basicamente, isso:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
vs. isto:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
O comentarista diz:
tornar os dois IDs o PK significa que a tabela está classificada fisicamente no disco nessa ordem. Portanto, se inserirmos (Parte1 / Dispositivo1), (Parte1 / Dispositivo2), (Parte2 / Dispositivo3), (Parte 1 / Dispositivo3), o banco de dados terá que dividir a tabela e inserir a última entre as entradas 2 e 3. Para Em muitos registros, isso se torna muito problemático, pois envolve o embaralhamento de centenas, milhares ou milhões de registros toda vez que um é adicionado. Por outro lado, uma PK com incremento automático permite que os novos registros sejam alinhados até o final.
A razão pela qual estou perguntando é porque sempre fui inclinado a executar a chave primária composta sem a coluna de auto incremento substituto, mas não tenho certeza se a chave substituta é realmente mais eficiente.
fonte
Respostas:
Com um simples mapeamento de muitos para muitos de duas colunas, não vejo vantagem real em ter uma chave substituta. Ter uma chave primária ativada
(col1,col2)
é garantida exclusiva (assumindo que seuscol1
ecol2
valores nas tabelas referenciadas são exclusivos) e um índice separado em(col2,col1)
capturará os casos em que a ordem oposta seria executada mais rapidamente. O substituto é um desperdício de espaço.Você não precisará de índices nas colunas individuais, pois a tabela só deve ser usada para unir as duas tabelas referenciadas.
Esse comentário a que você se refere na pergunta não vale os elétrons que usa, na minha opinião. Parece que o autor acha que a tabela está armazenada em uma matriz, em vez de uma estrutura em árvore de múltiplas vias equilibrada de desempenho extremamente alto.
Para começar, nunca é necessário armazenar ou obter a tabela classificada, apenas o índice. E o índice não será armazenado sequencialmente, será armazenado de maneira eficiente para poder ser recuperado rapidamente.
Além disso, a grande maioria das tabelas de banco de dados é lida com muito mais frequência do que escrita. Isso torna qualquer coisa que você faz no lado selecionado muito mais relevante do que qualquer coisa no lado da inserção.
fonte
insert
que importa se isso é feito milhares de vezes por hora. Você não pode simplesmente ignorá-lo apenas porque a proporção deinsert
paraselect
é <1. Nesse caso, um cliente se preocupa com quanto tempo leva para fazer um pedido.Nenhuma chave substituta é necessária para tabelas de links.
Um PK ativado (col1, col2) e outro índice exclusivo (col2, col1) é tudo o que você precisa
A menos que você use um ORM que não possa lidar e dite o design do seu banco de dados para você ...
Edit: Eu respondi o mesmo aqui: SQL: Você precisa de uma chave primária auto-incremental para tabelas Many-Many?
fonte
(col2, col1)
não é(col1, col2)
. A PK de(col1, col2)
pode não ser adequada para todas as consultas e gerar varreduras, portanto, o inverso disso melhora o desempenho, pois permite buscas onde col2 é melhor. Por exemplo, validação FK quando a tabela com col2 tiver uma exclusão. A tabela filho smuts ser verificadaUma chave primária incremental pode ser necessária se a tabela for referenciada. Pode haver detalhes na tabela muitos-para-muitos que precisavam ser extraídos de outra tabela usando a chave primária incremental.
por exemplo
É fácil extrair os 'Outros detalhes' usando PartDevice.ID como o FK. Portanto, é necessário o uso de chave primária incremental.
fonte
A maneira mais curta e direta de responder à sua pergunta é dizer que haverá um impacto no desempenho se as duas tabelas vinculadas não tiverem chaves primárias sequenciais. Como você declarou / citado, o índice da tabela de links se fragmentará ou o DBMS trabalhará mais para inserir registros se a tabela de links não tiver sua própria chave primária seqüencial. Esse é o motivo pelo qual a maioria das pessoas coloca uma chave primária de incremento sequencial nas tabelas de links.
fonte
Portanto, parece que se o ÚNICO trabalho for vincular as duas tabelas, o melhor PK seria o PK de coluna dupla.
Porém, se isso servir a outros propósitos, adicione outro NDX como um PK com chaves estrangeiras e um segundo índice exclusivo.
Índice ou PK é a melhor maneira de garantir que não haja duplicatas. O PK permite que ferramentas como o Microsoft Management Studio façam parte do trabalho (criando visualizações) para você
fonte