Php 谱系树

Php 谱系树,php,mysql,tree,hierarchical-data,Php,Mysql,Tree,Hierarchical Data,我正在尝试使用php和mysql创建一个存储和读取狗谱系的结构 我在stackoverflow上发现了这种结构,它似乎很有效: 这里有一个工作示例: 是否可以简单地检索以id开头的有序树或子树(例如4或5代) 编辑 我试图通过使用第一个表来获取数据……但由于生成了4-5代,因此产生的查询非常繁重。我担心数据库中有大量信息,获取谱系可能会非常缓慢,无法使用 SELECT t1.name AS lev1, t2.name as f, ff1.name as ff1, fm1.name as

我正在尝试使用php和mysql创建一个存储和读取狗谱系的结构

我在stackoverflow上发现了这种结构,它似乎很有效:

这里有一个工作示例:

是否可以简单地检索以id开头的有序树或子树(例如4或5代)

编辑

我试图通过使用第一个表来获取数据……但由于生成了4-5代,因此产生的查询非常繁重。我担心数据库中有大量信息,获取谱系可能会非常缓慢,无法使用

SELECT 
    t1.name AS lev1, t2.name as f, ff1.name as ff1, fm1.name as fm1, t3.name as m, 
    mf1.name as mf1, mm1.name as mm1, .......
FROM people AS t1
LEFT JOIN people AS t2  ON t2.id = t1.father_id
 LEFT JOIN people AS ff1 ON ff1.id = t2.father_id
 LEFT JOIN people AS fm1 ON fm1.id = t2.mother_id
   ...
LEFT JOIN people AS t3  ON t3.id = t1.mother_id
 LEFT JOIN people AS mf1 ON mf1.id = t3.father_id
 LEFT JOIN people AS mm1 ON mm1.id = t3.mother_id
    ...
WHERE t1.id = 6;

我对鱼类血统有一个非常重要的问题。我发现,将邻接列表(如您发布的)转储到专用的树生成器(如)是最好的解决方案。

这种类型可能更适合于数据存储风格。类似于facebook如何保持关系的层次结构


如果您已经下定决心要使用MySQL,那么您可能会通过使用递归搜索摆脱您的模式。因为你的树可以是可变深度的,你可以在给定的位置开始自连接,然后沿着一个分支“走”下去,直到你再也找不到后代为止。返回该分支并开始下一个分支。类似的过程也适用于遍历查找家长。

您的问题不容易解决。您可以查看(在知识共享许可下)my pedigree web应用程序,但请注意,这是测试版和德语版(抱歉!)。我知道这不容易解决..我正试图找到一些关于mysql限制使用的最佳结构的建议。请看我的答案,实际上我没有可能在Web服务器上安装其他软件,但树生成器我必须使用mysql似乎非常有用。我还想用递归的方法遍历树,但我认为使用php是必要的。你认为像我在编辑的问题中写的那样,单个查询更快,还是使用php递归函数管理的简单递归查询更快?使用预设查询会将你限制在一个固定的深度。如果这是可以接受的,那么它肯定比嵌套多个查询更容易。
SELECT 
    t1.name AS lev1, t2.name as f, ff1.name as ff1, fm1.name as fm1, t3.name as m, 
    mf1.name as mf1, mm1.name as mm1, .......
FROM people AS t1
LEFT JOIN people AS t2  ON t2.id = t1.father_id
 LEFT JOIN people AS ff1 ON ff1.id = t2.father_id
 LEFT JOIN people AS fm1 ON fm1.id = t2.mother_id
   ...
LEFT JOIN people AS t3  ON t3.id = t1.mother_id
 LEFT JOIN people AS mf1 ON mf1.id = t3.father_id
 LEFT JOIN people AS mm1 ON mm1.id = t3.mother_id
    ...
WHERE t1.id = 6;