Sieht so aus, als ob Sie ein ähnliches Datenbankmodell benötigen:
Dieses Modell hat die folgenden Eigenschaften:
- Im Wesentlichen besteht jedes Rezept aus einer Reihe von Schritten.
- Jeder Schritt hat seine Reihenfolge relativ zu anderen Schritten desselben Rezepts (STEP_NO), eine Einheit (Masse, Volumen, Anzahl...), eine Menge in dieser Einheit usw.
- Ein bestimmter Schritt ist entweder mit einer Zutat (wenn INGREDIENT_ID nicht NULL ist) oder mit einem anderen Rezept (wenn SUBRECIPE_ID nicht NULL ist) verbunden.
- Abgesehen davon ist der STEP eine ziemlich standardmäßige Verknüpfungstabelle, die eine Viele-zu-Viele-Beziehung implementiert, was bedeutet, dass dieselbe Zutat in mehreren Rezepten (oder sogar mehreren Schritten desselben Rezepts) und auch in einem Rezept verwendet werden kann ein "Unterrezept" mehrerer anderer Rezepte.
- Dies ist im Wesentlichen ein gerichteter Graph. Das Datenmodell selbst wird Zyklen nicht verhindern - sie sollten auf Client-Code-Ebene vermieden und möglicherweise durch Trigger erkannt werden.
Wenn MySQL CHECK-Einschränkungen unterstützt (was es nicht tut ). ), könnten Sie wie folgt sicherstellen, dass einer (aber nicht beide) davon nicht NULL ist:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
So wie es aussieht, brauchst du dafür einen Trigger.