Il semble que vous ayez besoin d'un modèle de base de données semblable à celui-ci :
Ce modèle a les propriétés suivantes :
- Essentiellement, chaque recette est une série d'étapes.
- Chaque étape a son ordre par rapport aux autres étapes de la même recette (STEP_NO), une unité (masse, volume, comptage...), une quantité dans cette unité etc.
- Une étape particulière est liée soit à un ingrédient (lorsque INGREDIENT_ID n'est pas NULL) soit à une autre recette (lorsque SUBRECIPE_ID n'est pas NULL).
- En dehors de cela, STEP est une table de jonction assez standard implémentant une relation plusieurs à plusieurs, ce qui signifie que le même ingrédient peut être utilisé dans plusieurs recettes (ou même plusieurs étapes de la même recette) et qu'une recette peut également être une "sous-recette" de plusieurs autres recettes.
- Il s'agit essentiellement d'un graphe orienté. Le modèle de données lui-même n'empêchera pas les cycles - ils doivent être évités au niveau du code client et éventuellement détectés par des déclencheurs.
Si MySQL prend en charge les contraintes CHECK (ce qu'il ne fait pas ), vous pouvez vous assurer que l'un d'entre eux (mais pas les deux) n'est pas NULL comme ceci :
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Dans l'état actuel des choses, vous aurez besoin d'un déclencheur pour cela.