Vypadá to, že potřebujete databázový model podobný tomuto:
Tento model má následující vlastnosti:
- Každý recept je v podstatě série kroků.
- Každý krok má své pořadí vzhledem k ostatním krokům stejného receptu (STEP_NO), jednotku (hmotnost, objem, počet...), množství v dané jednotce atd.
- Konkrétní krok je spojen buď s přísadou (když INGREDIENT_ID nemá hodnotu NULL), nebo s jiným receptem (když SUBRECIPE_ID není s hodnotou NULL).
- Kromě toho je STEP poměrně standardní spojovací tabulkou implementující vztah many-to-many, což znamená, že stejnou přísadu lze použít ve více receptech (nebo dokonce ve více krocích stejného receptu) a také lze recept „dílčí recept“ z mnoha dalších receptů.
- Toto je v podstatě orientovaný graf. Datový model sám o sobě nezabrání cyklům – je třeba se jim vyhnout na úrovni klientského kódu a případně je detekovat spouštěče.
Pokud MySQL podporuje omezení CHECK (což ne ), můžete zajistit, že jeden (ale ne oba) z nich nebude NULL takto:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Ve stávající podobě k tomu budete potřebovat spoušť.