0

我正在尝试将一个带有 Web 界面的 mysql 数据库放在一起。这需要显示一个项目的完整组成。例如:项目A由 5 个组件B、10 个组件C和一个组件D制成。组分B由1个子组分e、1个子组分f和10个子组分g组成。组件C由两个子组件组成:hi各一个。组件D没有子组件。当我为项目A输入数量(在 html/php 表单上)时. 我想对组件和子组件进行完整分解。在这个例子中,我需要 10 A。我的输出应该是这样的:

B - 50 包括:

  • e - 50
  • f - 50
  • 克 - 500
C - 100 包括:
  • h - 100
  • 我 - 100

D - 10

有人可以指出我正确的方向来开始选择这个吗?

4

1 回答 1

1

我会创建一个材料表来描述您的材料名称等。然后,我将有一个连接表,其中包含父材料 ID 的列和子材料 ID 的列以及所需的子材料的数量。

示例:材料 A 的 ID 为 1,材料 B 的 ID 为 2,材料 C 的 ID 为 3,材料 D 的 ID 为 4。如果您的材料 A 需要 1 部分材料 B 和 3 部分材料 C,则连接表中的条目会显示 [ 1(A 的 ID)、2(B 的 ID)、1(零件数)] 和 [1, 3, 3]。现在,假设材料 B 有 3 个部分 C 和 4 个部分 D,它将具有条目 [2 (B's id), 3 (c's id), 3 (parts)] 和 [2, 4 (d's id), 4 (部分)。将其拉出,您将从根 (A) 开始,向联接表询问所有具有父 ID = A 的 ID 的条目,然后对每个子材料 ID 执行相同的操作(向表询问所有条目子 id 作为父材料)等等。除非您指定某种最大深度,否则它必须是递归函数

潜在的问题是,如果你让材料 A 依赖于 B,而 B 依赖于 A,你将有无限递归。您必须进行一些严重的错误检查,以确保没有任何子项引用其树的更远的任何内容,因此它不会循环。创建这个错误检查可能是这个实现中最难的部分。

您的 select 语句将无法全部执行,因为 SQL(据我所知)并不真正支持递归,因此您可能希望创建一个参数化查询,例如“SELECT * FROM TheJoinTable WHERE parentId=?” 并一遍又一遍地运行它,直到返回的行数为 0。您还需要使此函数构建在嵌套数组上,然后您可以轻松地将其转换为页面的输出。

对于参数化查询,请查看 php 的 PDO 库。参数化查询也将解决许多 sql 注入问题,我认为这应该是一种普遍的做法。

我希望这不会太令人困惑...您的问题基本上是要求实现,我发现很难保持实现描述简短,当我尝试保持简短时,有时我最终会忘记提及某些内容。

于 2012-04-12T20:09:51.560 回答