设计带循环引用的关系数据库

时间:2012-09-06 00:38:07

标签: mysql database database-design

想象一家面包店。我有一个产品表,与一个公式的表有一对多的关系,而公式又与成分有一对多的关系。问题是我有一个蛋糕,但其中一个成分是结霜本身就是一种产品(你不能将糖霜分解成单独的碎片,因为结霜被应用于许多东西和蛋糕上的糖霜量可能需要改变)。对于这样的设置,桌面设计是什么?

3 个答案:

答案 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