我需要使用必须存储在某处的三元树结构(我选择了关系数据库,但我仍然可以更改它)。
我的数据库树看起来像:
例如,我的关系包含列 - Id
,child1Id
,child2Id
,child3Id
和is_active
问题是我必须通过布尔参数提供BFS的能力。例如,在图片上应找到节点#35。 当然我知道如何用java中的现成数据实现BFS,但要做到这一点,我需要从DB接收整个树。 是否可以通过SQL查询来完成? 或者也许任何人都可以建议任何更好的解决方案,而不是将其存储在关系数据库中?
答案 0 :(得分:0)
一种可能的解决方案是使用图形数据库代替关系数据库,正如注释中所建议的那样。
但是,如果可能仅使用关系数据库,则方法之一是向带有节点-depth
和position_in_layer
的表中添加其他字段。
depth = parent.depth+1
,positionInLayer = (parent.positionInLayer - 1) * 3 + childNum
,其中三叉树为3(对于二叉树为2),childnum-子级当前节点中的哪个。
例如,当我们在第5层的节点5中添加第2个子节点时,其深度为6,位置4 * 3 + 2 =14。这将是第6层中的第14个元素。
有了这样的字段,二进制搜索就可以像
select * from node where depth=i and is_active=0 order by position_in_layer asc limit 1
,其中i-层号(从1到SELECT MAX(depth) FROM node
)。
结果不错-通过BFS在具有约9800个节点的树中搜索最后一个元素仅进行了22 ms(添加索引)