我有一棵家谱.我想将它存储在一个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,并yourwife为son1和son2我在其他的解决办法做了.但是,这种解决方案可能在速度方面的效率较低,因为将需要更多的连接.
你可以有这样的模式
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)
希望这可以帮助