将文件夹/文件节点的PostgreSQL媒体树同步到文件系统路径

时间:2014-12-02 20:37:21

标签: sql postgresql tree synchronization filesystems

在PostgreSQL中,我实现了一个物化路径树(ltree),其中每个节点除路径外还有一个额外的parent_id列。

这些节点可以与自定义内容类型相关联,例如。文件夹和图片。

所有这些文件的主目录是./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或foldername(在文件系统中)

如果PostgreSQL只相当于MSSQL的FILESTREAM,或者如果实现了DATALINK,那么我的问题可能会得到解决,但我需要的功能与这些功能相同。

所以我的问题是......我的节点结构和文件结构应始终保持同步。但是我可以假设所有文件和文件夹的重命名和移动都是通过我的GUI完成的,而不是直接在文件系统中完成。

这意味着每当我重命名时,例如。数据库中的父 - 父文件夹节点,子 - 子图像节点的元 - > url还必须反映这个新的父文件夹名称(当然文件系统也必须更改),所以我想我需要提出一个不同的解决方案,而不是保存对列中的文件(文件系统路径)的引用节点。

当然,如果我重命名节点(图像节点)本身,我可以轻松地更改url以指向新名称,并在golang模型中的db事务期间重命名图像.jpg文件(node name = filename is我的约定,以及节点层次结构=文件夹层次结构)。问题是当我更改父节点时,例如。 parent(或parent-parent -...)文件夹 - 因为我将子节点上的整个url存储到该图像文件,并且路径现在已经更改。

当路径发生变化时,一个好的解决方案会触发吗?我希望有更好的方法。

现在还有哪些其他方法,因为PostgreSQL没有FILESTREAM和DATA LINK数据类型来帮助保持我的文件系统db节点/树与我的媒体文件系统/目录结构保持同步?

聚苯乙烯。 因为我猜Postgres没有这方面的聪明解决方案,如果你以某种方式从应用程序本身有一些编码方式,或许可以提及我在Go(Golang)中进行编码可能是相关的。

到目前为止的思考和伪代码:


1)考虑映射到此文件系统的树

Tree,DB:

  • 示例图片文件夹(node.name)
    • image.jpg(node.name)

文件系统:

  • / media / sample image folder
  • / media / sample image folder / image.jpg

2)首先我们重命名"样本图像文件夹" node.name to"重命名图像文件夹" (当然,它是相应的内容记录&meta-> url to" / media / renamed image folder"来自CMS GUI。

3)重命名父文件夹node.name列和内容记录meta-> url时,在同一事务中重命名文件系统中的相应文件夹

4)稍后在同一事务中按节点路径(ltree,物化路径)选择所有子项

5)通过引用node.id和content.node_id,更新相应的内容记录的meta->" url" (文件系统引用)substring(0,lastindexof(" /")) - 在文件名之前。 - 对于我们重命名的文件夹/ node-folder的所有子节点。

希望这一切能让您更清楚地了解我想要实现的目标。 :)

1 个答案:

答案 0 :(得分:1)

很难理解你写的是什么。但是对于我得到的,我认为你不需要一个数据库来保持文件系统的变化。文件系统 IS 数据库。现在你可以用数据库做的事情就是拥有"虚拟"指向文件系统路径的路径。但此时您不需要在文件系统中移动文件,只能使其数据库表示一致。

node_id int
virtual_path string
physical_path string
virtual_attributes
physical_attributes

希望它有所帮助。 P.s这不是go问题