如何为小部件建模组件

时间:2017-09-30 06:16:01

标签: sql database many-to-many one-to-many data-modeling

我正在尝试建模一个跟踪建筑复杂配方的数据库。

这是我到目前为止所做的。

  • 表A - 食谱(Id,名称,描述,份量,时间,温度......等)
  • 表B - 成分(原料)
  • 表C - 配方成分(fk recipeID,fk成分ID,每个配方的成分量)
  • 表D - 配方步骤(fk配方ID,生产配方的步骤)

下一站是创建一个模型来创建产品,方法是将多个配方中的部分组合成1个产品。例如,馅饼由面团的x amt,馅料的y amt和顶部的z amt组成。

面团分批生产10倍,填料分批生产15倍,顶部分批生产20z

  • 表E组件(名称)
  • 表F Component_pieces(fk recipesID,amt)

其中一些组件是最终产品,无法真正组合以创建新产品(如Apple Pie)。

问题是其他组件可以与配方和配料中的部分组合,以制作另一种第三层产品。例如,10“蛋糕由3层10”蛋糕(3 10“蛋糕成分)+ X amt填充(配方)+ Y amt of Fondant(成分)组成。

如何构建一个代表制作馅饼和制作复杂蛋糕而没有大量重复的模型?

提前致谢。

1 个答案:

答案 0 :(得分:0)

基本问题是你有类似于面向对象设计模式中描述的复合模式的东西。也就是说,层次结构中的各个级别和节点可以填充不同类型的事物。例如,蛋糕可以包含单一成分,如面粉,糖,黄油等;或者在蛋糕层的情况下,它可以含有蛋糕,蛋糕本身也含有成分。

对于3层蛋糕问题,您有两个选项,这两个选项在关系数据库中都可行,因为级别不会太深。 (这在图表数据库中是明智的。)

选项1 - 如果10“蛋糕和3层蛋糕之间的关系不重要,那么只需省略10”蛋糕作为组分并储存成分。换句话说,只有一个食谱和它的成分,你生活在一些重复。当然,缺点是,如果10“蛋糕配方发生变化,那么您还必须评估是否要更换3层蛋糕。

选项2 - 如果关系很重要,则更改表C,使其引用更通用的组件而不是组件。这样,它可以包含另一个配方以及成分。而不是(fk recipeID和fk ingredientID),你将拥有(fk recipeID,fk componentTypeID和componentID)。 componentType将是两个值之一 - RECIPE或INGREDIENT。这就是为什么componentID本身不能是fk - 它可能引用两个表中的一个。