Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Projetar um banco de dados de receitas que precisa incluir ingredientes e sub-receitas


Parece que você precisa de um modelo de banco de dados semelhante a este:



Este modelo tem as seguintes propriedades:
  • Essencialmente, cada receita é uma série de etapas.
  • Cada etapa tem sua ordem em relação a outras etapas da mesma receita (STEP_NO), uma unidade (massa, volume, contagem...), uma quantidade nessa unidade etc.
  • Uma etapa específica é conectada a um ingrediente (quando INGREDIENT_ID não é NULL) ou a outra receita (quando SUBRECIPE_ID é diferente de NULL).
  • Além disso, o STEP é uma tabela de junção bastante padrão que implementa o relacionamento muitos-para-muitos, o que significa que o mesmo ingrediente pode ser usado em várias receitas (ou mesmo várias etapas da mesma receita) e também uma receita pode ser uma "sub-receita" de várias outras receitas.
  • Esse é essencialmente um gráfico direcionado. O modelo de dados em si não evitará ciclos - eles devem ser evitados no nível do código do cliente e possivelmente detectados por gatilhos.

Se o MySQL suportar restrições CHECK (o que não ), você pode garantir que um (mas não ambos) seja não-NULL assim:
CHECK (
    (INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
    OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)

Como está, você precisará de um gatilho para isso.