MySQL 家谱:层次结构、婚姻参考和显示
Posted
技术标签:
【中文标题】MySQL 家谱:层次结构、婚姻参考和显示【英文标题】:MySQL Family Tree: Hierarchy, Marriage ref, and Display 【发布时间】:2012-12-10 12:09:42 【问题描述】:我正在建立一个家谱 + 历史 [php] 网站,以展示我妈妈为她父母的圣诞礼物而整理的家谱报告。这棵树至少将基于一个 mysql 数据库(“family”),我目前正在其中使用两个表:“persons”和“marriages”。我还有第三张表,“亲子关系”,但后来认为没有必要。
表格结构如下:
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 新手——而且我的家人无论如何都是相当右翼和保守的,但它确实没有'无关紧要,没有任何意义,如果您愿意,不妨将其视为配偶 1 和配偶 2。我个人对任何人都没有同性恋恐惧或偏见。结束免责声明。愿所有人安宁。)
所以...你明白我为什么要为“婚姻”维护一个单独的表:每段婚姻都有自己的数据必须包含在内,在双方的记录中重复每段婚姻的数据是很愚蠢的配偶。我之前在“persons”表中有一个“spouseID”列,但是我还需要手动匹配每个配偶的 ID,并且无法弄清楚如何将该列链接到相应的婚姻列(在“婚姻表)无论如何,所以我把它放下了。
如果有人能告诉我如何让“婚姻”中的两个配偶 ID 列来显示人的姓名,那将是伟大的。
但首先我需要知道如何链接这两个表(可能在“persons”表中包含一个“spouse”列,它以某种方式与“marriages”表集成在一起),其次是关于如何去的任何提示关于显示层次树。
非常感谢。
附:这棵树相当广泛,跨越约 6 代。大约有 45 个“人”,我认为有 16 次婚姻,无论这些信息是否值得......
【问题讨论】:
你的结构相对合理。我看到的唯一问题是,如果不同时查询丈夫ID 和妻子ID 列,您就不能轻松地查询婚姻并找到一个人的特定婚姻。我个人会将这种关系转移到相关的子婚姻表中。你实际上对 Persons 有同样的问题。无论如何,在您的查询中,您只需要为每个关系使用从婚姻到人员的内部联接,这会将所有人员列添加到行中。 我不知道您所说的“将关系移至相关的子婚姻表”是什么意思。我将如何构建它? (以及“人员”。)我正在尝试研究所有这些术语和技术,但最后我遇到的所有这些零星且相关性极少的信息对我没有好处,我需要与手头任务相关的示例(以及我可以使用我目前正在使用的东西来理解)。 我不明白你的意思是说我对“人”有什么问题,这对我来说都不是很清楚...... FWIW,在一般情况下,家谱不是层次结构,而是网络。它可以有循环。这可能不适用于您的项目,但无论如何还是要知道。 你的意思是什么循环?就像在后缀树中一样?你能解释一下吗? 【参考方案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;
【讨论】:
【参考方案2】:这是我在 ERD 图中的评论中提出的建议。
【讨论】:
【参考方案3】:根本没有答案,但我也一直在想家谱,但我的想法更笼统。也就是说,您拥有的个人表(减去父亲 ID 和母亲 ID 字段,以及单独的关系表。
后者允许结婚、离婚和孩子。
现在,这肯定会在查询时显示一些 CPU 使用率很高,并且会影响我对连接的理解。但现在它似乎满足了我的需求。
【讨论】:
以上是关于MySQL 家谱:层次结构、婚姻参考和显示的主要内容,如果未能解决你的问题,请参考以下文章