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

时间:2012-02-03 05:37:30

标签: mysql

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

3 个答案:

答案 0 :(得分:10)

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

这个表是这样的:

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

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

所以行将是:

+--------+--------------+--------------+
|   id   |   motherId   |   fatherId   |
+--------+--------------+--------------+
| son1   | yourwife     | you          |
| son2   | yourwife     | you          |
| you    | mother       | father       |
| mother | grandmother1 | grandfather1 |
| father | grandmother2 | grandfather2 |
+--------+--------------+--------------+

其他选择是存放情侣

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 |
+----+--------------+--------------+

<强> FamilyTreeNodes

+--------+---------------------+
|   id   | familyTreeParentsId |
+--------+---------------------+
| son1   |                   1 |
| son2   |                   1 |
| you    |                   2 |
| mother |                   3 |
| father |                   4 |
+--------+---------------------+

数据更加规范化,因为您不会像我在其他解决方案中那样重复信息(例如youyourwife son1son2。但是,这种解决方案在速度方面可能效率较低,因为需要更多的连接。

答案 1 :(得分:2)

我会保留两张桌子,一张是人,一张是关系。 这里的问题是你是否应该将记录保存在一个记录中(例如丈夫 - 妻子)或者另一个人的观点(1:丈夫 - 妻子,2:妻子 - 丈夫) 第二种方法的优点是快速搜索如此快速地呈现例如布局,但是当数据改变和可能的错误时具有更多写入的更大表。 我会采用第一种方法并使用一些索引来更快地进行搜索。

因此,只需最少的连接即可写出以下系列

grandfather louis(id1) 
  x grandmother clothild(id2)
    father francois(id3) 
      x mother diana(id4)
        me peter(id5) 
          x my first wife fabienne(id6)
            my son laurent(id9)
          x my second wife jane(id7)
            my son tristan(id10)
        my brother hans(id8)

as

1x2
3x4
5x6
5x7
1>3
2>3
3>5
4>5
3>8
4>8
6>9
5>9
5>10
7>10

or shorter

1x2>3
3x4>5
3x4>8
5x6>9
5x7>10

So in a databasetable this gives

id_partner1 id_partner2 id_child
1           2           3
3           4           5
3           4           8
5           6           9
5           7           10

答案 2 :(得分:1)

你可以拥有这样的架构

Family( Parent_name, Child_name )。 “元组”(Parent_name, Child_name)是您表格的关键。假设您的家谱中没有重复的(Parent_name, Child_name)。如果您有Social Security Number之类的内容来唯一标识家谱中的某个人,那么您应该Parent_ssn, Child_ssn而不是名称,并且有一个单独的表来存储ssn和{{之间的关系1}},其关键字为name

此表中的项目可以是

ssn

希望这有帮助