Parece que você precisa de um modelo de banco de dados semelhante a este:
Este modelo tem as seguintes propriedades:
- Essencialmente, cada receita é uma série de etapas.
- Cada etapa tem sua ordem em relação a outras etapas da mesma receita (STEP_NO), uma unidade (massa, volume, contagem...), uma quantidade nessa unidade etc.
- Uma etapa específica é conectada a um ingrediente (quando INGREDIENT_ID não é NULL) ou a outra receita (quando SUBRECIPE_ID é diferente de NULL).
- Além disso, o STEP é uma tabela de junção bastante padrão que implementa o relacionamento muitos-para-muitos, o que significa que o mesmo ingrediente pode ser usado em várias receitas (ou mesmo várias etapas da mesma receita) e também uma receita pode ser uma "sub-receita" de várias outras receitas.
- Esse é essencialmente um gráfico direcionado. O modelo de dados em si não evitará ciclos - eles devem ser evitados no nível do código do cliente e possivelmente detectados por gatilhos.
Se o MySQL suportar restrições CHECK (o que não ), você pode garantir que um (mas não ambos) seja não-NULL assim:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Como está, você precisará de um gatilho para isso.