2012-07-25 72 views
0

我需要解決的問題是將相當於文件系統樹的數據存儲到數據庫中(以加速搜索操作)。該樹包含+400.000.000節點,並且對於每個需要存儲某些元信息的inode(平均文件路徑爲100個字節,元信息約爲50個字節)。一次
3.一次刪除〜20.000記錄
2. INSERT〜20.000記錄數據庫存儲一棵巨大的樹

以下操作將被製成,從C++程序:
1. SELECT(〜200.000與預期的結果)。到目前爲止,我只考慮關係數據庫:MySQL,MariaDB,PostgresSQL(迄今爲止我還沒有做過任何測試,我仍然處於「信息收集」階段),並且我閱讀了一些有關在這樣的存儲樹的文檔一個DB。

第一選項
- 鄰接表型號:表中每個項目包含一個指向它的父。
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

第二個選項
- 存儲所有目錄中的一個單獨的表
- 有一個單獨的表文件的其餘部分,並指出了它們屬於

的目錄,這樣的表會是這樣的:
DirTable:

/home 
/home/test/ 

的FileTable:

file1 
file2 

我的問題:
1.你知道適合在關係數據庫中存儲大樹另一種模式? 2.如果我要搜索NoSQL DB,我應該從哪裏開始?

非常感謝。

+0

你可以看看層次數據庫,如LDAP(OpenDS的,OpenDJ,OpenLDAP的)。你想優化什麼樣的搜索操作?例如。在樹中的任何位置搜索具有給定名稱的文件並搜索具有限於子樹的一組屬性的文件最好由略微不同的數據組織來服務。 – Joni 2012-07-25 13:02:35

+0

嗨,Joni。因爲我們要對每個操作的單個文件(來自子樹)進行大量搜索,所以我們認爲最好從內存中的子樹加載所有文件(假設有200,000個條目),儘可能減少內存佔用量,然後在內存中執行所有查找操作。否則(對每個文件單個選擇)將效率太低。 – 2012-07-25 14:57:25

回答

0

這聽起來像你最好的結構,可以給你一個單一的選擇整個子樹。有幾種方法可以實現這一點,每種方法都有其優點和缺點:

  • 在嵌套集中,您將兩列添加到表中:lft和rgt。節點的子樹的lft和rgt值在節點的lft和rgt值之間。此模型很容易查詢,但對樹的更改需要重寫整個樹的lft和rgt值,因此更新可能很昂貴。
  • 路徑枚舉將維護列中文件的絕對路徑。這個模型對於查詢也很簡單,但是隻能對路徑的固定長度前綴進行索引這一事實限制了可以高效搜索的樹的深度。
  • 對於閉包表,您可以添加一個新表,該錶針對系統上的每個目錄都保存包含在子樹某處的文件的ID。再一次,查詢很簡單,但是閉包表可以變得相當大,並且如果目錄被移動就必須更新。

這個幻燈片介紹了這些模型與圖表和示例代碼:http://www.slideshare.net/billkarwin/models-for-hierarchical-data