想象一家面包店。我有一个产品表,与一个公式的表有一对多的关系,而公式又与成分有一对多的关系。问题是我有一个蛋糕,但其中一个成分是结霜本身就是一种产品(你不能将糖霜分解成单独的碎片,因为结霜被应用于许多东西和蛋糕上的糖霜量可能需要改变)。对于这样的设置,桌面设计是什么?
答案 0 :(得分:3)
你的配料表中的两列如何,一个用于实际成分,另一个用于指示其他配方。只为任何给定的行设置一个。
使用两列也可以强制执行参照完整性。
答案 1 :(得分:2)
您所寻找的实际上是一种常见的数据库设计模式,称为物料清单。
这是一个很好的blog about bill of materials。
为了更容易使用这种设计所涉及的不平等树结构,您可以使用称为访问数字的物理实现技术,我在this question的答案中详细描述了这一点。< / p>
答案 2 :(得分:1)
似乎你只有两个对象:公式和东西。一个公式用其他东西来描述东西。一件东西可能是也可能不是产品。这是二进制属性:第三个表。该计划将类似于:
Stuff
-----
id : integer
name : string
FormulaPairs
------------
stuff_described_id : integer
ingredient_id : integer
amount : float
Product
-------
stuff_id : integer
示例查询:
获取Apple Pie的所有成分:
select ingredient_id from Stuff s inner join FormulaPairs p
where s.id == p.stuff_described_id and s.name == 'Apple Pie'
获取所有产品名称:
select name from Stuff s inner join Product p where s.id == p.stuff_id