对膳食/食谱/食物数据库建模

时间:2017-03-30 10:21:16

标签: sql sql-server tsql

我正在尝试建模包含以下表格的数据库:

Meals (MealId)
MealRecipes (MealId, RecipeId)
MealFoods (MealId, FoodId)

Recipes (RecipeId)
RecipeFoods (RecipeId, FoodId)
Foods (FoodId)

食谱由N Foods(Apple,Salmon,...)组成

但是当我制作一顿饭时,它可以包含食谱(Salmond with vegetables),还有食物(Apple)......

我最大的问题是用食谱和食物制作膳食。

更新
一个重要的事情是食谱中的食谱/食物的顺序。所以另一种方法是:

Meals (MealId)
MealSteps (MealId, StepNumber, RecipeId, FoodId)

RecipeId或FoodId中的任何一个都可以为null。但不是两个。

2 个答案:

答案 0 :(得分:1)

您的解决方案看起来很好。一顿饭由不同的食物组成(例如一道用于主菜,一道用于沙拉)加上单一食物(例如用于甜点的苹果)。

另一种模拟方法是放弃表MealFoods并改为制作单食。 (例如,一个苹果本身就是一个简单甜点的“食谱”。另一方面,盐不是。)

因此,使用此模型,您甚至可以防止将某些食物添加到餐食中。您也可以在模型中的Foods中使用仅仅标记,也可以将苹果添加到餐中,而不是加入盐。但是,只要插入MealFoods,就会依赖于你考虑标志,而在第二个模型中,你只能在膳食中添加食谱,这样可以更加安全。

更新:这是建议的模型。你看,我只删除了一张桌子。 (我把你添加的位置放在更新中)。诀窍在于您构建了一些“食谱”,这些“食谱”在RecipeFoods中只有一个条目,例如一个苹果。

  • 用餐(MealId)
  • MealRecipes(MealId,RecipeId,position)
  • 食谱(RecipeId)
  • RecipeFoods(RecipeId,FoodId)
  • 食物(FoodId)

答案 1 :(得分:1)

我认为您在此处有一些相关的问题 - 它可能会帮助您以半正式语言指定业务领域。

认为它类似于:

  

系统有很多

     

一顿饭按顺序由一个...... 课程组成。

     

课程 成分 食谱

     

食谱由1..n 成分(以及可能的说明)组成。

如果这是真的,那么您的第二个数据模型似乎没问题 - 但您必须考虑如何在数据库中建模继承 - 配方和成分都可以构成一个过程。 对于该问题没有单一的最佳解决方案,但您会在Stack Overflow上找到许多questions来帮助。

最后,您可能想要考虑课程是否可能由多个成分或配方组成的可能性,例如:汤和面包。