Relacionamento muitos para muitos no design de banco de dados
-
16-09-2019 - |
Pergunta
Atualmente, tenho um banco de dados com duas tabelas chamadas artigos e tags. Para permitir que os artigos estejam em várias categorias, tenho muitos a muitos relacionamentos. É um erro ter esse design em termos de desempenho? Ou devo remover o relacionamento entre essas duas tabela e adicionar uma terceira tabela como uma ponte (articlestags)?
Solução
Não há nada inerentemente errado em ter um relacionamento muitos para muitos, você só precisa criar um Tabela de junção (que é a que parece que você está se referindo articlesTags
) para facilitar esse relacionamento.
Outras dicas
Você está vendo a diferença entre um design conceitual de banco de dados (o relacionamento n: n) e sua realização física. Não importa como você modela seu relacionamento n: n, você precisará da tabela de junção acima mencionada para fazê -la funcionar.
Não há nada de errado em modelar um relacionamento do mundo real o mais próximo possível do mundo real como uma declaração geral. A clareza é rei.
Quando se trata de qualquer pergunta de desempenho em qualquer sistema, a resposta geralmente se resume a "depende".
Se o seu problema de desempenho estiver relacionado às gravações, uma estrutura altamente normalizada é a melhor e você deseja essa tabela de junção. Você acaba escrevendo muito menos dados e isso pode acelerar substancialmente as coisas (embora você possa queimar essa vantagem tendo que fazer pesquisas antes de criar as inserções). A leitura das tabelas normalizadas individuais também pode ser muito rápida.
Se o seu problema estiver relacionado a leituras analíticas, uma estrutura desnormalizada será a melhor. As junções podem ser muito intensivas em desempenho se as tabelas forem grandes e os índices se espalharam. Você sacrifica muito espaço para ganhar muito tempo.
Em geral, você deseja examinar as especificidades da sua situação e pesar os prós e os contras de cada abordagem antes de decidir sobre uma solução. Pessoalmente, sempre achei melhor focar na clareza nos estágios iniciais e refatorar o desempenho se descobrir um problema mais tarde.
Existe um relacionamento de muitos para muitos em um modelo de relação, é apenas uma abstração da mente. Quando você o implementar, haverá uma tabela Artigos_to_tags onde você terá:
fk_article (número inteiro) fk_tag (número inteiro)
Não há problema em usar muitos para muitos relacionamentos. É frequentemente necessário.
E sim, não é possível criar muitos para muitos, sem usar uma terceira tabela.
Não há problema em ter um relacionamento de muitos para muitos, se é isso que os dados exigem, mas você deseja que uma terceira tabela o represente.