2012-07-19 82 views
2

我有一個數據組織問題。我正在開發一個客戶端/服務器項目,其中服務器必須在駐留在服務器上的數據庫中維護客戶端文件系統結構的副本。這個想法是在一個AJAX網頁界面中顯示服務器端的文件系統內容。現在我只是簡單地上傳文件列表到數據庫,然後依次轉儲文件。問題是如何在數據庫中重新捕獲服務器端的文件系統結構。通過迭代大量文件來重建服務器端的父 - >子結構似乎不可行。但是,當文件對象沒有彼此的引用時,這似乎是唯一的選擇。python中的數據結構:維護數據庫中的文件系統結構

我不完全確定如何處理這個問題。據我所知,我需要在服務器端複製某種類型的文件系統數據結構(在Btree中可能是?),同時維護指向其父母和/或孩子的對象。我想知道是否有人有過類似的經歷可以分享,或者可能有一些有用的資源讓我指向正確的方向。

+0

壓縮目錄並將其解壓縮到服務器上是不可行的嗎?然後,客戶端上的文件系統結構將被傳輸到服務器端的文件系統結構。畢竟,文件系統是文件的數據庫。 – 2012-07-19 06:10:37

+0

嗯,不,因爲我不想傳輸文件數據本身,只是文件系統結構。我只需要文件系統結構可以從服務器以樹形佈局查看。我不希望存儲在服務器上的實際文件數據。 – blindsnowmobile 2012-07-19 06:24:25

回答

1

我建議遵循Unix方式。每個文件都被認爲是一個字節流,沒有什麼更多,沒有什麼不足。每個文件在技術上都由一個稱爲i-node(索引節點)的單一結構來表示,該結構保存與數據的物理流(包括屬性,所有權等)有關的所有信息。

i節點不包含關於可讀名稱的任何內容。每個i節點都被賦予一個唯一的數字(永遠),該數字代表文件的技術名稱。您可以使用相似的數字來爲數據庫中的字節流賦予其唯一標識。 i節點在磁盤上存儲在一個單獨的連續節中 - 考慮i節點結構數組(抽象意義上的)或數據庫中單獨的表。

回到文件。這種方式由唯一編號表示。對於您的數據庫表示,該數字將是唯一鍵。如果您需要其他i-node信息(文件屬性),則可以將其他列添加到表中。一列將是blob類型,它將表示文件的內容(字節流)。對於AJAX,我認爲這些文件會比較小;所以,你不應該對blob的大小限制有任何問題。

到目前爲止,文件被存儲在爲平坦結構(作爲物理磁盤,並且如關係數據庫是)。

目錄名稱和文件的文件名的結構分開存放,在另一文件(保持在相同的結構,與其它文件一起,也表示可以通過i節點)。基本上,目錄文件捕獲元組(bare_name, i-node number)。 (通過這種方式,硬鏈接在Unix中實現 - 兩個名稱與相同的i-none編號配對。)根目錄文件必須具有固定的技術標識 - 即保留的i節點編號。

+0

謝謝,我會進一步研究。 – blindsnowmobile 2012-07-19 14:26:00

1

如果「數據庫」你的意思是一個SQL數據庫,那麼你正在尋找神奇的詞是「自我參照表」,或者「修改預購樹的遍歷」(MPTT)

基本上,第一種方法爲「節點」,它有idparent_idname屬性的交易。所以,選擇根級目錄,你會做這樣的事情

SELECT id, name from mytable WHERE parent_id IS NULL AND kind="directory"; 

其假設回報你

[(1, "Documents and Settings"), (2, "Program Files"), (3, "Windows")] 

然後,得到的目錄裏面的「Documents and Settings」下發出另一個查詢:

SELECT id, name from mytable WHERE parent_id=1 AND kind="directory"; 

等等。簡單!

MPTT有點麻煩,但你會發現一個很好的教程,例如,in Wikipedia。這種方法對於「查找給定節點的所有子節點」,「包括子目錄在內的該目錄中有多少個文件」等查詢非常有效,而且當樹需要重新排序時,效率較低節點。

由於您使用Python,您必須使用ORM,您不會手動構建這些查詢,對嗎? SQLAlchemy能夠對self-referential relations進行建模,包括使用單個查詢「熱切」加載樹到特定深度。

+0

是的,我正在使用Django ORM。良好的信息,謝謝。這給了我一些額外的閱讀。 – blindsnowmobile 2012-07-19 14:24:49