我正在尝试建模包含以下表格的数据库:
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。但不是两个。
答案 0 :(得分:1)
您的解决方案看起来很好。一顿饭由不同的食物组成(例如一道用于主菜,一道用于沙拉)加上单一食物(例如用于甜点的苹果)。
另一种模拟方法是放弃表MealFoods
并改为制作单食。 (例如,一个苹果本身就是一个简单甜点的“食谱”。另一方面,盐不是。)
因此,使用此模型,您甚至可以防止将某些食物添加到餐食中。您也可以在模型中的Foods
中使用仅仅标记,也可以将苹果添加到餐中,而不是加入盐。但是,只要插入MealFoods
,就会依赖于你考虑标志,而在第二个模型中,你只能在膳食中添加食谱,这样可以更加安全。
更新:这是建议的模型。你看,我只删除了一张桌子。 (我把你添加的位置放在更新中)。诀窍在于您构建了一些“食谱”,这些“食谱”在RecipeFoods
中只有一个条目,例如一个苹果。
答案 1 :(得分:1)
我认为您在此处有一些相关的问题 - 它可能会帮助您以半正式语言指定业务领域。
我认为它类似于:
系统有很多餐。
一顿饭按顺序由一个...... 课程组成。
课程 成分 或 食谱。
食谱由1..n 成分(以及可能的说明)组成。
如果这是真的,那么您的第二个数据模型似乎没问题 - 但您必须考虑如何在数据库中建模继承 - 配方和成分都可以构成一个过程。 对于该问题没有单一的最佳解决方案,但您会在Stack Overflow上找到许多questions来帮助。
最后,您可能想要考虑课程是否可能由多个成分或配方组成的可能性,例如:汤和面包。