Wygląda na to, że potrzebujesz modelu bazy danych podobnego do tego:
Ten model ma następujące właściwości:
- Zasadniczo każdy przepis to seria kroków.
- Każdy krok ma swoją kolejność względem innych kroków tej samej receptury (STEP_NO), jednostkę (masa, objętość, liczba...), ilość w tej jednostce itp.
- Określony krok jest połączony albo ze składnikiem (gdy INGREDIENT_ID nie ma wartości NULL) albo z innym przepisem (gdy SUBRECIPE_ID ma wartość inną niż NULL).
- Poza tym, STEP jest dość standardową tabelą połączeń implementującą relację wiele-do-wielu, co oznacza, że ten sam składnik może być użyty w wielu recepturach (lub nawet w wielu krokach tej samej receptury), a receptura może być „podprzepis” wielu innych przepisów.
- Jest to zasadniczo wykres skierowany. Sam model danych nie zapobiegnie cyklom - należy ich unikać na poziomie kodu klienta i być może wykrywane przez wyzwalacze.
Jeśli MySQL obsługuje ograniczenia CHECK (czego nie obsługuje ), możesz upewnić się, że jeden (ale nie oba) z nich nie ma wartości NULL:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
W obecnej sytuacji potrzebujesz do tego wyzwalacza.