2012-12-23 142 views
1

我正在构建一个家谱+历史[PHP]网站,以陪伴和展示我妈妈的家谱报告,她为她父母的圣诞礼物放在一起。树至少将基于一个MySQL数据库('家族'),我目前正在使用两个表:'人'和'婚姻'。我还有第三张“亲子关系”表,但后来认为这是不必要的。MySQL系列树:层次结构,婚姻参考和显示

中的表的结构如下:在

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索引 '婚姻' 表包括两个编号的cols的。 (*请原谅我使用性别歧视条款;它仅仅是为了结构目的 - 以防万一,我是MySQL的新手 - 而且我的家人也是非常右翼和保守的,但它确实没有如果你愿意的话,我不认为是配偶1和配偶2,我个人根本不会对任何人产生同性恋和偏见。最终免责声明。对所有人都是和平的。)

所以......你会明白我为什么要为“婚姻”维护一张单独的表格:每一对婚姻都有自己的数据必须包括在内,重复夫妻双方记录中的每次婚姻数据都是愚蠢的。我在'persons'表中有一个'spouseID'列,但是我需要手动匹配每个配偶的ID,并且无法弄清楚如何将该列链接到相应的婚姻专栏(在'婚姻'表),所以我放弃了。

如果有人能够启发我如何在'婚姻'中同时显示个人姓名的配偶ID列,而不是显示个人的姓名,也可能是盛大的。

但主要是我需要知道我怎样才能连接两个表(可能在'persons'表中包含一个'配偶'列,它与'婚姻'表集成在一起),其次是关于如何去显示分层树。

非常感谢。

P.S.这棵树相当广泛,大约有6代。有大约45人',我认为16婚姻,无论这些信息可能是值得的...

+0

您的结构是关系良好的。我看到的唯一问题是,您无法轻松查询婚姻状况并找到某人的特定婚姻,而无需查询husbandID和wifeID列。我个人会将这种关系转移到相关的子女婚姻关系表上。你实际上与人有同样的问题。无论如何,在你的查询中,你只需要利用从婚姻到人际关系的每个关系的内部连接,并将所有人的列添加到行中。 – gview

+0

我不知道你的意思是“把这种关系转移到一个相关的子女婚姻关系表”。我究竟该如何构建? (和'人'。)我试图研究所有这些术语和技术,但最终我遇到的所有这些零星和稀疏相关的信息都不利于我,我需要与手头任务相关的示例(并且我可以与我一起工作目前正在与之合作以便理解)。 – user163831

+0

我不明白你的意思是说我与'人'有什么关系,这一点对我来说都不是很清楚...... – user163831

回答

1

简单的SELECT-JOIN查询在同一个表上两次获取所有的婚姻作为一个列表。

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; 
1

这是我在我的评论在ERD图中提出的建议。

ERD