【发布时间】:2012-03-15 02:50:19
【问题描述】:
这是我的问题的后续:How to record sequential collections of records in MySQL
简而言之,我想在 MySQL 中实现一个食谱表和另一个指令表。配方是一系列连续的指令或其他配方。例如,您可以想象一个Peach_preserve 配方和一个使用Peach_preserve 的Peach_tart,以及一系列其他步骤(指令)。 Peach_preserve 可用于许多其他食谱。
在我之前的问题中,有人向我推荐了一种设计,以允许配方中每条指令的特定顺序:
recipe
id name
1 Recipe1
2 Recipe2
recipe_instruction
recipe_id instruction_id sortorder
1 5 1
1 3 2
1 4 3
2 6 1
2 7 2
2 3 3
2 6 4
我现在想做的是结合这样的想法,即在一个配方中,一个子组件可能是另一个配方,而不是一个原子/离散指令。所以我的想法是这样做:
recipe
id name
1 Recipe1
2 Recipe2
recipe_instruction
recipe_id step_id isRecipe sortorder
1 5 F 1
1 3 F 2
1 4 F 3
2 1 F 1
2 1 T 2
2 2 F 3
2 1 F 4
这里你可以看到Recipe1由3条指令组成,Recipe2由一条指令组成,然后Recipe1,然后是另外2条指令,其中一个是重复步骤1的。我想到了捕捉这个想法的其他方法,但它们涉及一堆空条目。上面我不喜欢的是key是由4个属性组成的……
我的问题是:
- 在 db 中加入递归思想是个好主意吗?
- 如果是这样,这是这样做的方法,还是可以改进?
快速编辑:我开始阅读层次结构。在我的示例中,每个配方可以有多个父级。
【问题讨论】:
-
这也称为分层查询或物料清单查询。它与在数据库中表示树有关。如果您还没有研究过这些术语,也许您应该这样做。有许多系统可以处理此类数据结构。
-
不确定它是否是一棵树,因为每个孩子都可以有许多父母(即,给定的配方可以是多个配方的子组件)。
-
它至少是一个 DAG(有向无环图)。是否是树取决于你对树的定义。我的显然允许一个节点有多个其他节点指向它;数学术语可能会排除这种情况(在 math.stackexchange.com 上讨论)。如果数据不是非循环数据结构,则数据中存在错误(但我敢打赌,很少有插入会检查非循环性 - 或任何批准的术语)。但是,它是一种 BOM(物料清单)类型的结构,其中(或多或少根据定义)可以在许多不同的组件中使用 6 毫米螺母之类的东西。