簡體   English   中英

如何使用Python遍歷存儲在SQL數據庫中的樹?

[英]How to traverse a tree stored in SQL database with Python?

我有一個使用實例化路徑(每行存儲路徑字符串)存儲在SQL中的根樹。

不每次都從根開始訪問每個節點節點的最佳方法是什么? 物化路徑是否適合我的方法?

Harry
├── Jane
│   ├── Mark
│   └── Diane
│       ├── Mary
│       └── George
│           └── Jill
└── Bill

我希望代碼首先從Harry開始,然后訪問Jane,Diane,George,Jill。 為了訪問瑪麗,需要從吉爾回到上一級,然后訪問瑪麗。 瑪麗沒有孩子,我們已經訪問了該級別的每個節點(喬治,瑪麗),因此我們回到了另一個級別來訪問Mark。 在該級別上沒有更多的孩子了,因此我們將上一級返回到Jane,但是在該級別上沒有其他節點,因此我們再次返回。 最后,我們只有Bill處於這個級別,然后拜訪他。 當訪問完所有節點后,我們就完成了。

我還考慮過將樹的每個級別存儲在單獨的表中,並將對這些表的引用存儲在另一個表中,但這似乎效率不高,因為我必須存儲當前遍歷的級別並處理該數據。

等級_0_表:哈里,比爾

級別_1_表:簡

Level_2_table:馬克,黛安

Level_3_table:瑪麗,喬治

Level_4_table:吉爾

我不確定“物化路徑”是否是最好的數據結構,因為它似乎是高度冗余的。 也許你想尋找鄰接表(即,存儲idparent_id每一個條目)或嵌套組(存儲idleftright的鄰居的ID)。 是對這兩種結構的很好概述。 您想要對樹執行深度優先搜索 (DFS)。 前一段時間, 該線程中已涵蓋了問題,因此您可能會發現它很有用。 有一種通過SQL查詢執行DFS的方法,但是實現方式可能取決於您使用的數據庫軟件。 無論如何,您都可以通過使用堆棧來存儲仍需要訪問的元素的ID來實現DFS。 每次訪問后,將節點的子級推入堆棧,然后繼續下一個彈出的元素。 這是一個很好的例子

暫無
暫無

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

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