在关系数据库中实现BFS

时间:2018-06-18 10:26:28

标签: java mysql sql nosql

我需要使用必须存储在某处的三元树结构(我选择了关系数据库,但我仍然可以更改它)。

我的数据库树看起来像:

Tree example

例如,我的关系包含列 - Idchild1Idchild2Idchild3Idis_active

问题是我必须通过布尔参数提供BFS的能力。例如,在图片上应找到节点#35。 当然我知道如何用java中的现成数据实现BFS,但要做到这一点,我需要从DB接收整个树。 是否可以通过SQL查询来完成? 或者也许任何人都可以建议任何更好的解决方案,而不是将其存储在关系数据库中?

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用图形数据库代替关系数据库,正如注释中所建议的那样。 但是,如果可能仅使用关系数据库,则方法之一是向带有节点-depthposition_in_layer的表中添加其他字段。 depth = parent.depth+1positionInLayer = (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(添加索引)