我有一个非常基本的家族树结构,但我需要弄清楚如何让它支持多个伙伴和兄弟姐妹而没有那么多的冗余。
整棵树的基础是创建树的人。
考虑这个非常简单的结构:
x
这很好用但是如果我发现我有一个名叫朱迪的半兄弟(成吉思汗喜欢女士们)和一个名叫布莱恩的全兄妹并将其扩展到这个怎么办?
{
"name": "Me",
"dob": "1988",
"parents": [
{
"name": "Gina Carano",
"dob": "1967"
},
{
"name": "Genghis Khan",
"dob": "1961"
}
],
"children": [
{
"name": "Tim",
"dob": "1992"
}
]
}
这确实映射了我的2个新发现的兄弟姐妹,但现在我的数据有一些冗余,因为成吉思汗在3个不同的地方。我可以创建一个单级列表,例如:
{
"name": "Me",
"dob": "1988",
"parents": [
{
"name": "Gina Carano",
"dob": "1967"
},
{
"name": "Genghis Khan",
"dob": "1961"
}
],
"children": [
{
"name": "Tim",
"dob": "1992"
}
],
"siblings": [
{
"name": "Judy",
"dob": "1987",
"parents": [
{
"name": "Courtney Carano",
"dob": "1965"
},
{
"name": "Genghis Khan",
"dob": "1961"
}
]
},
{
"name": "Brian",
"dob": "1988",
"parents": [
{
"name": "Gina Carano",
"dob": "1967"
},
{
"name": "Genghis Khan",
"dob": "1961"
}
]
}
]
}
如果没有冗余,这会以同样的方式运作吗?是否存在任何可预见的情况,在与儿童制定多个合作伙伴方面会有任何限制?
注意:我想如果我保留初始结构,我必须添加id键以正确识别Genghis Khan在所有3个实例中是相同的。
我的最终目标是绘制视觉上将在this manner中的谱系树(可能在d3.js中),在合作伙伴中间有一条线路传给他们的孩子。
所以使用上面的数据集,我正在尝试渲染:
答案 0 :(得分:2)
几乎所有家谱系统都有人的身份证,所以我不担心增加/要求。
传统的方法是使用Family节点类型和Person节点类型。这允许多个婚姻,并为您提供一个连接结婚日期,婚姻地点等信息的地方。
person[
{ "id": "p1", "name": "Me", "dob": "1988", "parents": "f3" },
{ "id": "p2", "name": "Genghis Khan", "dob": "1961", "parents": "f1", "spouse_families": ["f2", "f3"] },
{ "id": "p3", "name": "Gina Carano", "dob": "1967", "spouse_families" : ["f3"] },
{ "id": "p4", "name": "Brian", "dob": "1992", "parents" : "f3" },
{ "id": "p5", "name": "Judy", "dob": "1987", "parents": "f2" },
{ "id": "p6", "name": "Courtney Carano", "dob": "1965", "spouse_families": ["f2"] },
{"id": "p7", "name": "Mother of Ghengis"},
{"id": "p8", "name": "Father of Ghengis"},
]
family[
{"id":"f1","marriage date":"", "parents": ["p7", "p8"],"children":["p2"]},
{"id":"f2","marriage date":"", "parents": ["p6", "p2"],"children":["p5"]},
{"id":"f3","marriage date":"", "parents": ["p3","p2"],"children":["p1", "p4"]},
]
这为您提供了一个连接所有父母和孩子的地方,没有冗余和许多特殊的外壳。 (注意:我在数据结构中将“Tim”更正为“Brian”以匹配图形。)