php - MySQL 存储关系(家族)树

标签 php html mysql directed-graph family-tree

我需要在 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/

相关文章:

php - 如何在Laravel中显示 parent 姓名

php - 最佳 PHP 邮件类

javascript - onClick 不起作用

html - 在 Bootstrap 行中将 div 对齐到底部

python - django使用分页时出错

SQL 固定值 IN() 与 INNER JOIN 性能

php - 如何使 Joomla 3.0 富文本编辑器允许 HTML?

html - CSS3 无限动画图形

c# - 如何在 .NET 中将列表作为参数传递

php - 如何为 CListView 的最后一项设置 css 样式?