Sembra che tu abbia bisogno di un modello di database simile a questo:
Questo modello ha le seguenti proprietà:
- In sostanza, ogni ricetta è una serie di passaggi.
- Ogni passaggio ha il suo ordine relativo ad altri passaggi della stessa ricetta (STEP_NO), un'unità (massa, volume, conteggio...), una quantità in quell'unità ecc.
- Un passaggio particolare è collegato a un ingrediente (quando INGREDIENT_ID non è NULL) oa un'altra ricetta (quando SUBRECIPE_ID non è NULL).
- Oltre a questo, lo STEP è una tabella di giunzione abbastanza standard che implementa una relazione molti-a-molti, il che significa che lo stesso ingrediente può essere utilizzato in più ricette (o anche più passaggi della stessa ricetta) e anche una ricetta può essere una "sotto-ricetta" di più altre ricette.
- Questo è essenzialmente un grafo orientato. Il modello di dati stesso non impedirà i cicli:dovrebbero essere evitati a livello di codice client ed eventualmente rilevati dai trigger.
Se MySQL supportava i vincoli CHECK (cosa che non ), potresti assicurarti che uno (ma non entrambi) di essi non sia NULL in questo modo:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Così com'è, avrai bisogno di un trigger per questo.