3

我正在尝试使用 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;
4

2 回答 2

4

这种可能更适合图形样式的数据存储。类似于 facebook 如何保持关系的层次结构。

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

于 2013-02-18T14:39:27.420 回答
1

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

于 2013-02-18T14:34:56.050 回答