3

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

“家谱”数据结构

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

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

对于表示我打算使用可视化:来自 http://code.google.com/apis/chart/interactive/docs/gallery/orgchart.html#Example的组织图

我会总结我需要的

  1. 数据库设计
  2. 放置控制器(ajax)和模型
  3. 用户将创建的人不会是任何其他用户。只是一些其他数据

是的,就是这样!当我完成项目时,我会在这个线程上发布一个完整的解决方案,当然在你们的专业知识的帮助下

提前致谢

编辑我会贡献更多来详细说明我的情况

我有一个用户表、一个关系表和最后一个家庭/家谱表

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

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

这种方法的缺点是与儿媳、妻子的兄弟和他们的家人等其他节点产生关系。

理想的做法是,对于用户,我们可以添加父母、兄弟姐妹、孩子以及额外的关系,它们必须从家庭成员关系派生,即兄弟必须派生​​为姐姐的丈夫或妻子的兄弟。

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

希望这可以帮助你们提供更好的解决方案。

4

1 回答 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 
于 2011-06-09T17:52:25.790 回答