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

时间:2012-07-19 05:50:45

标签: python database data-structures filesystems

我遇到了数据组织问题。我正在开发一个客户端/服务器项目,其中服务器必须在驻留在服务器上的数据库内维护客户端文件系统结构的副本。我们的想法是在AJAX-ified Web界面中显示服务器端的文件系统内容。现在我只是将文件列表上传到数据库,顺序转储文件。问题是如何在数据库中重新获取服务器端的文件系统结构。通过迭代大量文件来重建服务器端的父 - >子结构似乎是不可行的。但是,当文件对象没有相互引用时,这似乎是唯一的选择。

我不完全确定如何处理这个问题。就像我所知,我需要在服务器端复制某种类型的文件系统数据结构(在Btree中也许?),对象保持指向其父项和/​​或子项的指针。我想知道是否有人有过他们可以分享的类似过去​​的经历,或者可能是一些有用的资源来指出我正确的方向。

2 个答案:

答案 0 :(得分:2)

我建议遵循Unix方式。每个文件都被视为一个字节流,仅此而已。每个文件在技术上由称为 i-node (索引节点)的单个结构表示,该结构保留与数据的物理流(包括属性,所有权......)相关的所有信息。

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

返回文件。这种方式由唯一编号表示。对于数据库表示,该数字将是唯一键。如果需要其他i节点信息(文件属性),可以将其他列添加到表中。一列将是blob类型,它将表示文件的内容(字节流)。对于AJAX,我猜想文件会相当小;所以,你不应该对blob的大小限制有问题。

到目前为止,文件存储在中作为扁平结构(与物理磁盘一样,并且作为关系数据库)。

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

答案 1 :(得分:2)

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

基本上,第一种方法处理具有idparent_idname属性的“节点”。因此,要选择根级目录,您可以执行类似

的操作
SELECT id, name from mytable WHERE parent_id IS NULL AND kind="directory";

让我们假设你回来

[(1, "Documents and Settings"), (2, "Program Files"), (3, "Windows")]

然后,要获取“Documents and Settings”中的目录,请发出另一个查询:

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

等等。简单!

MPTT有点棘手,但你会找到一个很好的教程,例如,in Wikipedia。这种方法对于诸如“查找给定节点的所有子节点”,“此目录中包含子目录的文件数量”等查询非常有效,并且当树更改时效率较低,因为您需要重新排序所有节点。

由于你正在使用Python,你必须使用ORM,你不打算手动构建这些查询,对吧? SQLAlchemy能够对self-referential relations建模,包括使用单个查询“急切地”加载树到一定深度。