树型结构数据的存储,我这个方案靠谱么?

2017-06-22 10:18:14 +08:00
 1iuh

项目中要存储一个树形结构。之前采用的是每条数据带一个 parent_id 这种邻接表的方案。

然而这个方案查询所有下级节点的时候,需要迭代查询,所以效率非常低,所以考虑优化。

一番 google 之后,选择了 Closure Table 闭包表的方案,这个方案查询所有上级节点或所有下级节点的效率都非常高。但是这个方案在序列化数据的时候依然很麻烦。

前端要求组织的数据格式如下: { "id": "1", "name": "root", "children": [ { "id": "2", "name": "aaa", "children": [] } ] }

现在序列化采取的方案是:

  1. 取出所有下级节点数据。
  2. 查询出所有节点的上级节点,放入节点数据中。
  3. 依据每个节点的上级节点,组织数据。(耗时较多,代码如下(省略了数据库查询部分))
def insertNode(result, node, query_result):
    node_id = node['id']
    parent_id = node['parent']
    if findNode(result, node_id) is None:
        parent = findNode(result, parent_id)
        if parent is None:
            result = insertNode(result, query_result[parent_id], query_result)
            parent = findNode(result, parent_id)
        parent['children'].append(node)
    return result


def findNode(result, node_id):
    if result.get('id', None) == node_id:
        return result
    else:
        for node in result.get('children', []):
            target = findNode(node, node_id)
            if target is not None:
                return target
        return None


if __name__ == '__main__':
    result = {}
    for node in nodes:
    	result = insertNode(result, node, query_result)
    print(json.dumps(result))
    	

总之,我就想问下各位大佬,这个方案靠谱么?

如果靠谱,还有什么地方可以优化?

如果不靠谱,我应该怎么做?

1580 次点击
所在节点    问与答
2 条回复
1iuh
2017-06-22 16:45:50 +08:00
6 小时惨案~ 没有大佬指点一下么?
HanSonJ
2017-08-02 01:01:38 +08:00
但看文字没看出跟原本的递归有何差别

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/370238

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX