Det verkar som att du behöver en databasmodell som liknar denna:
Denna modell har följande egenskaper:
- I huvudsak är varje recept en serie steg.
- Varje steg har sin ordning i förhållande till andra steg i samma recept (STEP_NO), en enhet (massa, volym, antal...), en kvantitet i den enheten etc.
- Ett särskilt steg är kopplat antingen till en ingrediens (när INGREDIENT_ID är icke-NULL) eller till ett annat recept (när SUBRECIPE_ID är icke-NULL).
- För övrigt är STEG en ganska standardövergångstabell som implementerar många-till-många-relationer, vilket innebär att samma ingrediens kan användas i flera recept (eller till och med flera steg i samma recept) och även ett recept kan användas ett "underrecept" av flera andra recept.
- Detta är i huvudsak en riktad graf. Datamodellen i sig kommer inte att förhindra cykler - de bör undvikas på klientkodnivå och eventuellt upptäckas av utlösare.
Om MySQL stödde CHECK-begränsningar (vilket det inte gör ), kan du se till att en (men inte båda) av dem är icke-NULL så här:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Som det ser ut behöver du en trigger för det.