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

时间:2011-06-09 16:39:37

标签: mysql zend-framework database-design family-tree

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

"Family Tree" Data Structure

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

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

为表示我计划使用可视化:组织结构图 http://code.google.com/apis/chart/interactive/docs/gallery/orgchart.html#Example

我将总结我需要的东西

  1. 数据库设计
  2. 放置控制器(ajax)&模型
  3. 用户将创建的人不会是任何其他用户。只是另一些数据
  4. 是的,就是这样!当我完成项目时,我会在这个帖子上发布完整的解决方案,当然还有你们的专业知识帮助

    提前致谢

    编辑我会更多地阐述我的情况

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

    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 个答案:

答案 0 :(得分: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