Em vários CMS de código aberto, notei que há uma tabela separada para mapear duas tabelas relacionais. Como para categorias e produtos, há uma product_category_mapping
tabela separada . Esta tabela possui apenas uma chave primária e duas chaves estrangeiras das categorias e tabelas de produtos.
Minha pergunta é quais são os benefícios desse design de banco de dados, em vez de apenas vincular as tabelas diretamente, definindo uma chave estrangeira em ambas as tabelas? É apenas uma questão de conveniência?
fonte
Essa é uma maneira fácil de implementar relacionamentos muitos para muitos .
Considere estas duas tabelas:
Se você adicionar um
categoryID
campo aproduct
, cada produto poderá ter apenas uma categoria. Mas se tivermos algoproduct_category_mapping
assim:então podemos ter:
Portanto, o produto 1 é da categoria 1 e 2 e o produto 2 é da categoria 3 e 1, muitos produtos pertencem a muitas categorias e muitas categorias têm muitos produtos.
Como escreve o tdammers , essa tabela é frequentemente referida como tabela de links ou tabela de bridge, e eu até a vi referida como tabela HABTM, de HasAndBelongsToMany, que aparentemente é Ruby on Rails, fala de muitos para muitos. E a Wikipedia a chama de tabela de junção e tem mais alguns nomes para ela.
fonte
mappingID
chave, um cenário comum é acompanhar melhor as importações / exportações em massa, nas quais a tabela de junções contém muitas chaves estrangeiras.O motivo para usar uma tabela de mapeamento é eliminar a duplicação. Vá em frente e tente outra técnica de mapeamento. Você não poderá impedir a duplicação de dados sem eles.
E isso traz uma pergunta 2cd. Por que se preocupar em eliminar a duplicação? Então você só precisa editar os dados uma vez em um só lugar. Às vezes, há penalidades de desempenho para eliminar a duplicação. Outras vezes, há desempenho AUMENTADO para eliminar a duplicação. Por exemplo, é mais rápido preencher uma lista suspensa com valores de pesquisa normalizados do que selecionar valores duplicados distintos em uma tabela grande.
fonte