python中的数据结构:在数据库中维护文件系统结构

python中的数据结构:在数据库中维护文件系统结构,python,database,data-structures,filesystems,Python,Database,Data Structures,Filesystems,我有一个数据组织问题。我正在从事一个客户机/服务器项目,其中服务器必须在驻留在服务器上的数据库中维护客户机文件系统结构的副本。其思想是在服务器端的AJAX web界面中显示文件系统内容。现在我只是简单地将文件列表上传到数据库中,在那里文件按顺序转储。问题是一旦文件系统结构进入数据库,如何在服务器端重新捕获它们。在服务器端通过遍历大量文件列表来重建父->子结构似乎是不可行的。但是,当文件对象彼此没有引用时,这似乎是唯一的选择 我不完全确定如何处理这件事。据我所知,我需要在服务器端复制某种类型的文件

我有一个数据组织问题。我正在从事一个客户机/服务器项目,其中服务器必须在驻留在服务器上的数据库中维护客户机文件系统结构的副本。其思想是在服务器端的AJAX web界面中显示文件系统内容。现在我只是简单地将文件列表上传到数据库中,在那里文件按顺序转储。问题是一旦文件系统结构进入数据库,如何在服务器端重新捕获它们。在服务器端通过遍历大量文件列表来重建父->子结构似乎是不可行的。但是,当文件对象彼此没有引用时,这似乎是唯一的选择


我不完全确定如何处理这件事。据我所知,我需要在服务器端复制某种类型的文件系统数据结构(可能在Btree中?),对象维护指向其父级和/或子级的指针。我想知道是否有人曾经有过类似的经验可以分享,或者有一些有用的资源可以为我指明正确的方向。

我建议遵循Unix的方式。每个文件都被视为一个字节流,不多不少。从技术上讲,每个文件都由一个名为i-node(索引节点)的结构表示,该结构保存与数据的物理流(包括属性、所有权等)相关的所有信息

i节点不包含任何关于可读名称的内容。每个i节点都有一个唯一的编号(永久编号),该编号作为文件的技术名称。您可以使用类似的数字为数据库中的字节流提供其唯一标识。i节点存储在磁盘上的一个单独的连续部分中——请考虑i节点结构的数组(抽象意义上)或数据库中的单独表

回到文件。这样,它由唯一的数字表示。对于数据库表示,数字将是唯一的键。如果需要其他i节点信息(文件属性),可以将其他列添加到表中。一列将是blob类型,它将表示文件的内容(字节流)。对于AJAX,我认为文件将非常小;因此,您不应该对blob的大小限制有任何问题

到目前为止,文件以平面结构存储在中(物理磁盘和关系数据库都是这样)

目录名的结构和文件的文件名分别保存在另一个文件中(与其他文件一起保存在相同的结构中,也由它们的i节点表示)。基本上,目录文件捕获元组
(裸名称,i节点编号)
。(通过这种方式,硬链接在Unix中实现——两个名称与相同的i-none编号配对。)根目录文件必须有一个固定的技术标识——即保留的i-node编号。

如果“数据库”是指SQL数据库,那么您要寻找的神奇词汇是“自引用表”,或者“修改的预排序树遍历”(MPTT)

基本上,第一种方法处理具有
id
parent\u id
name
属性的“节点”

SELECT id, name from mytable WHERE parent_id IS NULL AND kind="directory";
让我们假设你得到了回报

[(1, "Documents and Settings"), (2, "Program Files"), (3, "Windows")]
然后,要获取“文档和设置”中的目录,您需要发出另一个查询:

SELECT id, name from mytable WHERE parent_id=1 AND kind="directory";
等等,简单

MPTT有点复杂,但您会发现一个很好的教程,例如。这种方法对于“查找给定节点的所有子节点”、“此目录中有多少文件,包括子目录”等查询非常有效,而当树发生变化时,效率较低,因为您需要对所有节点重新排序


因为您使用的是Python,所以必须使用ORM,您不会手动构建这些查询,对吧?SQLAlchemy能够建模,包括“急切地加载”“只需一次查询即可将目录树提升到一定深度。

压缩目录并在服务器上解压缩是否可行?然后,客户机上的文件系统结构将被传输到服务器端的文件系统结构。毕竟,文件系统是一个文件数据库。不,因为我不想传输文件数据本身,只想传输文件系统结构。我只需要文件系统结构就可以从服务器以树状布局查看。我不希望实际的文件数据存储在服务器上。是的,我正在使用Django ORM。好消息,谢谢。这给了我一些额外的阅读。谢谢,我会进一步研究。