簡體   English   中英

關系數據庫中BFS的實現

[英]Realization of BFS in relational databases

我需要使用必須存儲在某處的三叉樹結構(我選擇了關系數據庫,但是我仍然可以更改它)。

我的數據庫樹如下所示:

樹的例子

例如我的關系包含列Idchild1Idchild2Idchild3Idis_active

問題是我必須通過布爾參數提供BFS的功能。 例如,在圖片上應該找到Node#35。 當然,我知道如何用Java中的就緒數據來實現BFS,但是要做到這一點,我需要從DB接收整個樹。 是否可以通過SQL查詢來做到這一點? 也許有人可以提出比將其存儲在關系數據庫中更好的解決方案?

可能的解決方案之一是使用圖形數據庫代替關系數據庫,正如注釋中所建議的那樣。 但是,如果它是可以僅使用關系數據庫,其中一個方法是增加額外的字段,以表的節點- depthposition_in_layer .. depth = parent.depth+1positionInLayer = (parent.positionInLayer - 1) * 3 + childNum ,其中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 )。 效果不錯-在大約9800個節點中通過BFS搜索樹中的最后一個元素僅進行了22 ms(添加了索引)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM