我有一棵家谱。我想将它存储在一个mysql数据库中。我有一张名为“家庭成员”的专栏,但我不知道如何安排这些家庭成员。例如,我在我的父亲之下,而我的儿子在我之下。所以我想,我怎样才能将这种类型的树存储在数据库中?
答案 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 |
+--------+---------------------+
数据更加规范化,因为您不会像我在其他解决方案中那样重复信息(例如you
和yourwife
son1
和son2
。但是,这种解决方案在速度方面可能效率较低,因为需要更多的连接。
答案 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
希望这有帮助