项目中要存储一个树形结构。之前采用的是每条数据带一个 parent_id 这种邻接表的方案。
然而这个方案查询所有下级节点的时候,需要迭代查询,所以效率非常低,所以考虑优化。
一番 google 之后,选择了 Closure Table 闭包表的方案,这个方案查询所有上级节点或所有下级节点的效率都非常高。但是这个方案在序列化数据的时候依然很麻烦。
前端要求组织的数据格式如下: { "id": "1", "name": "root", "children": [ { "id": "2", "name": "aaa", "children": [] } ] }
现在序列化采取的方案是:
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))
总之,我就想问下各位大佬,这个方案靠谱么?
如果靠谱,还有什么地方可以优化?
如果不靠谱,我应该怎么做?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.