Изглежда, че имате нужда от модел на база данни, подобен на този:
Този модел има следните свойства:
- По същество всяка рецепта е поредица от стъпки.
- Всяка стъпка има своя ред спрямо други стъпки от същата рецепта (STEP_NO), единица (маса, обем, брой...), количество в тази единица и т.н.
- Конкретна стъпка е свързана или със съставка (когато INGREDIENT_ID не е NULL), или с друга рецепта (когато SUBRECIPE_ID не е NULL).
- Освен това, STEP е доста стандартна съединителна маса, която реализира връзка много към много, което означава, че една и съща съставка може да се използва в множество рецепти (или дори няколко стъпки от една и съща рецепта), а също и рецепта може да бъде „подрецепта“ от множество други рецепти.
- Това по същество е насочена графика. Самият модел на данни няма да предотврати цикли – те трябва да се избягват на ниво клиентски код и евентуално да се откриват от тригери.
Ако MySQL поддържа CHECK ограничения (които не ), можете да се уверите, че един (но не и двата) от тях не е NULL, както следва:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Както е сега, ще ви трябва спусък за това.