2014-12-02 58 views
0

在PostgreSQL中,我已經實現了一個物化路徑樹(ltree),其中每個節點除了路徑之外還有一個額外的parent_id列。將文件夾/文件節點的PostgreSQL媒體樹同步到文件系統路徑

這些節點可以與自定義內容類型相關聯,例如,文件夾和圖像。

所有這些文件的主目錄是./media

所以現在我保存在數據庫中的URL文件系統基準,如:

tbl_node: 

id bigint 
name character varying 
path ltree (eg. 'nodeid.nodeid.nodeid.etc') 
parent_id bigint 
node_type int (document, media, template, etc) 

tbl_content: 

id bigint 
node_id bigint 
meta json (eg. {alt:"alt text here", caption: "etc", url:"/media/folder/(subfolders)/../image.jpg"}) 

tab_node.name = filename.filetype或文件夾名(在文件系統中)

如果PostgreSQL剛剛具有與MSSQL的FILESTREAM等效的功能,或者實現了DATALINK,那麼我的問題可能會得到解決,但我需要的功能與這些功能相同。

所以我的問題是...我的節點結構和文件結構應該始終保持同步。不過,我可以假設所有重命名和移動文件和文件夾都是通過我的GUI完成的,而不是直接在文件系統中完成。

這意味着每當我重命名例如。數據庫中的父 - 母文件夾節點,子 - 子圖像節點的meta - > url也必須反映這個新的父文件夾名稱(當然文件系統也必須改變),所以我想我需要拿出一個不同的解決方案,而不是在節點內的列中保存對文件(文件系統路徑)的引用。

當然,如果我重命名節點(圖像節點)本身,我可以輕鬆地將url更改爲指向新名稱,並在我的golang模型中的db事務中重命名圖像.jpg文件(node name = filename是我的約定,以及節點層次結構=文件夾層次結構)。問題是當我改變一個父節點例如。父母(或父母 - 父母-...)文件夾 - 因爲我將整個URL存儲在該子圖節點的子節點上,現在路徑已經改變。

當路徑變化時,會觸發一個觸發器嗎?我希望有更好的辦法。

還有什麼其他方法,既然PostgreSQL沒有FILESTREAM和DATA LINK數據類型來幫助保持我的文件系統數據庫節點/樹與我的媒體文件系統/目錄結構同步?

Ps。 因爲我猜Postgres對此沒有一個聰明的解決方案,也許它可能與Go(Golang)中的編碼有關,如果你以某種方式從應用程序本身有某種編碼方式。

思想,至今僞代碼:


1)考慮這棵樹,它映射到該文件系統

樹,DB:

  • 樣本圖像文件夾(節點。名稱)
    • image.jpg(node。名)

文件系統:

  • /媒體/樣本圖像文件夾
  • /媒體/樣本圖像文件夾/ image.jpg的

2)首先,我們重新命名「sample image folder」node.name改爲「重命名的圖像文件夾」(當然,它是來自CMS GUI的「/ media/renamed image folder」的相應內容記錄的meta-> url。

3)當重命名父文件夾node.name柱和內容記錄間 - >的URL,在同一事務中重命名相應的文件夾在文件系統

4)以後在同一交易選擇所有由子節點路徑(ltree,物化路徑)

5)通過在node.id和content.node_id上​​引用,更新相應的內容記錄的meta - >「url」(文件系統引用)substring(0,lastindexof(「/ 「)) - 在文件名之前。 - 我們重命名的文件夾/節點文件夾的所有子節點。

希望所有這些都能讓你對我想要達到的目標有一個更清晰的認識。 :)

回答

1

很難理解你寫的東西。但對於我所得到的,我不認爲你需要一個數據庫來保持文件系統的變化。文件系統IS數據庫。現在你可以用數據庫做的事情是讓「虛擬」路徑指向文件系統路徑。但是在那個時候,你不需要在文件系統中移動文件,只需要使它的數據庫表示一致。

node_id int 
virtual_path string 
physical_path string 
virtual_attributes 
physical_attributes 

希望它有幫助。 P.s這不是go問題

+0

我現在試着更好地解釋它,所以它會更容易理解確切的問題。謝謝,但我真的需要在數據庫中保留每個文件夾/文件的節點,以便可以將元數據關聯到這些文件系統資源。所有重新排序,創建,刪除,編輯,重命名等都在節點(不是文件,而是作爲文件/文件夾的數據庫表示的節點)上進行處理,在同一事務中該節點必須處理相應的文件系統項目。層次結構在樹中建模,反映在文件系統中。 – Dac0d3r 2014-12-02 20:58:16

+0

我不確定我是否完全理解了您的答案,因爲我已閱讀並重讀了很多次。但絕對是db tree/node結構是我將直接操作的地方(這是我正在開發的CMS)。你介意詳細介紹一下嗎?關於Go標籤,我剛剛添加了它,因爲我需要絕望地解決這個問題,並且我想也許有人可能會有一些要點或代碼段,這將幫助我提出一個臨時解決方案。 (如果我很幸運):)非常感謝! – Dac0d3r 2014-12-02 21:01:26