首页 文章

在数据库中保存树数据(族树)

提问于
浏览
3

我正在尝试存储一棵家谱 . 这是我正在使用的平台,Zend框架,Mysql,Ajax我搜索了stackoverflow我遇到过这篇文章,这对于处理对象方面的数据非常有帮助 .

"Family Tree" Data Structure

我将简要说明我的用例 . 用户可以根据数据库中定义的少数关系创建家庭成员或朋友 . 我也有关系模型 . 用户可以创建家庭成员,如离婚配偶,frineds . Max the Tree可以很深,我们假设最大的孙子的孩子,但它也可以扩大宽度 . 兄弟/姐妹和他们的家人 .

我正在寻找一个有效的数据库设计,以减少查询时间 . 如果我必须使用上面文章中描述的数据结构,我必须保留它们,因为它们必须是模型 .

为表示我计划使用http://code.google.com/apis/chart/interactive/docs/gallery/orgchart.html#Example来自http://code.google.com/apis/chart/interactive/docs/gallery/orgchart.html#Example

我会总结一下我需要的东西

  • 数据库设计

  • 放置控制器(ajax)和型号

  • 用户将创建的人员不会是任何其他用户 . 只是另一些数据

是的,就是这样!当我完成项目时,我会在这个帖子上发布完整的解决方案,当然还有你们的专业知识

提前致谢

EDIT 我会更详细地阐述我的情况

我有一个用户表,一个关系表,以及最后一个家庭/家庭树表

Family表必须具有与以下类似的结构

ID        userid              relation id             Name

1         34                   3 // for son             ABC
2         34                   4 // for Wife            XYZ
3         34                   3 // for Mom             PQR
4         34                   3 // for DAd             THE
5         34                   3 // for Daughter        GHI
6         34                   3 // for Brother         KLM

这种方法的缺点是产生与其他节点的关系,如媳妇,妻子兄弟及其家人 .

理想的做法是为了一个用户,我们可以添加父母,兄弟姐妹,孩子和额外的关系,他们必须从家庭成员关系中得出,即,姐夫必须是姐妹的丈夫或妻子的兄弟 .

这就是我现在能想到的 . 我只需要实施指南 .

希望这有助于你们提供更好的解决方案 .

1 回答

  • 1

    我想从数据库的角度来看,最好像它一样实现它

    id | name | parent_male | parent_female
    

    其他选项是字符串前缀

    id | name | prefix 
    1  | Joe  | 0001
    2  | Jack | 000100001 //ie. Joes son
    3  | Marry| 0001 //ie. Jacks mother
    4  | Eve  | 0002 // new family tree
    5  | Adam | 00020001 // ie. Eves son
    6  | Mark | 000200010001 // ie. Adams son
    

    其他(更有效)算法(如MPTT)假设数据是树,在这种情况下不是(它有圆圈) .

    为了表明它会起作用 - 选择马克的祖父母:

    --Mark
    SELECT prefix FROM family_tree WHERE id = 6; 
    -- create substring - trim N 4-character groups from the end where N is N-th parent generation => 2 for grandparent ==> 0002
    --grandparents
    SELECT * FROM family_tree WHERE prefix = '0002' 
    -- same for other side of family
    -- cousins from one side of family
    SELECT * FROM family_tree WHERE prefix LIKE '0002%' AND LENGTH(prefix) = 12
    

相关问题