Det ser ud til, at du har brug for en databasemodel, der ligner denne:
Denne model har følgende egenskaber:
- I bund og grund er hver opskrift en række trin.
- Hvert trin har sin rækkefølge i forhold til andre trin i den samme opskrift (STEP_NO), en enhed (masse, volumen, antal...), en mængde i den pågældende enhed osv.
- Et bestemt trin er forbundet enten til en ingrediens (når INGREDIENT_ID ikke er NULL) eller til en anden opskrift (når SUBRECIPE_ID ikke er NULL).
- Udover det er STEP'et en ret standard junction-tabel, der implementerer mange-til-mange-forhold, hvilket betyder, at den samme ingrediens kan bruges i flere opskrifter (eller endda flere trin i den samme opskrift), og en opskrift kan også en "underopskrift" af flere andre opskrifter.
- Dette er i bund og grund en rettet graf. Selve datamodellen forhindrer ikke cyklusser - de bør undgås på klientkodeniveau og muligvis detekteres af triggere.
Hvis MySQL understøttede CHECK-begrænsninger (hvilket det ikke gør ), kan du sikre dig, at den ene (men ikke begge) er ikke-NULL som denne:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Som det ser ud, skal du bruge en trigger til det.