3

想象一家面包店。我有一张产品表,该表与配方表具有一对多关系,而配方表又与成分具有一对多关系。问题是我有一个蛋糕,但其中一种成分是糖霜,它本身就是一种产品(你不能把糖霜分成单独的部分,因为糖霜适用于很多东西,而且蛋糕上的糖霜量可能需要更改)。像这样的设置的桌子设计是什么?

4

3 回答 3

3

成分表中的两列怎么样,一列用于实际成分,另一列指向其他食谱。对于任何给定的行,只会设置一个。

使用两列也可以强制执行参照完整性。

于 2012-09-06T01:10:12.743 回答
2

您正在寻找的实际上是一种常见的数据库设计模式,称为材料清单

这是一个关于物料清单的好博客。

为了更轻松地使用此类设计所涉及的非层次树结构,您可以使用一种称为访问数的物理实现技术,我在对这个问题的回答中对此进行了详细描述。

于 2012-09-06T11:51:26.390 回答
1

看起来你只有两个对象:公式和东西。一个公式用其他东西来描述东西。一件东西可能是也可能不是产品。这是一个二元属性:第三个表。该方案将类似于:

Stuff
-----
id : integer
name : string

FormulaPairs
------------
stuff_described_id : integer
ingredient_id : integer
amount : float

Product
-------
stuff_id : integer

示例查询:

获取 Apple Pie 的所有成分 ID:

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
于 2012-09-06T01:14:31.363 回答