tenho uma tabela products
:
#products
ID | category | type | criteria1 | criteria2
, com category
e type
sendo chaves estrangeiras de outras tabelas.
Devo dividir esta tabela em category1_type1_products
, category1_type2_products
e assim por diante? Parece-me que deveria, porque agora na minha tabela, existem alguns milhares de entradas com o mesmo ID
e category
valor. Cargas de informações redundantes.
Além disso, uma consulta poderia ser executada mais rapidamente se o mysql não tivesse que pesquisar todas as linhas com a categoria específica e digitar primeiro. (certo?)
Esse é um comportamento de estruturação recomendado? Se não, e se minha tabela tiver 5 milhões de tuplas?
Não. Isso significaria que a tabela NAME contém DATA - você terá que modificar a estrutura do banco de dados (criar nova tabela) apenas para adicionar mais uma categoria ou tipo.
Se sua coluna de categoria/tipo for tinyint ou smallint (dependendo do número razoavelmente esperado de valores possíveis), então você realmente tem a normalização adequada em vigor. Se não houver dependência (funcional) entre duas chaves para categorias para duas linhas diferentes, esses dois valores não são uma redundância, mas uma maneira mínima de armazenar os dados reais.
Do ponto de vista do desempenho, a parte importante é a indexação adequada para suas consultas. Se você costuma pesquisar linhas com categoria e/ou tipo específico, deve ter um índice nessa coluna (ou índice composto em ambas as colunas e possivelmente outro) para otimizar essas consultas. Você deve ativar o log de consulta lenta e verificar periodicamente quais consultas estão demorando mais (você pode usar
pt-query-digest
para analisar o log) e otimizá-las (adicionando índices adequados e/ou reescrevendo as consultas).Quando você tem índices adequados no lugar, no caso proposto de várias tabelas, selecionar a tabela certa para ler levará aproximadamente o mesmo tempo que o MySQL precisa para "pular" para a parte certa do índice. (É um pouco simplista, mas o ponto é que selecionar a tabela certa para ler é uma sobrecarga em si).
Do ponto de vista do "esquema", eu ficaria mais preocupado com essas duas colunas
criteria1
e,criteria2
se esses forem seus nomes reais e uso, isso parece um possível problema - mas isso pode depender do seu caso de uso e pode ser realmente bom. Mas se houver alguma chance de você adicionar uma vezcriteria3
e outros, isso diria para você adicionar uma tabela separada para eles, uma linha por critério e FK à tabela atual.