Depende,
Quantas categorias você terá, com que frequência precisará atualizá-las?
Eu tomei a abordagem antes onde adicionei Enum, mas também escrevi um método estático em uma classe e armazenei os nomes válidos lá
class Item{
public static function get_categories()
{
// only works in php >=5.4 otherwise use return array('Category1'...);
return [
'Category1' => 'Category1',
'Category2' => 'Category2',
'Category3' => 'Category3'
];
}
}
Fazendo o acima você pode facilmente ter acesso ao array por Item::get_categories(), que deve corresponder aos valores no campo ENUM no banco de dados. Se você precisar adicionar mais categorias, adicione-as ao banco de dados e depois a esta função. Você pode usar isso para validar a escolha do usuário e gerar as opções de javascript.
No entanto!!!!
Você menciona uma propagação que preenche sua tabela, isso não seria capaz de atualizar facilmente seu ENUM para você.
Eu usaria um ENUM, porque
1). É fácil de setup2). É um pouco mais fácil do que juntar as duas mesas (mas JOINS são craques quando você as aprende)3). Se você usou uma tabela secundária, você (como você apontou) teria que pesquisar o valor dessa tabela primeiro e depois inserir, ou se a categoria foi usada em um menu suspenso, use o ID da categoria e seu nome para preencher o menu suspenso (eu faria assim)
Pensamento final
O desempenho de ambas as maneiras (tabela de consulta e ENUM) você nem perceberia a diferença, a menos que seu site estivesse muito, muito ocupado. Você ainda teria que atualizar a tabela de categorias com cada versão nos dois sentidos, mas seria um pouco mais fácil usar uma instrução INSERT em vez de uma ALTER TABLE
Seja qual for a maneira escolhida, se você não gostar, seria muito fácil atualizar seu código.
Espero que isso ajude e boa sorte
Lembre-se de Keep It Simple Stupid K.I.S.S