【问题标题】:Data structures in python: maintaining filesystem structure within a databasepython中的数据结构:在数据库中维护文件系统结构
【发布时间】:2012-07-19 05:50:44
【问题描述】:

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

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

【问题讨论】:

  • 在服务器上压缩目录再解压不可行吗?然后客户端上的文件系统结构将被传输到服务器端的文件系统结构。毕竟,文件系统是文件的数据库。
  • 嗯,不,因为我不想传输文件数据本身,只是传输文件系统结构。我只需要从服务器以树状布局查看文件系统结构。我不希望将实际文件数据存储在服务器上。

标签: python database data-structures filesystems


【解决方案1】:

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

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

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

到目前为止,文件都以扁平结构的形式存储在(就像物理磁盘和关系数据库一样)。

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

【讨论】:

  • 谢谢,我会进一步调查。
【解决方案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")]

然后,要获取“文档和设置”中的目录,请发出另一个查询:

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

等等。简单!

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

由于您使用的是 Python,因此您必须使用 ORM,您不会手动构建这些查询,对吧? SQLAlchemy 能够对self-referential relations 建模,包括通过单个查询将树“急切地加载”到一定深度。

【讨论】:

  • 是的,我正在使用 Django ORM。好资料,谢谢。这让我有一些额外的阅读要做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2012-07-06
  • 2012-09-02
相关资源
最近更新 更多