Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Entwerfen einer Rezeptdatenbank, die sowohl Zutaten als auch Teilrezepte enthalten muss

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.