【问题标题】:Genealogy tree mysql家谱树mysql
【发布时间】:2013-02-18 13:51:12
【问题描述】:

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

我在stackoverflow上发现了这种结构,看起来效率很高:Inbreeding-immune database structure

TABLE people (id, name, father_id, mother_id );
TABLE relatives ( person_id, ancestor_id );

这里有一个工作示例:http://sqlfiddle.com/#!2/0bd39/10

是否可以简单地检索以 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;

【问题讨论】:

  • 你的问题不好解决。您可以在我的 pedigree Web 应用程序中查看(在知识共享许可下),但请注意这是一个测试版和德语(对不起!)。 link
  • 我知道这并不容易解决..我正在尝试找到一些建议来使用 mysql 限制的最佳结构。

标签: php mysql tree hierarchical-data


【解决方案1】:

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

如果您已被约束并决心使用 MySQL,您可能会通过使用递归搜索来摆脱您的架构。由于您的树可以具有可变深度,您可以在给定位置开始自连接并沿着递归的分支“走”,直到您不再找到后代。返回该分支并开始下一个分支。遍历寻找父母的类似过程。

【讨论】:

  • 我必须使用mysql。我也想用递归方法遍历树..但我认为有必要使用 php。您是否认为像我在编辑的问题中编写的那样单个查询更快,或者使用简单的递归查询管理我的 php 递归函数更快?
  • 使用预设查询会将您限制在固定的深度。如果这是可以接受的,那么它肯定比嵌套多个查询更容易。
【解决方案2】:

我对鱼的血统有这个问题。我发现将邻接列表(就像您发布的那样)转储到像 GraphViz 这样的专用树构建器是最好的解决方案。

【讨论】:

  • 其实我没有在网络服务器上安装其他软件的可能,但是树生成器似乎很有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多