Mysql
 sql >> Database >  >> RDS >> Mysql

Progettazione di un database di ricette che deve includere ingredienti e sotto-ricette

Sembra che tu abbia bisogno di un modello di database simile a questo:

Questo modello ha le seguenti proprietà:

  • In sostanza, ogni ricetta è una serie di passaggi.
  • Ogni passaggio ha il suo ordine relativo ad altri passaggi della stessa ricetta (STEP_NO), un'unità (massa, volume, conteggio...), una quantità in quell'unità ecc.
  • Un passaggio particolare è collegato a un ingrediente (quando INGREDIENT_ID non è NULL) oa un'altra ricetta (quando SUBRECIPE_ID non è NULL).
  • Oltre a questo, lo STEP è una tabella di giunzione abbastanza standard che implementa una relazione molti-a-molti, il che significa che lo stesso ingrediente può essere utilizzato in più ricette (o anche più passaggi della stessa ricetta) e anche una ricetta può essere una "sotto-ricetta" di più altre ricette.
  • Questo è essenzialmente un grafo orientato. Il modello di dati stesso non impedirà i cicli:dovrebbero essere evitati a livello di codice client ed eventualmente rilevati dai trigger.

Se MySQL supportava i vincoli CHECK (cosa che non ), potresti assicurarti che uno (ma non entrambi) di essi non sia NULL in questo modo:

CHECK (
    (INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
    OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)

Così com'è, avrai bisogno di un trigger per questo.