【问题标题】:Hierarchy/Tree Data - Finding origin层次结构/树数据 - 寻找原点
【发布时间】:2015-07-22 01:10:55
【问题描述】:

想象一棵树。给定那棵树上的任何树枝,我想追溯到树的树干,树枝中的树枝数量是无限的。没有多对多连接。

我正在记录客户,并设置了一个表格来显示哪个现有客户向我们推荐了一个新客户,因此这已经扩展到某种“家谱”。

每次有新客户加入时,我都需要了解最初的客户,该客户位于启动一切的树的起源处。

这是我的表格的模型,显示 2 个“家庭”,其中 1 和 11 分别位于树的顶部。在此示例中,每个父母都有 2 个孩子,每个数字都是客户合同号的外键。

parents children
1       2
1       3
2       4
2       5
3       6
3       7
11      12
11      13
12      14
12      15
13      16
13      17

到目前为止,我一直在使用 MySQL 和 PHP 循环来选择父级,其中子级具有特定的合同号,然后查看该父级是否是同一张表中的子级。我一直保持这个循环,直到没有行返回并且我得到答案。

我的问题是,这是最有效的方法吗,还是有 PHP 之外的解决方案,或者通过重新设计表格?我可以看到很快就会有数百个“世代”,我不希望它开始变得太慢。

【问题讨论】:

    标签: php mysql loops database-design hierarchical-data


    【解决方案1】:

    您正在寻找的是Nested set model。它允许将分层数据存储在关系数据库中。

    看看这个answer,它会让你知道如何找到任何记录的origin

    【讨论】:

    • 每当树遍历操作比更新对速度更重要时,都值得研究嵌套集模型。您引用的文章是一个很好的总结。
    【解决方案2】:

    Bill Karwin 制作了一个名为 SQL Antipatterns Strike Back 的漂亮幻灯片。主题从幻灯片 48 开始转向处理树木的技术。

    就个人而言,我喜欢闭表技术。它易于查询、高效且使用正确的触发器,无需维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      相关资源
      最近更新 更多