這是一個很好的問題,但沒有很多細節,很難談論「最佳」解決方案。
您可以將其映射到關於如何在關係數據庫中存儲n元樹的抽象問題。
這裏有一些影響問題的變量:
- 什麼是目錄結構的總大小?
- 多少獨立的虛擬機執行寫入操作結構?
- 移動操作是否頻繁?
- 是斷層整個樹的一個重要的操作呢?
- 您的數據庫是否支持樹狀漫步,還是您需要一個可以與任何合理的關係數據庫一起使用的解決方案?
以下假定數據庫不具有執行樹走的特別規定。
n-ary樹有兩種純粹的持久性模型。
首先是簡單地寫在每個節點與父參考:
| NodeId | ParentId | Name | ....
|--------|----------|------------|-----
這種方法簡化文件夾的移動,但刪除,對於所有的嵌套的子查詢,並找到根變得昂貴。
第二純水模型是堅持從文件夾中的每個細節祖先關係的單獨
| NodeId | Name | ....
|--------|----------|------
...
| NodeId | AncestorId | Distance |
|--------|------------|----------|
...
在這裏,文件夾/食品/乳製品/奶酪/切達會產生
| NodeId | Name |
|--------|----------|
| #0 | (root) |
| #1 | food |
| #2 | dairy |
| #3 | cheese |
| #4 | cheddar |
| NodeId | AncestorId | Distance |
|--------|------------|----------|
| #1 | #0 | 1 |
| #2 | #0 | 2 |
| #2 | #1 | 1 |
| #3 | #0 | 3 |
| #3 | #1 | 2 |
| #3 | #2 | 1 |
| #4 | #0 | 4 |
| #4 | #1 | 3 |
| #4 | #2 | 2 |
| #4 | #3 | 1 |
這種方法是用於移動非常昂貴,並且一個新的目錄導致d
插入,其中d
是從根的距離。但是,子樹列表是單個查詢。祖先路徑也是一個單一的查詢;一個order by Distance desc
將讓你快速到達根目錄和第一個文件夾。
但狹義閱讀您的問題,第一種方法的變體,簡單地增加根以及可能是你正確的方法:
| NodeId | ParentId | RootId | Name | ....
|--------|----------|--------|------------|-----
注意,移動文件夾將是昂貴的,因爲你需要確定所有嵌套的子文件夾,並更新所有這些記錄的RootId。
你是什麼意思,從葉,快速訪問根? *根目錄或該文件夾的包含文件夾?無論如何,看起來像一個普通的parent_id機制是可行的,但不知道你在做什麼樣的操作,很難說如何高效。 –
你覺得它需要多快?既然你提到jQuery,它聽起來像一個網絡應用程序。網絡速度會使基於索引ID的數據庫查找變矮。 –