在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:
文件系统:
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的所有子节点。
希望这一切能让您更清楚地了解我想要实现的目标。 :)
答案 0 :(得分:1)
很难理解你写的是什么。但是对于我得到的,我认为你不需要一个数据库来保持文件系统的变化。文件系统 IS 数据库。现在你可以用数据库做的事情就是拥有"虚拟"指向文件系统路径的路径。但此时您不需要在文件系统中移动文件,只能使其数据库表示一致。
node_id int
virtual_path string
physical_path string
virtual_attributes
physical_attributes
希望它有所帮助。
P.s这不是go
问题