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

Mysql 循环引用关系数据库的设计,mysql,database,database-design,Mysql,Database,Database Design,想象一下一家面包店。我有一个产品表,它与配方表有一对多的关系,而配方表又与配料有一对多的关系。问题是我有一个蛋糕,但其中的一个成分是糖霜,它本身就是一种产品(你不能让糖霜分解成单独的碎片,因为糖霜应用于很多东西,蛋糕上的糖霜量可能需要改变)。这种设置的表格设计是什么?在配料表中有两列如何,一列是实际配料,另一列是指向其他配方的。任何给定行只设置一个 使用两列还可以强制执行引用完整性。似乎只有两个对象:公式和内容。公式用其他东西来描述东西。一件物品可能是产品,也可能不是产品。这是一个二进制属性:第

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

在配料表中有两列如何,一列是实际配料,另一列是指向其他配方的。任何给定行只设置一个


使用两列还可以强制执行引用完整性。

似乎只有两个对象:公式和内容。公式用其他东西来描述东西。一件物品可能是产品,也可能不是产品。这是一个二进制属性:第三个表。该计划大致如下:

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

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

Product
-------
stuff_id : integer
示例查询:

获取苹果派所有成分的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

实际上,您所寻找的是一种称为“物料清单”的通用数据库设计模式

这是一个好主意

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

“公式”与“配方”是一样的,对吗?同一产品可以有多个配方吗?也就是说,如果你用不同的方式做蛋糕,它是否仍然应该被视为同一个蛋糕的孩子?您的陈述:“与公式表具有一对多关系的产品”似乎表明了这一点,但我不确定您是在描述数据的基本属性,还是仅仅描述当前的数据库设计(这可能与数据的实际外观不同)。