Het lijkt erop dat je een databasemodel nodig hebt dat lijkt op dit:
Dit model heeft de volgende eigenschappen:
- In wezen is elk recept een reeks stappen.
- Elke stap heeft zijn volgorde ten opzichte van andere stappen van hetzelfde recept (STEP_NO), een eenheid (massa, volume, aantal...), een hoeveelheid in die eenheid, enz.
- Een bepaalde stap is gekoppeld aan een ingrediënt (wanneer INGREDIENT_ID niet-NULL is) of aan een ander recept (wanneer SUBRECIPE_ID niet-NULL is).
- Anders dan dat, is de STEP een vrij standaard verbindingstabel die een veel-op-veel-relatie implementeert, wat betekent dat hetzelfde ingrediënt in meerdere recepten kan worden gebruikt (of zelfs meerdere stappen van hetzelfde recept) en dat een recept ook kan worden gebruikt. een "subrecept" van meerdere andere recepten.
- Dit is in wezen een gerichte graaf. Het datamodel zelf zal cycli niet voorkomen - ze moeten worden vermeden op het niveau van de klantcode en mogelijk gedetecteerd door triggers.
Als MySQL CHECK-beperkingen ondersteunde (wat het niet doet ), kunt u ervoor zorgen dat één (maar niet beide) niet-NULL is, zoals dit:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Zoals het er nu uitziet, heb je daar een trigger voor nodig.