2014-12-02 67 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

相关问题