Parece que necesita un modelo de base de datos similar a este:
Este modelo tiene las siguientes propiedades:
- Esencialmente, cada receta es una serie de pasos.
- Cada paso tiene su orden relativo a otros pasos de la misma receta (STEP_NO), una unidad (masa, volumen, conteo...), una cantidad en esa unidad, etc.
- Un paso en particular está conectado a un ingrediente (cuando INGREDIENT_ID no es NULL) o a otra receta (cuando SUBRECIPE_ID no es NULL).
- Aparte de eso, STEP es una tabla de unión bastante estándar que implementa una relación de muchos a muchos, lo que significa que el mismo ingrediente se puede usar en varias recetas (o incluso en varios pasos de la misma receta) y también se puede usar una receta. una "receta secundaria" de muchas otras recetas.
- Esto es esencialmente un gráfico dirigido. El modelo de datos en sí no evitará los ciclos:deben evitarse en el nivel del código del cliente y posiblemente detectarse mediante disparadores.
Si MySQL admite restricciones CHECK (que no ), puede asegurarse de que uno (pero no ambos) de ellos no sea NULL como este:
CHECK (
(INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Tal como está, necesitarás un disparador para eso.