如何在mysql数据库中存储族树数据

kir*_*rby 10 mysql

我有一棵家谱.我想将它存储在一个mysql数据库中.我有一张名为"家庭成员"的专栏,但我不知道如何安排这些家庭成员.例如,我在我的父亲之下,而我的儿子在我之下.所以我想,我怎样才能将这种类型的树存储在数据库中?

Mos*_*cho 10

所以,你说你有一个名为"家庭成员"的列表.对我来说,这是不恰当的,因为它不尊重规范化:)首先我称之为"familyTreeId".现在,让我们转到FamilyTree表.

这个表是这样的:

FamilyTree(id, motherId, fatherId, etc) - > etc:如果你有其他数据

  • id 将成为该表的主键
  • motherId将链接到FamilyTree表中属于母亲的行
  • fatherId将链接到FamilyTree表中属于父亲的行

所以行将是:

+--------+--------------+--------------+
|   id   |   motherId   |   fatherId   |
+--------+--------------+--------------+
| son1   | yourwife     | you          |
| son2   | yourwife     | you          |
| you    | mother       | father       |
| mother | grandmother1 | grandfather1 |
| father | grandmother2 | grandfather2 |
+--------+--------------+--------------+
Run Code Online (Sandbox Code Playgroud)

其他选择是存储夫妇

FamilyTreeParents(id, motherId, fatherId)

FamilyTreeNodes(id, familyTreeParentsId)

  • id 将是表格的主键
  • familyTreeParentsId将是FamilyTreeParents表的外键
  • motherId将是FamilyTreeNodes表中属于母亲的行的外键
  • fatherId将是FamilyTreeNodes表中属于父亲的行的外键

所以行将是:

FamilyTreeParents

+----+--------------+--------------+
| id |   motherId   |   fatherId   |
+----+--------------+--------------+
|  1 | yourwife     | you          |
|  2 | mother       | father       |
|  3 | grandmother1 | grandfather1 |
|  4 | grandmother2 | grandfather2 |
+----+--------------+--------------+
Run Code Online (Sandbox Code Playgroud)

FamilyTreeNodes

+--------+---------------------+
|   id   | familyTreeParentsId |
+--------+---------------------+
| son1   |                   1 |
| son2   |                   1 |
| you    |                   2 |
| mother |                   3 |
| father |                   4 |
+--------+---------------------+
Run Code Online (Sandbox Code Playgroud)

数据更规范化这种方式,因为你没有重复的信息(如you,并yourwifeson1son2我在其他的解决办法做了.但是,这种解决方案可能在速度方面的效率较低,因为将需要更多的连接.

  • 好细节!然而,这里有一些技术假设可能会导致谱系记录不准确。您的表“FamilyTreeParents”假设一个家庭由两个父母组成 - 一个(非常常见)或两个以上(发生率 > 0)的家庭呢?这里也有一些性别假设:收养的同性恋夫妇(任何性别)怎么样 - 也许partner1Id和partner2Id在这里会有所改进? (3认同)
  • 如何处理以前结婚的孩子等? (2认同)

lou*_*luo 1

你可以有这样的模式

Family( Parent_name, Child_name )。“元组”(Parent_name, Child_name)是表的关键。(Parent_name, Child_name)假设您的家谱中不存在重复项。如果您想Social Security Number唯一地标识家谱中的一个人,那么您应该使用代替姓名,并有一个单独的表来存储和 之间Parent_ssn, Child_ssn的关系,其键是ssnnamessn

该表中的项目可以是

[Your dad, you]
[Your mum, you]
[you, your son]
[you, your 2nd son]
[your wife, your son]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助