2011-04-24 47 views
3

我需要在php和MySQL中构建一个系列树。我很惊讶缺乏开源的可定制的HTML家族树构建软件,但我离题了。我花了很多时间阅读关于存储MySQL图和家族树的信息。一切都对我有意义:有一个有节点(人)的桌子和一个有边缘(关系)的桌子。MySQL商店关系(系列)树

我唯一的问题是我不确定存储不一定相邻的关系的最佳方式,例如兄弟姐妹和祖父母关系。起初我并不认为这会有什么大不了的,因为我可以不加区别地强制父母(每个人都有父母)来解决这些关系。

但是,我也需要能够存储可能没有共同父母的关系,如浪漫的伴侣。我读过的每一样东西都表明了一种亲子关系,但由于浪漫的伴侣不共享一个共同的父母(希望),我不知道如何将它存储在边缘表中。我应该使用不同的表格还是什么?如果它在同一个表格中,我该如何表示?只要我用不熟悉的关系来做这件事,我也可以和家人一起做。

综上所述,三个问题:

  • 如何代表横向的关系?
  • 如果横向关系有一个共同的父母,我该如何存储它?这是否应该是family表中存储其他横向关系的标志?
  • 如何将儿童的两个或更多边缘(祖父母)隔开,但直接父母不可用?

任何帮助表示赞赏,如果任何人有任何建议的一些JavaScript/HTML家谱树建设软件,那将是美好的。

回答

3

想法来自Geneapro schemaRootsMagic

person 
------ 
person_id 
name (etc) 

life_event_types 
---------------- 
life_event_type_id 
life_event_type_description (divorce, marriage, birth, death) 

life_events 
----------- 
life_event_id 
life_event_type_id 
life_event_description 
life_event_date 

life_event_roles 
---------------- 
life_event_role_id 
life_event_role (mother, father, child) 

person_event_role 
----------------- 
person_id - who 
life_event_id - what happened 
life_event_role_id - what this person did 

所以你可以有一个类型为“birth”的生活事件,role_id告诉你谁是父母,谁是孩子。这可以扩展到婚姻,死亡,离婚,养父母,代理父母(你可能有3或4个父母的关系非常复杂)等。

至于储存更远的关系,你可以计算这些。例如,您可以通过获取具有匹配event_id的“父亲”角色的人来计算任何人的父亲。然后你可以得到那个人的父亲,并且你有原始人的祖父。无论有人未知,请创建未知数据的人员。

+0

这很有趣,有可能解决问题(如果需要,我会坚持使用占位符不留空格的建议)。我唯一的问题是如何透明地确定关系的方向?现在看来,我必须每次检查事件类型描述或角色,以判断一个节点相对于另一个节点的位置。 – 2011-04-25 13:39:49

+0

@tandu我不确定'关系方向'是什么意思?我认为这归结于你的程序逻辑,而不是SQL。你的数据库仅仅存储(例如)'Bob'的'出生'事件,'Geoff'是父亲,'Alice'是母亲,'Bob'是'宝贝'。在你的程序中,如果你想确定谁是鲍勃的父母,那么你可以从person_event_role中选择,其中life_event_id是鲍勃的出生地,而life_event_role_id可以是母亲或父亲。 – 2011-04-25 13:54:50

+0

这就是我所说的方向。例如,如果用户是Bob,我需要找到Bob的儿子,父亲和妻子在树中的哪个位置。他的儿子是南方,他的父亲是北方,他的妻子是西方或东方。不过,您似乎已经回答了:您正在说要根据人事活动角色来计算此方向。我不能在MySQL中透明地做到这一点,如果我不得不在PHP中检查每个字符串并计算方向,但我想你是说这不是模式。 – 2011-04-25 14:23:06

1
person 
------- 
person_id 
other_stuff 

relation 
---------- 
person_id_1 
person_id_2 
relationship_type 
begin_dt 
end_dt 

只是填充你感兴趣的任何值的关系类型。(FK一些选择列表将是巨大的)

我把日期上一个有趣的subdiscussion /思想provokation。

+0

这就是我所倾向的,但我不确定它是否是100%最好的方法。这也不一定解决缺少父母的祖父母 - 子女关系问题。如果父母不存在,则不需要存储这种关系,因为祖父母与父母关系可以避免这种关系,除非您建议我同时存储这两种关系。 – 2011-04-24 23:44:43

+0

这个模型可以让你存储两个 - 我不知道我推荐。你正在购买managin多余关系的工作,就像结构非规范化时的问题一样......要么你或者应该严格限制基于这种关系类型的记录。 – Randy 2011-04-24 23:47:10

+0

@tandu,生物学......一个孩子永远不会没有父母就生下来。即使在计算机科学的树木里,这也是一个不错的选择。开始和结束日期很好地解决了我认为的问题。 – Johan 2011-04-24 23:50:46

0

GEDCOM data modelGramps data model是两种用于在不同工具之间交换生物​​数据的最流行的格式。考虑到两种数据模型都是专门为处理生物数据而设计的,使用这些数据模型中的任何一种都应该(1)使您的工具与其他工具更加兼容并且(2)确保您的数据模型能够适应许多特殊情况。

Oxy-GenGramps PHP exporter这样的工具应该可以帮助您了解如何将GEDCOM数据导入数据库。

有关更多详细信息,另请参阅我对“Family Tree” Data Structure的回答。