我正在尝试建模一个跟踪建筑复杂配方的数据库。
这是我到目前为止所做的。
下一站是创建一个模型来创建产品,方法是将多个配方中的部分组合成1个产品。例如,馅饼由面团的x amt,馅料的y amt和顶部的z amt组成。
面团分批生产10倍,填料分批生产15倍,顶部分批生产20z
其中一些组件是最终产品,无法真正组合以创建新产品(如Apple Pie)。
问题是其他组件可以与配方和配料中的部分组合,以制作另一种第三层产品。例如,10“蛋糕由3层10”蛋糕(3 10“蛋糕成分)+ X amt填充(配方)+ Y amt of Fondant(成分)组成。
如何构建一个代表制作馅饼和制作复杂蛋糕而没有大量重复的模型?
提前致谢。
答案 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 - 它可能引用两个表中的一个。