Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL存储关系(家族)树_Php_Html_Mysql_Directed Graph_Family Tree - Fatal编程技术网

Php MySQL存储关系(家族)树

Php MySQL存储关系(家族)树,php,html,mysql,directed-graph,family-tree,Php,Html,Mysql,Directed Graph,Family Tree,我需要在php和MySQL中构建一个族谱。我很惊讶地发现,目前还没有开源的可定制html族谱构建软件,但我离题了。我花了很多时间阅读有关存储MySQL有向图和族谱的内容。一切对我都有意义:有一个包含节点(人员)的表和一个包含边(关系)的表 我唯一的问题是,我不确定存储不一定相邻关系的最佳方式,例如兄弟姐妹和祖父母关系。起初我并不认为这有什么大不了的,因为我可以无形地强制执行一个家长(每个人都有家长)来解决这些连接 然而,我也需要能够存储可能没有共同父母的关系,比如浪漫伴侣。我读到的每一篇文章都暗

我需要在php和MySQL中构建一个族谱。我很惊讶地发现,目前还没有开源的可定制html族谱构建软件,但我离题了。我花了很多时间阅读有关存储MySQL有向图和族谱的内容。一切对我都有意义:有一个包含节点(人员)的表和一个包含边(关系)的表

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

然而,我也需要能够存储可能没有共同父母的关系,比如浪漫伴侣。我读到的每一篇文章都暗示着父母与孩子之间的关系,但由于浪漫的伴侣没有共同的父母(希望如此),我不知道如何将其存储在表格中。我应该换张桌子吗?如果它在同一个表中,我如何表示它?只要我在不熟悉的关系中这样做,我也可以在家庭中这样做

总而言之,有三个问题:

  • 我如何表示横向关系
  • 如果横向关系有一个共同的父关系,我如何存储它?这是否应该是存储其他横向关系的表上的
    系列
    标志
  • 如果孩子相隔两条或多条边(祖父母),但直系父母不可用,如何存储父子关系
非常感谢您的帮助,如果有人对一些javascript/html家族树构建软件有任何建议,那就太好了

person
-------
person_id
other_stuff

relation
----------
person_id_1
person_id_2
relationship_type
begin_dt
end_dt
只需使用您感兴趣的任何值填充关系类型。(FK到一些挑选者那里去就好了)


我为一个有趣的子讨论/思想探索确定了日期。

一个来自和的想法

所以你可以有一个“出生”类型的生活事件,角色id告诉你谁是父母,谁是孩子。这可以扩展到婚姻、死亡、离婚、寄养父母、代孕父母(你可能有3或4个父母,他们的关系非常复杂)等等

至于存储更遥远的关系,您可以计算这些。例如,您可以通过获得具有匹配事件id的“父亲”角色的人来计算任何人的父亲。然后您可以获得该人的父亲,以及原始人的祖父。在任何未知的地方,创建具有未知数据的人。

和是在不同工具之间交换基因数据的两种最流行的格式。使用这两种数据模型中的任何一种都应该(1)使您的工具与其他工具更兼容,(2)确保您的数据模型适用于许多特殊情况,因为这两种数据模型都是专门为处理基因数据而设计的

或之类的工具应该可以帮助您了解如何将GEDCOM数据导入数据库


有关更多详细信息,请参见我对的回答。

这是我倾向于的,但我不确定这是否100%是最好的方法。这也不一定能解决父母不在的祖父母-子女关系问题。如果父母没有缺席,就没有必要存储这种关系,因为祖父母关系可以消除这种关系,除非你建议我同时存储这两种关系。这种模式允许你同时存储这两种关系——我不知道我是否建议这样做。你正在购买管理冗余关系的工作,这就像结构非规范化时的问题一样。。。要么这样,要么你应该基于这种关系类型严格约束记录。@tandu,biology。。。。孩子出生时没有父母。甚至在计算机科学树中,这也是一个否定。我认为开始和结束日期很好地解决了这个问题。请重新阅读我的问题。我需要存储两个不共享父节点的节点之间的关系。日期如何解决这个问题?此外,这个提供的模式并没有指明哪个人是父母,哪个孩子是孩子(除非你是说
1
是父母)。这很有趣,并且有可能解决这个问题(如果必要,我将坚持在遥远的关系中使用占位符,不留空格的建议)。我唯一的问题是,我如何才能透明地确定关系的方向?现在,我似乎每次都必须检查事件类型描述或角色,才能判断一个节点相对于另一个节点的位置。@tandu我不确定“关系的方向”是什么意思?我认为这取决于您的程序逻辑,而不是SQL。您的数据库仅存储(例如)在“Bob”的“出生”事件中,“Geoff”是父亲,“Alice”是母亲,“Bob”是“baby”。在你的程序中,如果你想知道谁是鲍勃的父母,那么你可以从person\u event\u role中选择,其中life\u event\u id是鲍勃出生时的id,life\u event\u role\u id是母亲或父亲。这就是我所说的方向。例如,如果用户是Bob,我需要找到Bob的儿子、父亲和妻子在树中的位置。他的儿子在南方,他的父亲在北方,他的妻子在西方或东方。看起来你已经回答了:你说的是根据人物事件角色来计算这个方向。如果我必须在php中检查每个字符串并从中计算方向,我无法在MySQL中透明地执行此操作,但我想你是说这不是架构的目的。@tandu确切地说,这是你代码的工作。您可以编写类,这样您就可以使用类似于
$Bob->getFather()
$Bob->getgrander()
的代码,然后这些代码将返回相关per的person对象
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