在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(“/ “)) - 在文件名之前。 - 我们重命名的文件夹/节点文件夹的所有子节点。
希望所有这些都能让你对我想要达到的目标有一个更清晰的认识。 :)
我现在试着更好地解释它,所以它会更容易理解确切的问题。谢谢,但我真的需要在数据库中保留每个文件夹/文件的节点,以便可以将元数据关联到这些文件系统资源。所有重新排序,创建,删除,编辑,重命名等都在节点(不是文件,而是作为文件/文件夹的数据库表示的节点)上进行处理,在同一事务中该节点必须处理相应的文件系统项目。层次结构在树中建模,反映在文件系统中。 – Dac0d3r 2014-12-02 20:58:16
我不确定我是否完全理解了您的答案,因为我已阅读并重读了很多次。但绝对是db tree/node结构是我将直接操作的地方(这是我正在开发的CMS)。你介意详细介绍一下吗?关于Go标签,我刚刚添加了它,因为我需要绝望地解决这个问题,并且我想也许有人可能会有一些要点或代码段,这将帮助我提出一个临时解决方案。 (如果我很幸运):)非常感谢! – Dac0d3r 2014-12-02 21:01:26