sql >> Base de Datos >  >> RDS >> Mysql

Diseñar una base de datos de recetas que debe incluir ingredientes y sub-recetas

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.