我需要使用三元树的结构,它必须存储在某个地方(我选择了关系数据库,但我仍然可以更改它)。
我的数据库树看起来像:
例如,我的关系包含列- Id
, child1Id
, child2Id
, child3Id
以及 is_active
问题是我必须通过布尔参数提供bfs的能力。例如,应在图片节点#35上找到。当然,我知道如何在java中用ready data实现bfs,但要做到这一点,我需要从db接收整个树。是否可以通过sql查询来完成?或者任何人都可以提出比将其存储在关系数据库上更好的解决方案?
1条答案
按热度按时间zqdjd7g91#
一种可能的解决方案是使用图形数据库而不是关系数据库,正如在注解中所建议的那样。但如果可以只使用关系数据库,其中一种方法是向带有节点的表中添加其他字段-
depth
以及position_in_layer
..depth = parent.depth+1
,positionInLayer = (parent.positionInLayer - 1) * 3 + childNum
,其中3表示三叉树(对于二进制树,它将是2),childnum-childs当前节点是哪个。例如,当我们将第二个子节点添加到第五层的节点5时,它的深度为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毫秒(添加索引)