【问题标题】:How to implement a many-to-many hierarchical structure in MySQL如何在 MySQL 中实现多对多层次结构
【发布时间】:2012-03-15 02:50:19
【问题描述】:

这是我的问题的后续:How to record sequential collections of records in MySQL

简而言之,我想在 MySQL 中实现一个食谱表和另一个指令表。配方是一系列连续的指令或其他配方。例如,您可以想象一个Peach_preserve 配方和一个使用Peach_preservePeach_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个属性组成的……

我的问题是:

  1. 在 db 中加入递归思想是个好主意吗?
  2. 如果是这样,这是这样做的方法,还是可以改进?

快速编辑:我开始阅读层次结构。在我的示例中,每个配方可以有多个父级。

【问题讨论】:

  • 这也称为分层查询或物料清单查询。它与在数据库中表示树有关。如果您还没有研究过这些术语,也许您应该这样做。有许多系统可以处理此类数据结构。
  • 不确定它是否是一棵树,因为每个孩子都可以有许多父母(即,给定的配方可以是多个配方的子组件)。
  • 它至少是一个 DAG(有向无环图)。是否是树取决于你对树的定义。我的显然允许一个节点有多个其他节点指向它;数学术语可能会排除这种情况(在 math.stackexchange.com 上讨论)。如果数据不是非循环数据结构,则数据中存在错误(但我敢打赌,很少有插入会检查非循环性 - 或任何批准的术语)。但是,它是一种 BOM(物料清单)类型的结构,其中(或多或少根据定义)可以在许多不同的组件中使用 6 毫米螺母之类的东西。

标签: mysql hierarchical-data


【解决方案1】:

这是一种非常常见的技术。它用于在 db 中存储分层数据(您称之为递归)。

但是,您必须管理应用程序的完整性,因为不能使用外键,因为关系取决于 isRecipe 标志。

【讨论】:

  • 即使isRecipe = T step_id 可以采用任何值,即使是 3,它也不是有效的配方 ID。这就是我所说的完整性,你不能用关系方法强制执行,但你必须在你的应用程序中这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2013-12-11
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多