Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 层次结构/树数据-查找原点_Php_Mysql_Loops_Database Design_Hierarchical Data - Fatal编程技术网

Php 层次结构/树数据-查找原点

Php 层次结构/树数据-查找原点,php,mysql,loops,database-design,hierarchical-data,Php,Mysql,Loops,Database Design,Hierarchical Data,想象一棵树。我想追溯到这棵树上的任何一根树枝的树干,树枝中的树枝数量是无限的。没有多对多连接 我正在记录客户,并建立了一个表来显示哪个现有客户向我们推荐了一个新客户,因此这已经扩展到某种程度上的“家族树” 每次有新客户加入时,我都需要知道启动一切的树的原始客户 这是我桌子上的一个模型,展示了两个“家庭”,其中1个和11个分别位于树的顶部。在本例中,每个父项都有2个子项,每个数字都是客户合同号的外键 parents children 1 2 1 3 2 4 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之外有解决方案,或者通过重新设计表?我可以看到很快就会有数百代人,我不希望它开始变得太慢。

你要找的是。它允许在关系数据库中存储分层数据


看看这个,它会让你知道如何找到任何记录的
来源。本主题从幻灯片48开始,讨论处理树的技术


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

每当树遍历操作比更新速度更为关键时,就应该考虑嵌套集模型。你引用的那篇文章是一个很好的总结。