Php MySQL家族树:层次结构、婚姻参考和显示

Php MySQL家族树:层次结构、婚姻参考和显示,php,mysql,hierarchical,family-tree,database-relations,Php,Mysql,Hierarchical,Family Tree,Database Relations,我正在建立一个家谱+历史[PHP]网站,来展示我妈妈的家谱报告,这是她为父母准备的圣诞礼物。该树至少将基于MySQL数据库“family”,我目前正在其中处理两个表:“persons”和“Marctions”。我还有第三张表格“亲子关系”,但后来认为这是不必要的 各表的结构如下: PERSONS - 'personID' [tinyint, pk] - 'firstName' - 'lastName' - 'sex' [set{'M','F'}] - 'birthDate' - 'fatherI

我正在建立一个家谱+历史[PHP]网站,来展示我妈妈的家谱报告,这是她为父母准备的圣诞礼物。该树至少将基于MySQL数据库“family”,我目前正在其中处理两个表:“persons”和“Marctions”。我还有第三张表格“亲子关系”,但后来认为这是不必要的

各表的结构如下:

PERSONS
- 'personID' [tinyint, pk]
- 'firstName'
- 'lastName'
- 'sex' [set{'M','F'}]
- 'birthDate'
- 'fatherID' [internal rel = 'personID']
- 'motherID' [internal rel = 'personID']
- 'birthPlace'
- 'deathDate'
- 'deathPlace'
- 'birthRecord' (filename)

MARRIAGES
- 'husbandID' [internal rel = 'persons.personID']
- 'wifeID' [internal rel = 'persons.personID']
- 'date'
- 'place'
- 'record'
“婚姻”表中的PK索引由两个ID列组成*请原谅我使用的性别歧视术语;这仅仅是为了结构上的目的——以防万一,我对MySQL还不熟悉——而且我的家族是相当右翼和保守的,但这真的不重要,也没有什么意义,如果你愿意的话,也可以被视为spoose1和spoose2。我个人对任何人都没有同性恋恐惧或偏见。结束免责声明。祝大家和平

所以。。。你知道为什么我想为“婚姻”维护一个单独的表了:每段婚姻都有自己的数据,必须包括在内,在记录中为配偶双方重复每段婚姻的数据是愚蠢的。我以前在“persons”表中有一个“partyseid”列,但后来我还需要手动匹配每个配偶的ID,并且无法确定如何将该列链接到“marries”表中相应的婚姻列,所以我放弃了它

如果有人能告诉我如何让“婚姻”中的两个配偶ID栏都显示这些人的名字,那就太棒了

但首先,我需要知道如何链接这两个表可能包括“人员”表中的“配偶”列,该列以某种方式与“婚姻”表集成,其次是关于如何显示层次结构树的任何提示

非常感谢


另外,这棵树相当广泛,跨越了6代。大约有45个“人”,我想有16个婚姻,不管这些信息值多少…

在同一个表上直接选择连接查询两次,将所有婚姻作为一个列表

SELECT m.*,
      h.firstName as husbandFirstName, h.lastName as husbandLastName, 
      w.firstName as wifeFirstName, w.lastName as wifeLastName 
FROM marriages m
LEFT JOIN persons h ON m.husbandID = h.personID
LEFT JOIN persons w ON m.wifeID = w.personID;
对于男性子女的列表,您可以将父亲的ID作为以下内容传入:

SELECT p.firstName as fatherFirstName, p.lastName as fatherLastName, 
     c.firstName as childFirstName, c.lastName as childLastName
LEFT JOIN persons c ON c.fatherID = p.personID
WHERE p.personID = $fatherID;

以下是我在ERD图中的评论中提出的建议


你的结构在关系上是健全的。我看到的唯一问题是,如果不同时查询husbandID和wifeID列,就无法轻松地查询婚姻并为一个人找到特定的婚姻。我个人会将这种关系转移到一个相关的婚姻儿童表上。事实上,你对人也有同样的问题。无论如何,在您的查询中,您只需要为每个关系使用从婚姻到人的内部联接,这将把所有的人列添加到行中。我不知道将该关系移动到婚姻的相关子表是什么意思。我该如何构造它呢?和“人”在一起。我试图研究所有这些术语和技术,但最终我遇到的所有这些零星的和稀疏的相关信息对我没有好处,我需要与手头的任务相关的例子,我可以用我目前正在使用的来理解。我也不明白你说我与“人”之间有什么问题,所有这些对我来说都不是很清楚……FWIW,在一般情况下,家谱不是层次结构,而是一个网络。它可以有循环。这可能不适用于您的项目,但无论如何知道这一点很好。您的意思是什么循环?比如在后缀树中?你能解释一下吗?