2011-09-23 155 views
4

規劃在Java中構建基於文件夾的結構。構建文件夾結構的DataBase(datamodel)

我將爲GUI使用jquery插件,所以我不需要關於如何顯示文件夾結構的信息。

我正在尋找有關如何存儲文件夾信息的後端邏輯,以便可以快速高效地檢索它。

每個文件夾都有多個子文件夾。 從頁夾,我們應該能夠獲得迅速的根源,有效

例子:

+Folder1 
    |__SubFolder1_1 
    |__SubFolder1_2 
     |_SubSubFolder1_2_1 
     |_ 
+Folder2 
    |__SubFolder2_1 
     |_SubFolder2_1_1 
     |_SubFolder2_1_2 
      |_SubFolder2_1_2_1 

新文件夾可以隨意添加。 文件夾可以重命名。 文件夾可以被刪除。

我的問題是:

如何將這些文件夾的細節存儲在數據庫中?

同樣,我正在尋找一種快速高效的方式來存儲和檢索這些信息。

+0

你是什麼意思,從葉,快速訪問根? *根目錄或該文件夾的包含文件夾?無論如何,看起來像一個普通的parent_id機制是可行的,但不知道你在做什麼樣的操作,很難說如何高效。 –

+0

你覺得它需要多快?既然你提到jQuery,它聽起來像一個網絡應用程序。網絡速度會使基於索引ID的數據庫查找變矮。 –

回答

4

對於DB存儲,最簡單,最直接的方法是讓每個文件夾/節點parent_folder_id。在大多數情況下,這應該足夠好,特別是要構建文件夾對象結構並根據對象模型進行操作。

取決於你的需求,還有就是你需要

  1. 某些文件夾下找出所有子文件夾
  2. 直接從數據庫進行查找,通過SQL很常見的情況。

如果你在找什麼,再有一個,你可以看看有趣的方法: 每個DB記錄將有2個額外的數字領域,我們稱之爲左右

承擔樹是這樣的:

ROOT 
    + A 
    | + A1 
    | + A2 
    + B 
    + B1 

什麼將被存儲在DB是

Node LEFT RIGHT ... other fields 
ROOT 1 12 
A  2 7 
A1  3 4 
A2  5 6 
B  8 11 
B1  9 10 
  • 每個父節點具有左=第一孩子的LEFT - 1,和RIGHT =最後一個子的RIGHT + 1
  • 葉節點將具有左和右爲2個連續數
  • 每個節點的LEFT應該是=事先兄弟姐妹的RIGHT + 1,右=下一個兄弟的左 - 1

當你需要找到某個節點(N)的SQL下的所有節點,只需找出與左> N.LEFT所有節點和右< N.RIGHT

您可以輕鬆地進行插入/通過批量更新刪除的(不是一件困難的TAS相關節點k,給你:P)

這可能不是很OO友好,但如果我提到的要求是你所需要的,你可以考慮使用這種方法。

1

鏈表,它是Java API在這裏記載:

http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html

作爲一般的計算機科學結構,閱讀:

http://en.wikipedia.org/wiki/Linked_list

我希望它能幫助

+0

其實更像一棵樹,就像「目錄樹」。 –

+0

@DaveNewton謝謝你,但是我正在尋找如何在數據庫中存儲(數據模型)的信息,這樣我可以存儲/快速檢索數據的信息。 –

+0

@kensenjohn正確,而且「很快」取決於你試圖檢索的方式。 –

1

對於數據庫,請保持簡單。一個名爲folder的表 - 唯一的列是Id,Name,ParentId。現在每個文件夾都會有一個父文件夾,並且一些文件夾中會有孩子。要加載的孩子:

SELECT * FROM Folder WHERE Id == ParentFolderId 
6

這是一個很好的問題,但沒有很多細節,很難談論「最佳」解決方案。

您可以將其映射到關於如何在關係數據庫中存儲n元樹的抽象問題。

這裏有一些影響問題的變量:

  1. 什麼是目錄結構的總大小?
  2. 多少獨立的虛擬機執行寫入操作結構?
  3. 移動操作是否頻繁?
  4. 是斷層整個樹的一個重要的操作呢?
  5. 您的數據庫是否支持樹狀漫步,還是您需要一個可以與任何合理的關係數據庫一起使用的解決方案?

以下假定數據庫不具有執行樹走的特別規定。

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。

+0

謝謝,我將結合使用@AdrianShum提供的答案和答案。由於我將使用更多Adrian的答案,我會將他標記爲正確的答案 –