Pergunta

A situação atual é que os temas são classificadas por 3 categorias principais. Existe a possibilidade de adicionar mais do que apenas as 3 categorias, mas os superiores desejam implementar a capacidade de adicionar mais do que apenas uma categoria a um tópico.

Meu projeto db original tem o do categoryID como uma chave estrangeira na tabela de informações tópico. Que provavelmente foi uma má idéia desde o início, mas achei que eles foram criados em ter apenas 3 categorias e fazê-lo desta maneira permitiria menos consultas.

Assim, desde que eu posso ver Eu tenho duas opções agora: 1) Introduza o categoryID como uma vírgula separados cadeia que I analisar na extremidade php. 2) Reestruturar o DB e retire o categoryID em sua própria tabela de categoryID e TopicID.

Eu queria saber o que todos pensavam desta. Meu primeiro instinto foi o de reestruturar o banco de dados. Mas a primeira opção quando eu penso sobre isso é o mais fácil de implementar e menos propensos a quebrar alguma coisa existente, alterando a db ao redor. Isso também pode levar a de-normalização no entanto e abrir a possibilidade de dados inconsistentes.

Eu li o de-normalização é bom, desde que você aceita o risco de ter dados inconsistentes em troca de desempenho. Na sua opinião que vou ganhar muito em desempenho para este risco? Qualquer opinião sobre o que eu deveria fazer nesta situação seria apreciada.

Obrigado pela ajuda,
Levi

Foi útil?

Solução

Do desnormalização não confundir (um bom exemplo do que é manter o número de votos em questão SO junto com a pergunta ao contrário de cálculo que cada vez da tabela 'votação') com a abominação que é lista separada por vírgulas de IDs.

Modelo de uma adequada muitos-para-muitos relação; há apenas tantas coisas que pode (e vai) dar errado com a abordagem separada por vírgulas. Para citar alguns:

  1. No integridade referencial.
  2. Ao lado de impossível usar na junta.
  3. Impossível adequadamente índice; não escalável.

Outras dicas

Sua melhor opção seria ter um banco de dados, como você disse, de pares categoryID-TopicID para encontrar quais as categorias dos temas pertencem.

Você poderia fazê-lo para o outro lado explodindo as cordas em categoryID, mas quando você procurar os tópicos que estão em uma determinada categoria, você vai ter que correr através de cada campo e executar um COMO nele ... Muito mais recursos.

Aproveite o tempo para reestruturar a DB e você vai acabar com um resultado muito melhor.

Se você precisa fazer alguma coisa no DBMS com os itens individuais, faça não armazená-los em forma de lista. Isso fará com que suas consultas correr como um cão como suas tabelas de obter maiores. Claro, se você só está indo cada vez para tratar a lista como uma unidade, está tudo bem para armazená-los dessa forma.

Mas é melhor você ter certeza que você vai sempre tratar a lista como uma unidade, e sem batota, dizendo que eles são uma unidade e, em seguida, Spiltting-los separados em outro lugar - melhor deixar o DBMS fazer isso por você .

Você deve sempre fazer 3NF primeiro, em seguida, se, e somente se, você tem problemas de desempenho, denormalize para a velocidade.

Os campos que você está falando na pergunta não é o tipo que você estará tratando como uma unidade. Você vai precisar de fazer coisas para os elementos individuais nas listas, então eles devem ser quebradas em outra tabela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top