我需要在 php 和 MySQL 中构建家谱。我对那里缺乏开源可定制的 html 家谱构建软件感到非常惊讶,但我离题了。我花了很多时间阅读有关存储 MySQL 有向图和家谱的内容。一切对我来说都有意义:有一个包含节点(人)的表和一个包含边(关系)的表。
我遇到的唯一问题是我不确定存储不一定相邻的关系的最佳方式,例如 sibling 和祖 parent 关系。起初我不认为这有什么大不了的,因为我可以无形地强制执行 parent (每个人都有 parent )来解决这些联系。
但是,我还需要能够存储可能没有共同 parent 的关系,例如浪漫伴侣。我读过的所有内容都表明存在亲子关系,但由于浪漫伴侣没有共同的 parent (希望如此),我不确定如何将其存储在边缘表中。我应该使用不同的表,还是什么?如果它在同一张表中,我该如何表示呢?只要我在与不熟悉的关系中这样做,我也不妨与家人一起这样做。
总结起来,三个问题:
- 如何表示横向关系?
- 如果横向关系有一个共同的父级,我该如何存储它?这应该是存储其他横向关系的表上的
family
标志吗? - 如果 child 相距两个或更多边(祖 parent )但直接父级不可用,我如何存储父子关系?
感谢任何帮助,如果有人对某些 javascript/html 家谱构建软件有任何建议,那就太好了。
最佳答案
来自 Geneapro schema 的想法和 RootsMagic .
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
所以你可以有一个类型为“出生”的生活事件,role_id 告诉你谁是 parent ,谁是 child 。这可以扩展到结婚、死亡、离婚、养 parent 、代理 parent (您可能有 3 或 4 个关系非常复杂的 parent )等。
至于存储更远的关系,你可以计算这些。例如,您可以通过获取具有匹配 event_id 的“父亲”角色的人来计算任何人的父亲。然后你可以得到那个人的父亲,你就有了原来那个人的祖父。在某人未知的任何地方,创建具有未知数据的人。
关于php - MySQL 存储关系(家族)树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5773938/