json数据,如何找到一个键值对的族谱路径?【有关树形结构设计】
发布于 7 年前 作者 JarvisQJ 4731 次浏览 来自 问答

如果想将树形结构设计为如下形式的文档: { “name”: “A”, “children”: [ {“name”: “B”, “children”: [{“name”: “D”}]}, {“name”: “C”} ] } 如何找到D的族谱路径?也就是如何通过D,找到A和B?

12 回复

那你要在每一个子节点上有一个指向父节点的引用,但是这东西完全靠你自己维护,另外如果一个子节点被多个父节点引用要如何处理?所以结论是比较难。 回头再来说说你实现这个东西的目的是什么?要解决什么问题?

实在想要快的话,存储的时候就存好。当然每次修改也要改了…

数据结构设计的时候尽量不要设计成树性结构,因为后期增删改查都很麻烦。 最好设计成跟数据库中的结构类似,

比如,你的这个问题,完全可以把

{
“name”: “A”,
“children”: [
{“name”: “B”, “children”: [{“name”: “D”}]},
{“name”: “C”}
]
}

设计成:

pid   id
A     B
B     D
A     C

这样的好处是,数据库通常都是二维表,这样的数据结构和数据库存储形态是一致的,而且也便于双向查找。

@stonephp @vincentLiuxiang 实在是需求本身就是树形结构,而且比一般的树形结构要求更多

我目前能想到的解决办法是:设计成每个节点都存父节点ID的形式,需要使用嵌入结构形式的时候,就自己写方法,转化

另外,删除一个商品分类,属于该分类的商品作何处理?

@qujinxiong 这其实是个需求问题。有一下几种选择

  1. 禁止删除包含商品的分类,提醒用户先手动调整下面的商品
  2. 删除分类以后系统自动将下面的商品转移到其他分类下,或者设置为默认分类

@qujinxiong 我还是挺怀疑你这个需求的?你要已经找到解决方案那就算了,如果你还有疑问,可以联系我,我帮你分析分析问题 号码: 15911016875

@qujinxiong 维护树结构2种方式,各有优势,你可以参考mongo的文档

1、维护路径 你的例子的四个节点可以写成

{path:"/A",data:“i am A”} {path:"/A/B",data:“i am B”} {path:"/A/B/D",data:“i am D”} {path:"/A/C",data:“i am C”}

这种可以通过路径字符串解析很方便的知道一个节点的上级。 也可以通过正则匹配知道一个节点的所有直接子节点 也可以通过前缀匹配,知道一个节点的所有子孙节点。。

2、维护父节点或者子节点的引用,这个如楼上描述

@stonephp 暂时打算用你楼下的方法,有搞不定的到时候真的打你电话啊

@AnzerWall 打算采用维护路径的方式

回到顶部