【问题标题】:Genealogy tree Algorithm家谱树算法
【发布时间】:2012-01-22 14:31:37
【问题描述】:

我是这个领域的新手,喜欢编写一个管理家谱数据的应用程序。我主要关心的是如何从 MySQL 存储和检索这些数据。我知道像 Oracle 这样的数据库针对递归查询进行了优化,但也许我可以找到使用 MySQL 的替代解决方案,但我不知道它不支持 "CONNECT" 。 PS。我知道现有的开源解决方案有数千种,但考虑到这些数据将是功能的有限部分,我需要保持对完整代码的控制。

我在网上快速浏览了一下,发现了一些有趣的方法,例如基于间隔的算法,它非常适合查询,但不能满足更新/删除的要求。

我将看一下基于前缀(杜威)的方法,但有人可能知道一种有效且经过验证的分享方法?

谢谢

吉尔斯

【问题讨论】:

标签: mysql algorithm tree genealogy


【解决方案1】:

第一个问题,设计数据架构:我使用父行的外键来保持层次结构。简直了。

第二个问题,检索祖先/后代:正如您所解释的,选择出现问题:选择一些人和所有后代的祖先。要解决这个问题,您应该创建一个新的树表。此表包含对:一个人与所有他们的祖先(和它自己)的组合:

people( id, name, id_parent)
people_tree( id, id_ancestor, distance )

请注意,使用这种结构很容易查询层次结构。示例:某人的所有后代:

select people.*, distance
from 
  people p
    inner join 
  people_tree t 
    on ( p.id = t.id)
where
  id_ancesor = **sombody.id **

你可以玩距离,只得到祖父母、孙子等......

最后一个问题,保持树:树必须随时掌握数据。您应该自动执行此操作:people 上的触发器或 CRUD 操作的存储过程,

已编辑

因为这是一棵家谱树,所以每个人都必须有参考资料,父母和母亲:

people( id, name, id_parent, id_mother)

那么,需要两棵树:

parent_ancestors_tree( id, id_ancestor, distance )
mother_ancestors_tree( id, id_ancestor, distance )

大卫要求提供样本数据:

people: id    name    id_parent    id_mother
         1    Adam         NULL      NULL
         2    Eva          NULL      NULL
         3    Cain            1         2
        ..    ...
         8    Enoc            3         5

parent_ancestors_tree id    id_ancestor  distance
              (Adam)   1              1         0
              (Eva)    2              2         0
              (Cain)   3              3         0
                       3              1         1
              (Enoc)   8              8         0
                       8              3         1
                       8              1         2

mother_ancestors_tree id    id_ancestor  distance
              (Adam)   1              1         0
              (Eva)    2              2         0
              (Cain)   3              3         0
                       3              2         1
              (Enoc)   8              8         0
                  -- here ancestors of Enoc's mother --

问候。

【讨论】:

  • 我有一个问题:你如何隔离不同的家庭(额外的 id_family 属性或总是重建树,这意味着递归访问)?吉尔斯
  • @danihp:有样本就好了。你说的距离是什么意思?什么是祖先?
  • @david,对不起我的英语。距离:person 与自身之间为 0,person 与父母之间为 1,person 与祖父母之间为 2,... Ancestor:一个人的后裔;前辈;祖。
  • @gilles,隔离家庭:好问题,我的解决方案是针对简单的层次结构,家庭更复杂,因为人们有 2 个祖先,那么每个人应该有 2 个外键(父母和母亲),这增加了解决方案的复杂性(每个人可能需要 2 个 people_tree)。您应该避免重建树,在插入人员时,您应该复制父树(通过新人 id 更改 id 父级)并添加两个条目(对于插入的 person 和它的父级以及对于插入的 person 和它本身)。没有人说这会很容易。
  • @david,已发布示例数据。问候。
【解决方案2】:

我还建议使用相邻树模型,对于更复杂的逻辑,我建议使用简单的 mysql 查询(联接)。很可能创建树更重要。当应用程序完成并且一切正常时,您可以进行更多数据挖掘。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多